From f313219850d324b516748ff7b00a6f9fa30d34ae Mon Sep 17 00:00:00 2001 From: Michi Mutsuzaki Date: Mon, 6 Jan 2025 23:15:58 +0000 Subject: [PATCH] Prepare for v0.16.23 release Signed-off-by: Michi Mutsuzaki --- README.md | 2 +- RELEASE.md | 2 +- go.mod | 88 +- go.sum | 169 +- vendor/github.com/cilium/charts/README.md | 8 + .../cilium/charts/cilium-1.14.18.tgz | Bin 0 -> 166391 bytes .../cilium/charts/cilium-1.15.12.tgz | Bin 0 -> 180768 bytes .../cilium/charts/cilium-1.16.5.tgz | Bin 0 -> 205209 bytes .../cilium/charts/cilium-1.17.0-rc.0.tgz | Bin 0 -> 217262 bytes .../cilium/charts/generate_helm_release.sh | 2 +- vendor/github.com/cilium/charts/index.yaml | 479 +- .../cilium/charts/tetragon-1.3.0.tgz | Bin 0 -> 32933 bytes .../cilium/cilium/api/v1/flow/flow.pb.go | 559 +- .../api/v1/models/bgp_graceful_restart.go | 2 - .../cilium/api/v1/models/bgp_peer_families.go | 2 - .../cilium/api/v1/models/c_id_r_policy.go | 2 - .../api/v1/models/c_n_i_chaining_status.go | 2 - .../cilium/api/v1/models/clock_source.go | 2 - .../cilium/api/v1/models/endpoint_policy.go | 2 - .../cilium/api/v1/models/identity_range.go | 2 - .../cilium/api/v1/models/ip_v4_big_tcp.go | 2 - .../cilium/api/v1/models/ip_v6_big_tcp.go | 2 - .../api/v1/models/kube_proxy_replacement.go | 32 +- .../cilium/cilium/api/v1/models/l4_policy.go | 2 - .../cilium/api/v1/models/policy_rule.go | 2 - .../cilium/cilium/api/v1/models/routing.go | 2 - .../cilium/cilium/api/v1/models/srv6.go | 2 - .../api/v1/models/zz_generated.deepcopy.go | 442 - .../cilium/api/v1/observer/observer.pb.go | 210 +- .../api/v1/observer/observer_grpc.pb.go | 2 +- .../cilium/cilium/api/v1/relay/relay.pb.go | 13 +- .../cilium/cilium-cli/cli/connectivity.go | 1 + .../connectivity/builder/builder.go | 4 +- ...ient_egress_l7_tls_deny_without_headers.go | 2 +- .../builder/client_egress_l7_tls_headers.go | 4 +- .../builder/manifests/allow-all-egress.yaml | 1 + .../client-egress-to-cidr-external-deny.yaml | 4 +- .../client-egress-to-cidr-external-knp.yaml | 4 +- .../client-egress-to-cidr-external.yaml | 4 +- ...ent-egress-to-cidrgroup-external-deny.yaml | 2 +- .../builder/manifests/template/template.go | 8 + .../builder/node_to_node_encryption.go | 2 +- .../connectivity/builder/to_fqdns.go | 11 +- .../cilium-cli/connectivity/check/check.go | 1 + .../connectivity/check/deployment.go | 8 +- .../cilium-cli/connectivity/check/test.go | 19 + .../cilium-cli/connectivity/tests/errors.go | 32 +- .../cilium-cli/connectivity/tests/service.go | 8 + .../cilium-cli/connectivity/tests/to-cidr.go | 16 +- .../cilium-cli/connectivity/tests/world.go | 7 +- .../cilium/cilium-cli/defaults/defaults.go | 2 +- .../cilium/cilium/cilium-cli/install/aws.go | 70 - .../cilium/cilium/cilium-cli/install/helm.go | 11 +- .../cilium/cilium-cli/install/install.go | 10 - .../cilium-cli/utils/features/features.go | 22 +- .../cilium/pkg/bgpv1/agent/controller.go | 3 + .../cilium/cilium/pkg/bgpv1/types/bgp.go | 26 + .../cilium/pkg/bgpv1/types/fake_router.go | 14 +- .../pkg/datapath/linux/probes/probes.go | 2 - .../cilium/cilium/pkg/defaults/defaults.go | 7 +- .../cilium/cilium/pkg/envoy/resource/envoy.go | 10 + .../cilium/pkg/k8s/apis/cilium.io/register.go | 2 +- .../v2alpha1/bgp_node_override_types.go | 7 + .../v2alpha1/zz_generated.deepcopy.go | 5 + .../v2alpha1/zz_generated.deepequal.go | 8 + .../cilium/cilium/pkg/k8s/service_cache.go | 23 +- .../cilium/cilium/pkg/metrics/metrics.go | 16 + .../cilium/cilium/pkg/monitor/api/types.go | 23 +- .../cilium/cilium/pkg/node/bootid.go | 4 +- .../cilium/cilium/pkg/node/bootid_linux.go | 13 +- .../cilium/cilium/pkg/node/bootid_other.go | 9 + .../cilium/cilium/pkg/option/config.go | 44 +- .../cilium/pkg/policy/api/rule_validation.go | 324 +- .../cilium/cilium/pkg/policy/mapstate.go | 14 +- .../cilium/cilium/pkg/policy/repository.go | 16 +- .../cilium/cilium/pkg/policy/resolve.go | 12 + vendor/github.com/cilium/ebpf/Makefile | 1 - vendor/github.com/cilium/ebpf/README.md | 1 + vendor/github.com/cilium/ebpf/btf/format.go | 3 + vendor/github.com/cilium/ebpf/btf/types.go | 14 + vendor/github.com/cilium/ebpf/collection.go | 6 +- vendor/github.com/cilium/ebpf/elf_reader.go | 7 + .../github.com/cilium/ebpf/features/misc.go | 44 +- .../cilium/ebpf/internal/kconfig/kconfig.go | 19 +- .../github.com/cilium/ebpf/internal/math.go | 11 + .../github.com/cilium/ebpf/internal/sys/fd.go | 51 +- .../cilium/ebpf/internal/sys/types.go | 9 + vendor/github.com/cilium/ebpf/link/link.go | 11 +- vendor/github.com/cilium/ebpf/map.go | 22 +- vendor/github.com/cilium/ebpf/prog.go | 40 +- vendor/github.com/cilium/ebpf/types.go | 15 + vendor/github.com/cilium/hive/script/cmds.go | 120 +- .../github.com/cilium/hive/script/engine.go | 112 +- vendor/github.com/cilium/hive/script/state.go | 2 + .../go/envoy/config/cluster/v3/cluster.pb.go | 1429 +-- .../config/cluster/v3/cluster.pb.validate.go | 30 + .../go/envoy/config/core/v3/protocol.pb.go | 832 +- .../config/core/v3/protocol.pb.validate.go | 44 + .../config/core/v3/socket_cmsg_headers.pb.go | 195 + .../v3/socket_cmsg_headers.pb.validate.go | 198 + .../envoy/config/core/v3/socket_option.pb.go | 283 +- .../core/v3/socket_option.pb.validate.go | 397 + .../config/listener/v3/quic_config.pb.go | 81 +- .../listener/v3/quic_config.pb.validate.go | 47 + .../go/envoy/config/trace/v3/dynamic_ot.pb.go | 4 +- .../http/basic_auth/v3/basic_auth.pb.go | 55 +- .../basic_auth/v3/basic_auth.pb.validate.go | 13 + .../filters/http/ext_authz/v3/ext_authz.pb.go | 658 +- .../ext_authz/v3/ext_authz.pb.validate.go | 31 + .../filters/http/ext_proc/v3/ext_proc.pb.go | 678 +- .../http/ext_proc/v3/ext_proc.pb.validate.go | 207 +- .../filters/http/jwt_authn/v3/config.pb.go | 16 +- .../local_ratelimit/v3/local_rate_limit.pb.go | 272 +- .../v3/local_rate_limit.pb.validate.go | 34 + .../filters/http/oauth2/v3/oauth.pb.go | 431 +- .../http/oauth2/v3/oauth.pb.validate.go | 52 + .../proto_message_extraction/v3/config.pb.go | 526 + .../v3/config.pb.validate.go | 349 + .../generic_proxy/action/v3/action.pb.go | 334 + .../action/v3/action.pb.validate.go | 341 + .../generic_proxy/codecs/dubbo/v3/dubbo.pb.go | 163 + .../codecs/dubbo/v3/dubbo.pb.validate.go | 136 + .../generic_proxy/codecs/http1/v3/http1.pb.go | 221 + .../codecs/http1/v3/http1.pb.validate.go | 194 + .../generic_proxy/matcher/v3/matcher.pb.go | 653 ++ .../matcher/v3/matcher.pb.validate.go | 1027 ++ .../generic_proxy/router/v3/router.pb.go | 196 + .../router/v3/router.pb.validate.go | 136 + .../generic_proxy/v3/generic_proxy.pb.go | 415 + .../v3/generic_proxy.pb.validate.go | 533 + .../network/generic_proxy/v3/route.pb.go | 362 + .../generic_proxy/v3/route.pb.validate.go | 373 + .../v3/http_connection_manager.pb.go | 1434 +-- .../v3/http_connection_manager.pb.validate.go | 2 + .../network/redis_proxy/v3/redis_proxy.pb.go | 759 +- .../redis_proxy/v3/redis_proxy.pb.validate.go | 162 + .../filters/udp/udp_proxy/v3/udp_proxy.pb.go | 448 +- .../udp/udp_proxy/v3/udp_proxy.pb.validate.go | 41 + .../original_ip_detection/xff/v3/xff.pb.go | 185 +- .../xff/v3/xff.pb.validate.go | 192 + .../v3/client_side_weighted_round_robin.pb.go | 63 +- .../network/v3/network_inputs.pb.go | 260 +- .../network/v3/network_inputs.pb.validate.go | 303 + .../input_matchers/metadata/v3/metadata.pb.go | 190 + .../metadata/v3/metadata.pb.validate.go | 177 + .../v3/getaddrinfo_dns_resolver.pb.go | 64 +- .../getaddrinfo_dns_resolver.pb.validate.go | 29 + .../v3/datasource.pb.go | 91 +- ...ixed_server_preferred_address_config.pb.go | 88 +- .../cpu_utilization/v3/cpu_utilization.pb.go | 161 + .../v3/cpu_utilization.pb.validate.go | 138 + .../v3/upstream_http_11_connect.pb.go | 75 +- .../upstream_http_11_connect.pb.validate.go | 11 - .../transport_sockets/tls/v3/common.pb.go | 284 +- .../tls/v3/common.pb.validate.go | 11 +- .../transport_sockets/tls/v3/tls.pb.go | 511 +- .../tls/v3/tls.pb.validate.go | 31 + .../ext_proc/v3/external_processor.pb.go | 29 +- .../go/envoy/service/ratelimit/v3/rls.pb.go | 2 + .../redis_auth/v3/redis_external_auth.pb.go | 377 + .../v3/redis_external_auth.pb.validate.go | 306 + vendor/github.com/cilium/statedb/script.go | 144 +- .../docker/docker/registry/types.go | 2 + .../exponent-io/jsonpath/.travis.yml | 6 +- .../exponent-io/jsonpath/decoder.go | 13 +- vendor/github.com/spf13/cast/README.md | 2 +- vendor/github.com/spf13/cast/caste.go | 4 +- .../auto/sdk/CONTRIBUTING.md | 27 + vendor/go.opentelemetry.io/auto/sdk/LICENSE | 201 + .../auto/sdk/VERSIONING.md | 15 + vendor/go.opentelemetry.io/auto/sdk/doc.go | 14 + .../auto/sdk/internal/telemetry/attr.go | 58 + .../auto/sdk/internal/telemetry/doc.go | 8 + .../auto/sdk/internal/telemetry/id.go | 103 + .../auto/sdk/internal/telemetry/number.go | 67 + .../auto/sdk/internal/telemetry/resource.go | 66 + .../auto/sdk/internal/telemetry/scope.go | 67 + .../auto/sdk/internal/telemetry/span.go | 456 + .../auto/sdk/internal/telemetry/status.go | 40 + .../auto/sdk/internal/telemetry/traces.go | 189 + .../auto/sdk/internal/telemetry/value.go | 452 + vendor/go.opentelemetry.io/auto/sdk/limit.go | 94 + vendor/go.opentelemetry.io/auto/sdk/span.go | 432 + vendor/go.opentelemetry.io/auto/sdk/tracer.go | 124 + .../auto/sdk/tracer_provider.go | 33 + vendor/go.opentelemetry.io/otel/.golangci.yml | 18 +- vendor/go.opentelemetry.io/otel/CHANGELOG.md | 32 +- vendor/go.opentelemetry.io/otel/Makefile | 14 +- vendor/go.opentelemetry.io/otel/VERSIONING.md | 2 +- .../otel/baggage/baggage.go | 4 +- .../go.opentelemetry.io/otel/codes/codes.go | 3 +- .../otel/internal/attribute/attribute.go | 44 +- .../otel/internal/global/trace.go | 25 + .../otel/semconv/v1.26.0/README.md | 3 + .../otel/semconv/v1.26.0/attribute_group.go | 8996 +++++++++++++++++ .../otel/semconv/v1.26.0/doc.go | 9 + .../otel/semconv/v1.26.0/exception.go | 9 + .../otel/semconv/v1.26.0/metric.go | 1307 +++ .../otel/semconv/v1.26.0/schema.go | 9 + .../go.opentelemetry.io/otel/trace/config.go | 2 +- .../otel/trace/noop/README.md | 3 + .../otel/trace/noop/noop.go | 112 + vendor/go.opentelemetry.io/otel/version.go | 2 +- vendor/go.opentelemetry.io/otel/versions.yaml | 8 +- vendor/golang.org/x/crypto/pkcs12/crypto.go | 2 +- vendor/golang.org/x/net/http2/config.go | 2 +- vendor/golang.org/x/net/http2/config_go124.go | 2 +- vendor/golang.org/x/net/http2/transport.go | 13 +- .../x/sys/unix/syscall_dragonfly.go | 12 + .../golang.org/x/sys/windows/dll_windows.go | 11 +- .../googleapis/api/annotations/client.pb.go | 707 +- .../grpc/balancer/balancer.go | 93 - .../balancer/pickfirst/internal/internal.go | 17 +- .../grpc/balancer/pickfirst/pickfirst.go | 2 +- .../pickfirst/pickfirstleaf/pickfirstleaf.go | 472 +- .../grpc/balancer/roundrobin/roundrobin.go | 4 +- .../grpc/balancer/subconn.go | 134 + .../grpc/balancer_wrapper.go | 77 + .../grpc_binarylog_v1/binarylog.pb.go | 180 +- vendor/google.golang.org/grpc/clientconn.go | 11 +- vendor/google.golang.org/grpc/codec.go | 2 +- vendor/google.golang.org/grpc/dialoptions.go | 16 - .../grpc/experimental/stats/metricregistry.go | 27 +- .../grpc/experimental/stats/metrics.go | 78 +- .../grpc/grpclog/internal/loggerv2.go | 107 +- .../grpc/internal/backoff/backoff.go | 2 +- .../grpc/internal/internal.go | 22 +- .../internal/resolver/dns/dns_resolver.go | 41 +- .../grpc/internal/transport/client_stream.go | 144 + .../grpc/internal/transport/flowcontrol.go | 9 +- .../grpc/internal/transport/handler_server.go | 36 +- .../grpc/internal/transport/http2_client.go | 91 +- .../grpc/internal/transport/http2_server.go | 69 +- .../grpc/internal/transport/server_stream.go | 178 + .../grpc/internal/transport/transport.go | 321 +- .../grpc/mem/buffer_slice.go | 59 +- vendor/google.golang.org/grpc/preloader.go | 4 +- .../grpc/resolver/resolver.go | 22 +- vendor/google.golang.org/grpc/rpc_util.go | 42 +- vendor/google.golang.org/grpc/server.go | 87 +- .../google.golang.org/grpc/service_config.go | 5 +- .../google.golang.org/grpc/stats/metrics.go | 81 + vendor/google.golang.org/grpc/stats/stats.go | 74 +- vendor/google.golang.org/grpc/stream.go | 62 +- vendor/google.golang.org/grpc/version.go | 2 +- .../editiondefaults/editions_defaults.binpb | Bin 99 -> 138 bytes .../protobuf/internal/errors/is_go112.go | 40 - .../protobuf/internal/errors/is_go113.go | 13 - .../protobuf/internal/filedesc/desc.go | 3 + .../protobuf/internal/filedesc/editions.go | 4 + .../internal/genid/go_features_gen.go | 17 + .../protobuf/internal/genid/name.go | 12 + .../internal/impl/api_export_opaque.go | 128 + .../protobuf/internal/impl/bitmap.go | 34 + .../protobuf/internal/impl/bitmap_race.go | 126 + .../protobuf/internal/impl/checkinit.go | 33 + .../internal/impl/codec_field_opaque.go | 264 + .../protobuf/internal/impl/codec_message.go | 13 + .../internal/impl/codec_message_opaque.go | 156 + .../protobuf/internal/impl/decode.go | 56 +- .../protobuf/internal/impl/encode.go | 78 + .../protobuf/internal/impl/lazy.go | 433 + .../protobuf/internal/impl/merge.go | 27 + .../protobuf/internal/impl/message.go | 12 + .../protobuf/internal/impl/message_opaque.go | 632 ++ .../internal/impl/message_opaque_gen.go | 132 + .../protobuf/internal/impl/message_reflect.go | 5 + .../internal/impl/message_reflect_field.go | 32 +- .../impl/message_reflect_field_gen.go | 273 + .../protobuf/internal/impl/pointer_unsafe.go | 9 + .../internal/impl/pointer_unsafe_opaque.go | 42 + .../protobuf/internal/impl/presence.go | 142 + .../protobuf/internal/impl/validate.go | 16 + .../internal/protolazy/bufferreader.go | 364 + .../protobuf/internal/protolazy/lazy.go | 359 + .../internal/protolazy/pointer_unsafe.go | 17 + .../protobuf/internal/version/version.go | 2 +- .../protobuf/proto/decode.go | 16 + .../protobuf/proto/encode.go | 3 +- .../google.golang.org/protobuf/proto/size.go | 8 + .../protobuf/proto/wrapperopaque.go | 80 + .../protobuf/reflect/protodesc/editions.go | 3 + .../protobuf/reflect/protoreflect/value.go | 2 +- .../protobuf/runtime/protoiface/methods.go | 16 + .../protobuf/runtime/protoimpl/impl.go | 4 + .../types/descriptorpb/descriptor.pb.go | 1773 ++-- .../types/gofeaturespb/go_features.pb.go | 183 +- .../protobuf/types/known/anypb/any.pb.go | 9 +- .../types/known/durationpb/duration.pb.go | 9 +- .../protobuf/types/known/emptypb/empty.pb.go | 4 +- .../types/known/fieldmaskpb/field_mask.pb.go | 9 +- .../types/known/structpb/struct.pb.go | 71 +- .../types/known/timestamppb/timestamp.pb.go | 9 +- .../types/known/wrapperspb/wrappers.pb.go | 81 +- vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go | 17 +- .../pkg/util/i18n/translations/README.md | 2 +- .../kubectl/pkg/util/podutils/podutils.go | 46 +- .../pkg/util/templates/help_flags_printer.go | 2 +- .../k8s.io/utils/clock/testing/fake_clock.go | 25 +- vendor/modules.txt | 110 +- .../apis/v1/gatewayclass_types_overrides.go | 59 + .../pkg/apis/v1alpha1/serviceexport.go | 13 + .../apis/v1alpha1/zz_generated.deepcopy.go | 30 + 303 files changed, 36337 insertions(+), 7987 deletions(-) create mode 100644 vendor/github.com/cilium/charts/cilium-1.14.18.tgz create mode 100644 vendor/github.com/cilium/charts/cilium-1.15.12.tgz create mode 100644 vendor/github.com/cilium/charts/cilium-1.16.5.tgz create mode 100644 vendor/github.com/cilium/charts/cilium-1.17.0-rc.0.tgz create mode 100644 vendor/github.com/cilium/charts/tetragon-1.3.0.tgz create mode 100644 vendor/github.com/cilium/cilium/pkg/node/bootid_other.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_cmsg_headers.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_cmsg_headers.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3/config.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3/config.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/route.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3/metadata.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3/metadata.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.validate.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/service/redis_auth/v3/redis_external_auth.pb.go create mode 100644 vendor/github.com/cilium/proxy/go/envoy/service/redis_auth/v3/redis_external_auth.pb.validate.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/CONTRIBUTING.md create mode 100644 vendor/go.opentelemetry.io/auto/sdk/LICENSE create mode 100644 vendor/go.opentelemetry.io/auto/sdk/VERSIONING.md create mode 100644 vendor/go.opentelemetry.io/auto/sdk/doc.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/attr.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/doc.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/id.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/number.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/resource.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/scope.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/span.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/status.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/traces.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/value.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/limit.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/span.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/tracer.go create mode 100644 vendor/go.opentelemetry.io/auto/sdk/tracer_provider.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.26.0/README.md create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.26.0/attribute_group.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.26.0/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.26.0/exception.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.26.0/metric.go create mode 100644 vendor/go.opentelemetry.io/otel/semconv/v1.26.0/schema.go create mode 100644 vendor/go.opentelemetry.io/otel/trace/noop/README.md create mode 100644 vendor/go.opentelemetry.io/otel/trace/noop/noop.go create mode 100644 vendor/google.golang.org/grpc/balancer/subconn.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/client_stream.go create mode 100644 vendor/google.golang.org/grpc/internal/transport/server_stream.go create mode 100644 vendor/google.golang.org/grpc/stats/metrics.go delete mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go112.go delete mode 100644 vendor/google.golang.org/protobuf/internal/errors/is_go113.go create mode 100644 vendor/google.golang.org/protobuf/internal/genid/name.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/api_export_opaque.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/bitmap.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/bitmap_race.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_field_opaque.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/lazy.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_opaque.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_opaque_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/message_reflect_field_gen.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe_opaque.go create mode 100644 vendor/google.golang.org/protobuf/internal/impl/presence.go create mode 100644 vendor/google.golang.org/protobuf/internal/protolazy/bufferreader.go create mode 100644 vendor/google.golang.org/protobuf/internal/protolazy/lazy.go create mode 100644 vendor/google.golang.org/protobuf/internal/protolazy/pointer_unsafe.go create mode 100644 vendor/google.golang.org/protobuf/proto/wrapperopaque.go create mode 100644 vendor/sigs.k8s.io/gateway-api/apis/v1/gatewayclass_types_overrides.go diff --git a/README.md b/README.md index 0fa55f0dee..fc1a305bec 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ binary releases. | Release | Maintained | Compatible Cilium Versions | |------------------------------------------------------------------------|------------|----------------------------| -| [v0.16.22](https://github.com/cilium/cilium-cli/releases/tag/v0.16.22) | Yes | Cilium 1.15 and newer | +| [v0.16.23](https://github.com/cilium/cilium-cli/releases/tag/v0.16.23) | Yes | Cilium 1.15 and newer | | [v0.15.22](https://github.com/cilium/cilium-cli/releases/tag/v0.15.22) | Yes | Cilium 1.14 (*) | Note: diff --git a/RELEASE.md b/RELEASE.md index 4dfb0158ab..8e7f0c3516 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -19,7 +19,7 @@ table](https://github.com/cilium/cilium-cli#releases) for the most recent suppor Set `RELEASE` environment variable to the new version. This variable will be used in the commands throughout the documenat to allow copy-pasting. - export RELEASE=v0.16.23 + export RELEASE=v0.16.24 ## Update local checkout diff --git a/go.mod b/go.mod index 402dea52de..1b5c5aa0d1 100644 --- a/go.mod +++ b/go.mod @@ -4,15 +4,12 @@ module github.com/cilium/cilium-cli go 1.23.0 // Replace directives from github.com/cilium/cilium. Keep in sync when updating Cilium! -replace ( - go.universe.tf/metallb => github.com/cilium/metallb v0.1.1-0.20220829170633-5d7dfb1129f7 +// Copied from https://github.com/cilium/cilium/blob/a34e1653699191ee1b4b379d43c609765e263363/go.mod#L323-L325 +// Using private fork of controller-tools. See commit msg for more context +// as to why we are using a private fork. +replace sigs.k8s.io/controller-tools => github.com/cilium/controller-tools v0.16.5-1 - // Using private fork of controller-tools. See commit msg for more context - // as to why we are using a private fork. - sigs.k8s.io/controller-tools => github.com/cilium/controller-tools v0.8.0-2 -) - -require github.com/cilium/cilium v1.17.0-pre.3.0.20241210085346-6db21de11e49 +require github.com/cilium/cilium v1.17.0-pre.3.0.20250108154004-47bb433883b2 require ( cel.dev/expr v0.18.0 // indirect @@ -31,15 +28,15 @@ require ( github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect - github.com/cilium/charts v0.0.0-20241202171727-5ceb3f5006f9 // indirect - github.com/cilium/ebpf v0.16.1-0.20241205185900-f0eec7efba9d // indirect - github.com/cilium/hive v0.0.0-20241205140635-d02f07f3d452 // indirect - github.com/cilium/proxy v0.0.0-20241115112946-fb67566cbd95 // indirect - github.com/cilium/statedb v0.3.4 // indirect + github.com/cilium/charts v0.0.0-20241218153829-9518b30a2027 // indirect + github.com/cilium/ebpf v0.17.1 // indirect + github.com/cilium/hive v0.0.0-20241213121623-605c1412b9b3 // indirect + github.com/cilium/proxy v0.0.0-20241219105110-b2e1bb5839df // indirect + github.com/cilium/statedb v0.3.5 // indirect github.com/cilium/stream v0.0.0-20241203114243-53c3e5d79744 // indirect github.com/cilium/workerpool v1.2.0 // indirect github.com/cloudflare/cfssl v1.6.5 // indirect - github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect + github.com/cncf/xds/go v0.0.0-20241213214725-57cfbe6fad57 // indirect github.com/containerd/containerd v1.7.23 // indirect github.com/containerd/errdefs v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect @@ -51,14 +48,14 @@ require ( github.com/distribution/reference v0.6.0 // indirect github.com/docker/cli v25.0.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v27.3.1+incompatible // indirect + github.com/docker/docker v27.4.1+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/docker/go-connections v0.5.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect github.com/emicklei/go-restful/v3 v3.12.0 // indirect github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect github.com/evanphx/json-patch v5.9.0+incompatible // indirect - github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect + github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f // indirect github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect @@ -130,7 +127,7 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect - github.com/osrg/gobgp/v3 v3.32.0 // indirect + github.com/osrg/gobgp/v3 v3.33.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect @@ -151,12 +148,12 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect - github.com/spf13/cast v1.7.0 // indirect + github.com/spf13/cast v1.7.1 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace // indirect github.com/spf13/viper v1.19.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/vishvananda/netlink v1.3.1-0.20241022031324-976bd8de7d81 // indirect + github.com/vishvananda/netlink v1.3.1-0.20241227191253-26ee0e2abe2d // indirect github.com/vishvananda/netns v0.0.5 // indirect github.com/weppos/publicsuffix-go v0.30.0 // indirect github.com/x448/float16 v0.8.4 // indirect @@ -170,52 +167,53 @@ require ( go.etcd.io/etcd/client/pkg/v3 v3.5.17 // indirect go.etcd.io/etcd/client/v3 v3.5.17 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.32.0 // indirect - go.opentelemetry.io/otel/metric v1.32.0 // indirect - go.opentelemetry.io/otel/trace v1.32.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/otel v1.33.0 // indirect + go.opentelemetry.io/otel/metric v1.33.0 // indirect + go.opentelemetry.io/otel/trace v1.33.0 // indirect + go.opentelemetry.io/proto/otlp v1.4.0 // indirect go.uber.org/dig v1.17.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect - golang.org/x/crypto v0.31.0 // indirect + golang.org/x/crypto v0.32.0 // indirect golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect - golang.org/x/net v0.33.0 // indirect + golang.org/x/net v0.34.0 // indirect golang.org/x/oauth2 v0.24.0 // indirect golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.28.0 // indirect - golang.org/x/term v0.27.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/term v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.8.0 // indirect - golang.org/x/tools v0.28.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241206012308-a4fef0638583 // indirect - google.golang.org/grpc v1.68.1 // indirect - google.golang.org/protobuf v1.35.2 // indirect + golang.org/x/time v0.9.0 // indirect + golang.org/x/tools v0.29.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241216192217-9240e9c98484 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422 // indirect + google.golang.org/grpc v1.69.2 // indirect + google.golang.org/protobuf v1.36.2 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - helm.sh/helm/v3 v3.16.3 // indirect - k8s.io/api v0.32.0-rc.2 // indirect - k8s.io/apiextensions-apiserver v0.32.0-rc.2 // indirect - k8s.io/apimachinery v0.32.0-rc.2 // indirect - k8s.io/apiserver v0.32.0-rc.2 // indirect - k8s.io/cli-runtime v0.32.0-rc.2 // indirect - k8s.io/client-go v0.32.0-rc.2 // indirect - k8s.io/component-base v0.32.0-rc.2 // indirect + helm.sh/helm/v3 v3.16.4 // indirect + k8s.io/api v0.32.0 // indirect + k8s.io/apiextensions-apiserver v0.32.0 // indirect + k8s.io/apimachinery v0.32.0 // indirect + k8s.io/apiserver v0.32.0 // indirect + k8s.io/cli-runtime v0.32.0 // indirect + k8s.io/client-go v0.32.0 // indirect + k8s.io/component-base v0.32.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect - k8s.io/kubectl v0.31.3 // indirect - k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 // indirect + k8s.io/kubectl v0.32.0 // indirect + k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect oras.land/oras-go v1.2.5 // indirect sigs.k8s.io/controller-runtime v0.19.3 // indirect - sigs.k8s.io/gateway-api v1.2.0 // indirect + sigs.k8s.io/gateway-api v1.2.1 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/kustomize/api v0.18.0 // indirect sigs.k8s.io/kustomize/kyaml v0.18.1 // indirect - sigs.k8s.io/mcs-api v0.1.1-0.20241206165000-e2cb6dc0c753 // indirect + sigs.k8s.io/mcs-api v0.1.1-0.20241217092652-fede3192824f // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/go.sum b/go.sum index 112de9c57a..84a4374c58 100644 --- a/go.sum +++ b/go.sum @@ -54,26 +54,26 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk= github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= -github.com/cilium/charts v0.0.0-20241202171727-5ceb3f5006f9 h1:Gq6hla62DhEh3lLlE7VlnRsWqdUTq951EQHbyQf62S8= -github.com/cilium/charts v0.0.0-20241202171727-5ceb3f5006f9/go.mod h1:M3C9VOlFvRzuV+a01t07Tw4uFLSfkCH3L542IWjf6BU= -github.com/cilium/cilium v1.17.0-pre.3.0.20241210085346-6db21de11e49 h1:j74JexxH/pMi3WCZAcyoXGMSXVR5/kTvlHCctpxMY3M= -github.com/cilium/cilium v1.17.0-pre.3.0.20241210085346-6db21de11e49/go.mod h1:zpct1FtpC+CVZ5/6XwXmqUtzosFrnVmfp3oe2n+CRX4= -github.com/cilium/ebpf v0.16.1-0.20241205185900-f0eec7efba9d h1:f1E6PeQ/j1Xd2ZNlffKOfscx+daNInIUAJObbiU+7aQ= -github.com/cilium/ebpf v0.16.1-0.20241205185900-f0eec7efba9d/go.mod h1:vay2FaYSmIlv3r8dNACd4mW/OCaZLJKJOo+IHBvCIO8= -github.com/cilium/hive v0.0.0-20241205140635-d02f07f3d452 h1:phyHNaED0wvK8Q5Mne8glGH6lWGx7jmyO/bsIzWHEtA= -github.com/cilium/hive v0.0.0-20241205140635-d02f07f3d452/go.mod h1:pI2GJ1n3SLKIQVFrKF7W6A6gb6BQkZ+3Hp4PAEo5SuI= -github.com/cilium/proxy v0.0.0-20241115112946-fb67566cbd95 h1:iMn0++U3CDqoDINY5JLOhlPcjj3kW/xCmse+d+EZkOM= -github.com/cilium/proxy v0.0.0-20241115112946-fb67566cbd95/go.mod h1:/UoCz3gByKwF5gCHFMUhwmIN5/Pgmb8LTIrfBlmjGCo= -github.com/cilium/statedb v0.3.4 h1:nb5qNntmtaNljJD1r2s5zGOs62LP87AqLhFKIZH2rRE= -github.com/cilium/statedb v0.3.4/go.mod h1:hpcYZXvrOhmdBd02/N/WqxSjbeO2HYG8l3Z2fGq6Ioo= +github.com/cilium/charts v0.0.0-20241218153829-9518b30a2027 h1:DffBrEg57RLbc1jzajDDRYgTqWw1gr02+sMnzQp8yks= +github.com/cilium/charts v0.0.0-20241218153829-9518b30a2027/go.mod h1:M3C9VOlFvRzuV+a01t07Tw4uFLSfkCH3L542IWjf6BU= +github.com/cilium/cilium v1.17.0-pre.3.0.20250108154004-47bb433883b2 h1:OchA13nVom6cJbv3JKt2R1Qmg0CY3uw5e4llxDusxYA= +github.com/cilium/cilium v1.17.0-pre.3.0.20250108154004-47bb433883b2/go.mod h1:UTaLU297951gY5wxCGShvANCLv31z3U9Tm62creoYpo= +github.com/cilium/ebpf v0.17.1 h1:G8mzU81R2JA1nE5/8SRubzqvBMmAmri2VL8BIZPWvV0= +github.com/cilium/ebpf v0.17.1/go.mod h1:vay2FaYSmIlv3r8dNACd4mW/OCaZLJKJOo+IHBvCIO8= +github.com/cilium/hive v0.0.0-20241213121623-605c1412b9b3 h1:RfmUH1ouzj0LzORYJRhp43e1rlGpx6GNv4NIRUakU2w= +github.com/cilium/hive v0.0.0-20241213121623-605c1412b9b3/go.mod h1:pI2GJ1n3SLKIQVFrKF7W6A6gb6BQkZ+3Hp4PAEo5SuI= +github.com/cilium/proxy v0.0.0-20241219105110-b2e1bb5839df h1:wrv1jOKhBnFOhHb9jpE/C6Fm2kaXUDvT0HrdoeETLnQ= +github.com/cilium/proxy v0.0.0-20241219105110-b2e1bb5839df/go.mod h1:BsqJTwrsaSy5DsyH+y5zATYYCsg8/fc/K0qnsNM+43A= +github.com/cilium/statedb v0.3.5 h1:/lN7noYjC+JP6+fII7dhUNRS2FuLrlE0CtNOtuBtI9c= +github.com/cilium/statedb v0.3.5/go.mod h1:n2lNVxi8vz5Up1Y1rRD++aQP2izQA932fUwTkedKSV0= github.com/cilium/stream v0.0.0-20241203114243-53c3e5d79744 h1:f+CgYUy2YyZ2EX31QSqf3vwFiJJQSAMIQLn4d3QQYno= github.com/cilium/stream v0.0.0-20241203114243-53c3e5d79744/go.mod h1:/e83AwqvNKpyg4n3C41qmnmj1x2G9DwzI+jb7GkF4lI= github.com/cilium/workerpool v1.2.0 h1:Wc2iOPTvCgWKQXeq4L5tnx4QFEI+z5q1+bSpSS0cnAY= github.com/cilium/workerpool v1.2.0/go.mod h1:GOYJhwlnIjR+jWSDNBb5kw47G1H/XA9X4WOBpgr4pQU= github.com/cloudflare/cfssl v1.6.5 h1:46zpNkm6dlNkMZH/wMW22ejih6gIaJbzL2du6vD7ZeI= github.com/cloudflare/cfssl v1.6.5/go.mod h1:Bk1si7sq8h2+yVEDrFJiz3d7Aw+pfjjJSZVaD+Taky4= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= -github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20241213214725-57cfbe6fad57 h1:put7Je9ZyxbHtwr7IqGrW4LLVUupJQ2gbsDshKISSgU= +github.com/cncf/xds/go v0.0.0-20241213214725-57cfbe6fad57/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/containerd v1.7.23 h1:H2CClyUkmpKAGlhQp95g2WXHfLYc7whAuvZGBNYOOwQ= @@ -107,8 +107,8 @@ github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbT github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v27.3.1+incompatible h1:KttF0XoteNTicmUtBO0L2tP+J7FGRFTjaEF4k6WdhfI= -github.com/docker/docker v27.3.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.4.1+incompatible h1:ZJvcY7gfwHn1JF48PfbyXg7Jyt9ZCWDW+GGXOIxEwp4= +github.com/docker/docker v27.4.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= @@ -127,8 +127,8 @@ github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lSh github.com/evanphx/json-patch v5.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f h1:Wl78ApPPB2Wvf/TIe2xdyJxTlb6obmF18d8QdkxNDu4= +github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f/go.mod h1:OSYXu++VVOHnXeitef/D8n/6y4QV8uLHSFXX4NeXMGc= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= @@ -312,8 +312,8 @@ github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxU github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= -github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= -github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= +github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos= +github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ= github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -364,8 +364,8 @@ github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A= github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU= -github.com/osrg/gobgp/v3 v3.32.0 h1:B2krh/44etYQAuLq+iMkORxIvXj+cGIpuR6qDGNGagM= -github.com/osrg/gobgp/v3 v3.32.0/go.mod h1:8m+kgkdaWrByxg5EWpNUO2r/mopodrNBOUBhMnW/yGQ= +github.com/osrg/gobgp/v3 v3.33.0 h1:G8NlY1gzz0DOfiwfiYv2++vWpPLm+CMAKYRVzSmaJow= +github.com/osrg/gobgp/v3 v3.33.0/go.mod h1:8m+kgkdaWrByxg5EWpNUO2r/mopodrNBOUBhMnW/yGQ= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= @@ -407,8 +407,8 @@ github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoG github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI= github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= @@ -433,8 +433,8 @@ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9yS github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= -github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= -github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -451,6 +451,7 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -461,8 +462,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/vishvananda/netlink v1.3.1-0.20241022031324-976bd8de7d81 h1:9fkQcQYvtTr9ayFXuMfDMVuDt4+BYG9FwsGLnrBde0M= -github.com/vishvananda/netlink v1.3.1-0.20241022031324-976bd8de7d81/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs= +github.com/vishvananda/netlink v1.3.1-0.20241227191253-26ee0e2abe2d h1:aho1TDN+owyRC4gMe3PRewg0yBVdBsMg5kO9PYvzjo8= +github.com/vishvananda/netlink v1.3.1-0.20241227191253-26ee0e2abe2d/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs= github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= @@ -512,18 +513,22 @@ go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= -go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= -go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= -go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= -go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= +go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= +go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= +go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= +go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -542,8 +547,8 @@ golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -566,8 +571,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -604,15 +609,15 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/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= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -621,28 +626,28 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= -golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= -golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= -google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241206012308-a4fef0638583 h1:IfdSdTcLFy4lqUQrQJLkLt1PB+AsqVz6lwkWPzWEz10= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241206012308-a4fef0638583/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= -google.golang.org/grpc v1.68.1 h1:oI5oTa11+ng8r8XMMN7jAOmWfPZWbYpCFaMUTACxkM0= -google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= -google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/genproto/googleapis/api v0.0.0-20241216192217-9240e9c98484 h1:ChAdCYNQFDk5fYvFZMywKLIijG7TC2m1C2CMEu11G3o= +google.golang.org/genproto/googleapis/api v0.0.0-20241216192217-9240e9c98484/go.mod h1:KRUmxRI4JmbpAm8gcZM4Jsffi859fo5LQjILwuqj9z8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422 h1:3UsHvIr4Wc2aW4brOaSCmcxh9ksica6fHEr8P1XhkYw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU= +google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -664,44 +669,44 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= -helm.sh/helm/v3 v3.16.3 h1:kb8bSxMeRJ+knsK/ovvlaVPfdis0X3/ZhYCSFRP+YmY= -helm.sh/helm/v3 v3.16.3/go.mod h1:zeVWGDR4JJgiRbT3AnNsjYaX8OTJlIE9zC+Q7F7iUSU= -k8s.io/api v0.32.0-rc.2 h1:mFjTedXmyzuhkl1Fi35t/CY6Dq/VYKCyZoqnxvf6j+g= -k8s.io/api v0.32.0-rc.2/go.mod h1:/O0NxfXqcDG0xKUKKttOnl/DWYJ6K7iqnzVXecg5OKw= -k8s.io/apiextensions-apiserver v0.32.0-rc.2 h1:O2XbrgIWxbUwsUJcQLTSmzTOzL2rj2OYHtaQuuwfigc= -k8s.io/apiextensions-apiserver v0.32.0-rc.2/go.mod h1:Nv/SzjQtVyRxAWzqabtoEwXyoS6u6AnqHcR0ECfYQ54= -k8s.io/apimachinery v0.32.0-rc.2 h1:rsh5rcqBWhYHXuV4GLXyQs26HKnhYq+Plp7iywewHR0= -k8s.io/apimachinery v0.32.0-rc.2/go.mod h1:pfmi1Ug6+bq/azoo9WveGhYBCQ0b+Wm4IgxWGFZ7wRc= -k8s.io/apiserver v0.32.0-rc.2 h1:LH1UDj4RBvzhngtrp/A5Z09dwuJjj1X8spHK8n3GDGs= -k8s.io/apiserver v0.32.0-rc.2/go.mod h1:4MMzPo3GuS5TNvVRMO0jrGZzwBSuUagJgJgNdiCzctY= -k8s.io/cli-runtime v0.32.0-rc.2 h1:uNxQEOKNZ02BYkJ1jmHOVNuqyVfrMr2TZ4BNVeEwdNw= -k8s.io/cli-runtime v0.32.0-rc.2/go.mod h1:8cgRd05Taggpzjw5F7qN4duSqRW+XknCkxraemyO1/s= -k8s.io/client-go v0.32.0-rc.2 h1:x1WFgHIL7hTF+SQw7OvGB/IG7srV74gU+vtcErXI3pk= -k8s.io/client-go v0.32.0-rc.2/go.mod h1:+ePHye0JCEujugXp1oGyBhELUV3w/XcaPdkieeKJ40k= -k8s.io/component-base v0.32.0-rc.2 h1:Cgf4rBPacMEUYJnFJuV25KFE1NSr5FYu/Beu8oh/0pA= -k8s.io/component-base v0.32.0-rc.2/go.mod h1:sWSaFBT1kESrSbmQHYDLQwBY/25IokFSOsog/62fuaA= +helm.sh/helm/v3 v3.16.4 h1:rBn/h9MACw+QlhxQTjpl8Ifx+VTWaYsw3rguGBYBzr0= +helm.sh/helm/v3 v3.16.4/go.mod h1:k8QPotUt57wWbi90w3LNmg3/MWcLPigVv+0/X4B8BzA= +k8s.io/api v0.32.0 h1:OL9JpbvAU5ny9ga2fb24X8H6xQlVp+aJMFlgtQjR9CE= +k8s.io/api v0.32.0/go.mod h1:4LEwHZEf6Q/cG96F3dqR965sYOfmPM7rq81BLgsE0p0= +k8s.io/apiextensions-apiserver v0.32.0 h1:S0Xlqt51qzzqjKPxfgX1xh4HBZE+p8KKBq+k2SWNOE0= +k8s.io/apiextensions-apiserver v0.32.0/go.mod h1:86hblMvN5yxMvZrZFX2OhIHAuFIMJIZ19bTvzkP+Fmw= +k8s.io/apimachinery v0.32.0 h1:cFSE7N3rmEEtv4ei5X6DaJPHHX0C+upp+v5lVPiEwpg= +k8s.io/apimachinery v0.32.0/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apiserver v0.32.0 h1:VJ89ZvQZ8p1sLeiWdRJpRD6oLozNZD2+qVSLi+ft5Qs= +k8s.io/apiserver v0.32.0/go.mod h1:HFh+dM1/BE/Hm4bS4nTXHVfN6Z6tFIZPi649n83b4Ag= +k8s.io/cli-runtime v0.32.0 h1:dP+OZqs7zHPpGQMCGAhectbHU2SNCuZtIimRKTv2T1c= +k8s.io/cli-runtime v0.32.0/go.mod h1:Mai8ht2+esoDRK5hr861KRy6z0zHsSTYttNVJXgP3YQ= +k8s.io/client-go v0.32.0 h1:DimtMcnN/JIKZcrSrstiwvvZvLjG0aSxy8PxN8IChp8= +k8s.io/client-go v0.32.0/go.mod h1:boDWvdM1Drk4NJj/VddSLnx59X3OPgwrOo0vGbtq9+8= +k8s.io/component-base v0.32.0 h1:d6cWHZkCiiep41ObYQS6IcgzOUQUNpywm39KVYaUqzU= +k8s.io/component-base v0.32.0/go.mod h1:JLG2W5TUxUu5uDyKiH2R/7NnxJo1HlPoRIIbVLkK5eM= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= -k8s.io/kubectl v0.31.3 h1:3r111pCjPsvnR98oLLxDMwAeM6OPGmPty6gSKaLTQes= -k8s.io/kubectl v0.31.3/go.mod h1:lhMECDCbJN8He12qcKqs2QfmVo9Pue30geovBVpH5fs= -k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 h1:jGnCPejIetjiy2gqaJ5V0NLwTpF4wbQ6cZIItJCSHno= -k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kubectl v0.32.0 h1:rpxl+ng9qeG79YA4Em9tLSfX0G8W0vfaiPVrc/WR7Xw= +k8s.io/kubectl v0.32.0/go.mod h1:qIjSX+QgPQUgdy8ps6eKsYNF+YmFOAO3WygfucIqFiE= +k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= +k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= oras.land/oras-go v1.2.5 h1:XpYuAwAb0DfQsunIyMfeET92emK8km3W4yEzZvUbsTo= oras.land/oras-go v1.2.5/go.mod h1:PuAwRShRZCsZb7g8Ar3jKKQR/2A/qN+pkYxIOd/FAoo= sigs.k8s.io/controller-runtime v0.19.3 h1:XO2GvC9OPftRst6xWCpTgBZO04S2cbp0Qqkj8bX1sPw= sigs.k8s.io/controller-runtime v0.19.3/go.mod h1:j4j87DqtsThvwTv5/Tc5NFRyyF/RF0ip4+62tbTSIUM= -sigs.k8s.io/gateway-api v1.2.0 h1:LrToiFwtqKTKZcZtoQPTuo3FxhrrhTgzQG0Te+YGSo8= -sigs.k8s.io/gateway-api v1.2.0/go.mod h1:EpNfEXNjiYfUJypf0eZ0P5iXA9ekSGWaS1WgPaM42X0= +sigs.k8s.io/gateway-api v1.2.1 h1:fZZ/+RyRb+Y5tGkwxFKuYuSRQHu9dZtbjenblleOLHM= +sigs.k8s.io/gateway-api v1.2.1/go.mod h1:EpNfEXNjiYfUJypf0eZ0P5iXA9ekSGWaS1WgPaM42X0= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= sigs.k8s.io/kustomize/api v0.18.0 h1:hTzp67k+3NEVInwz5BHyzc9rGxIauoXferXyjv5lWPo= sigs.k8s.io/kustomize/api v0.18.0/go.mod h1:f8isXnX+8b+SGLHQ6yO4JG1rdkZlvhaCf/uZbLVMb0U= sigs.k8s.io/kustomize/kyaml v0.18.1 h1:WvBo56Wzw3fjS+7vBjN6TeivvpbW9GmRaWZ9CIVmt4E= sigs.k8s.io/kustomize/kyaml v0.18.1/go.mod h1:C3L2BFVU1jgcddNBE1TxuVLgS46TjObMwW5FT9FcjYo= -sigs.k8s.io/mcs-api v0.1.1-0.20241206165000-e2cb6dc0c753 h1:1WWZgHP/n7hBbx3Sp6JKdPk0kJKExYxUjeSuzDtyEAA= -sigs.k8s.io/mcs-api v0.1.1-0.20241206165000-e2cb6dc0c753/go.mod h1:x0rgWQwGd3FJzrb94BNn3Nu7YxUwBWcgjVRbkrkVy2A= +sigs.k8s.io/mcs-api v0.1.1-0.20241217092652-fede3192824f h1:nNsLiQPASpDDB5dNq96rmVCvQ3p5B5ChEAsh0Nq0VC0= +sigs.k8s.io/mcs-api v0.1.1-0.20241217092652-fede3192824f/go.mod h1:x0rgWQwGd3FJzrb94BNn3Nu7YxUwBWcgjVRbkrkVy2A= sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= diff --git a/vendor/github.com/cilium/charts/README.md b/vendor/github.com/cilium/charts/README.md index 203c242211..0188db588d 100644 --- a/vendor/github.com/cilium/charts/README.md +++ b/vendor/github.com/cilium/charts/README.md @@ -1,5 +1,7 @@ This repository holds helm templates for the following Cilium releases: +* [v1.17.0-rc.0](https://github.com/cilium/cilium/releases/tag/v1.17.0-rc.0) (_[source](https://github.com/cilium/cilium/tree/v1.17.0-rc.0/install/kubernetes/cilium)_) +* [v1.17.0-pre.3](https://github.com/cilium/cilium/releases/tag/v1.17.0-pre.3) (_[source](https://github.com/cilium/cilium/tree/v1.17.0-pre.3/install/kubernetes/cilium)_) * [v1.17.0-pre.3](https://github.com/cilium/cilium/releases/tag/v1.17.0-pre.3) (_[source](https://github.com/cilium/cilium/tree/v1.17.0-pre.3/install/kubernetes/cilium)_) * [v1.17.0-pre.2](https://github.com/cilium/cilium/releases/tag/v1.17.0-pre.2) (_[source](https://github.com/cilium/cilium/tree/v1.17.0-pre.2/install/kubernetes/cilium)_) * [v1.17.0-pre.2](https://github.com/cilium/cilium/releases/tag/v1.17.0-pre.2) (_[source](https://github.com/cilium/cilium/tree/v1.17.0-pre.2/install/kubernetes/cilium)_) @@ -7,6 +9,7 @@ This repository holds helm templates for the following Cilium releases: * [v1.17.0-pre.1](https://github.com/cilium/cilium/releases/tag/v1.17.0-pre.1) (_[source](https://github.com/cilium/cilium/tree/v1.17.0-pre.1/install/kubernetes/cilium)_) * [v1.17.0-pre.0](https://github.com/cilium/cilium/releases/tag/v1.17.0-pre.0) (_[source](https://github.com/cilium/cilium/tree/v1.17.0-pre.0/install/kubernetes/cilium)_) * [v1.17.0-pre.0](https://github.com/cilium/cilium/releases/tag/v1.17.0-pre.0) (_[source](https://github.com/cilium/cilium/tree/v1.17.0-pre.0/install/kubernetes/cilium)_) +* [v1.16.5](https://github.com/cilium/cilium/releases/tag/v1.16.5) (_[source](https://github.com/cilium/cilium/tree/v1.16.5/install/kubernetes/cilium)_) * [v1.16.4](https://github.com/cilium/cilium/releases/tag/v1.16.4) (_[source](https://github.com/cilium/cilium/tree/v1.16.4/install/kubernetes/cilium)_) * [v1.16.4](https://github.com/cilium/cilium/releases/tag/v1.16.4) (_[source](https://github.com/cilium/cilium/tree/v1.16.4/install/kubernetes/cilium)_) * [v1.16.3](https://github.com/cilium/cilium/releases/tag/v1.16.3) (_[source](https://github.com/cilium/cilium/tree/v1.16.3/install/kubernetes/cilium)_) @@ -31,6 +34,7 @@ This repository holds helm templates for the following Cilium releases: * [v1.16.0-pre.1](https://github.com/cilium/cilium/releases/tag/v1.16.0-pre.1) (_[source](https://github.com/cilium/cilium/tree/v1.16.0-pre.1/install/kubernetes/cilium)_) * [v1.16.0-pre.0](https://github.com/cilium/cilium/releases/tag/v1.16.0-pre.0) (_[source](https://github.com/cilium/cilium/tree/v1.16.0-pre.0/install/kubernetes/cilium)_) * [v1.16.0-pre.0](https://github.com/cilium/cilium/releases/tag/v1.16.0-pre.0) (_[source](https://github.com/cilium/cilium/tree/v1.16.0-pre.0/install/kubernetes/cilium)_) +* [v1.15.12](https://github.com/cilium/cilium/releases/tag/v1.15.12) (_[source](https://github.com/cilium/cilium/tree/v1.15.12/install/kubernetes/cilium)_) * [v1.15.11](https://github.com/cilium/cilium/releases/tag/v1.15.11) (_[source](https://github.com/cilium/cilium/tree/v1.15.11/install/kubernetes/cilium)_) * [v1.15.11](https://github.com/cilium/cilium/releases/tag/v1.15.11) (_[source](https://github.com/cilium/cilium/tree/v1.15.11/install/kubernetes/cilium)_) * [v1.15.10](https://github.com/cilium/cilium/releases/tag/v1.15.10) (_[source](https://github.com/cilium/cilium/tree/v1.15.10/install/kubernetes/cilium)_) @@ -67,6 +71,7 @@ This repository holds helm templates for the following Cilium releases: * [v1.15.0-pre.1](https://github.com/cilium/cilium/releases/tag/v1.15.0-pre.1) (_[source](https://github.com/cilium/cilium/tree/v1.15.0-pre.1/install/kubernetes/cilium)_) * [v1.15.0-pre.0](https://github.com/cilium/cilium/releases/tag/v1.15.0-pre.0) (_[source](https://github.com/cilium/cilium/tree/v1.15.0-pre.0/install/kubernetes/cilium)_) * [v1.15.0-pre.0](https://github.com/cilium/cilium/releases/tag/v1.15.0-pre.0) (_[source](https://github.com/cilium/cilium/tree/v1.15.0-pre.0/install/kubernetes/cilium)_) +* [v1.14.18](https://github.com/cilium/cilium/releases/tag/v1.14.18) (_[source](https://github.com/cilium/cilium/tree/v1.14.18/install/kubernetes/cilium)_) * [v1.14.17](https://github.com/cilium/cilium/releases/tag/v1.14.17) (_[source](https://github.com/cilium/cilium/tree/v1.14.17/install/kubernetes/cilium)_) * [v1.14.17](https://github.com/cilium/cilium/releases/tag/v1.14.17) (_[source](https://github.com/cilium/cilium/tree/v1.14.17/install/kubernetes/cilium)_) * [v1.14.16](https://github.com/cilium/cilium/releases/tag/v1.14.16) (_[source](https://github.com/cilium/cilium/tree/v1.14.16/install/kubernetes/cilium)_) @@ -452,6 +457,9 @@ This repository holds helm templates for the following Cilium releases: This repository holds helm templates for the following Tetragon releases: +* [v1.3.0](https://github.com/cilium/tetragon/releases/tag/v1.3.0) (_[source](https://github.com/cilium/tetragon/tree/v1.3.0/install/kubernetes/tetragon)_) +* [v1.3.0](https://github.com/cilium/tetragon/releases/tag/v1.3.0) (_[source](https://github.com/cilium/tetragon/tree/v1.3.0/install/kubernetes/tetragon)_) +* [v1.2.1](https://github.com/cilium/tetragon/releases/tag/v1.2.1) (_[source](https://github.com/cilium/tetragon/tree/v1.2.1/install/kubernetes/tetragon)_) * [v1.2.1](https://github.com/cilium/tetragon/releases/tag/v1.2.1) (_[source](https://github.com/cilium/tetragon/tree/v1.2.1/install/kubernetes/tetragon)_) * [v1.2.0](https://github.com/cilium/tetragon/releases/tag/v1.2.0) (_[source](https://github.com/cilium/tetragon/tree/v1.2.0/install/kubernetes/tetragon)_) * [v1.2.0](https://github.com/cilium/tetragon/releases/tag/v1.2.0) (_[source](https://github.com/cilium/tetragon/tree/v1.2.0/install/kubernetes/tetragon)_) diff --git a/vendor/github.com/cilium/charts/cilium-1.14.18.tgz b/vendor/github.com/cilium/charts/cilium-1.14.18.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2e513a1907ea282d4efc9b68a3fb200fd449b482 GIT binary patch literal 166391 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∨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

I6g_Kk7xaV?Z=4#foydYqy#xB{b2>f(4W=z=(t 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%0AF9b8PED70Ln7?b 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 z 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�ab1)F<)iF)n{>pz^XQ$mrn9VJsDKChw}rbZGv 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

g52{20!a*%O%Ep!HrF&C}Jh{^>-jIWxvvLbVi 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

559H^J2DK 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/cilium/charts/cilium-1.17.0-rc.0.tgz b/vendor/github.com/cilium/charts/cilium-1.17.0-rc.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..446ce3247ea18de5401a3e82aff895c40bba0843 GIT binary patch literal 217262 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

  • !jA4g~V# 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�_l-C0|u)&ff;+jX3!LiF`g2X@GP_M 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
    lQC*MuOzK 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

    N8`p~b*uU7eajlI^t8YRS0 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 z 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�)~wYchZx4f?~q(QD&!RtmL?%c4tyzy5f1^mD_@ zBl~iXy;^gdDmLLYlKrV zO+_|uilg44Y9a3_GTD-Pof+;;qe?uApqwNlnuLI^d!(yuF9b%`Z*0y#AF|4~b$T19 ziY;U)?R7KGsDRIu`@%c&L_Y6VVHVGanA5O9OPle$F*U0 z?PIO?nM}iczVME`R2FgYDV38j_Bx)%mnl(7FaYQy6;HJ*Oy4I?fF8_sh2@^hWF_!V zx1tD_UZbcra`olXKDF)6c^p7UzfzR`>-35pCy*CEHSV*NYX>6f_DZKN3@DysV+hjlL8PxUCU_bxZ2?uD&$l|Dhl?!l zis@9{xo=df)E>BeRGX!4OLezF+zsVUlSCKh6hv4WSa*&a6WHD7S`&4JMDS0#FFAod zI#(i|8U%0d&Tw}i+K-17%&ooe8NN!th4C(n>X1};~axzK}FhImP zj4<>`+w`g22j#^CBGy=!dLcT&w^-0aM-DjAqLXg4-!)Bc)z|6~b2`ysk>FYWiIjs5 zL*stqkZ8=G_MN4V#r?J|t2PiugMvgt%9mD&CF5WnqL1~k%(-LKafV>k2y{#y#8jq_ zJPmB@6c$v{ok7V6C&mo`Hm~cR=#;6f$F9_vL5Lfs;RKQj&}AlE*bO{0o{dUYchl4` z*2Mujat3q#Abw%yg=$St;F0#^G_*KbvPVSbtgpnz-3k>E>$y|lY6Q%NltO-OqBzD* zmH1Bu9*TrxH<1rQ&s&cj$F{^0Bo$z|h|W&U1hr!FVOmJ{*mq$px-%*YL?@Bni`<`w z;sL!|m`c~YAN45sJh~>*Cj75e)PaSlUuRdY@E~V5%PbcQh<#sC3?3x_P>yFa7=bCv z;7goCMQp)mk$7nEWko=GYbky1+Oqk-)( zP862#6!r#>*@wj>6;Z_5$z1)20W2ZZfQoaL^K>ROv{uaX-hwALInT2*%HFebAe14s zMf1@6opkTPQNk8Habm8}WSVmSUg=Q8SC%W4cv5d`+*oaKr&?`Mi=K1&$mBE^v27U~ z90gPrf}>MWHSO$TyjX46~raie?I;|@w} zEi_Z#B`4$4YrJFqxx`xl#fCD5Y)0tyxzvKOmVZsM($v8QsR*bg^M%Q!gevIT35NjI zSrNjlbs#57qX=p9 zs;%61ogQs!pex%wMh3Rh3enR0nwHM15z}qQ421>JIo-$xd7;ZBd+ZXNS!cCAqD*BD zr8=AIZeh9ws$B+WIoL@Y+2?s^aK_3D8yPQuFuc`?x0{cV^KC817FZuOHfVEfvmyXnVf>lLP2y&v)@ z`~}%+Be(&Ss+oor0IFqzo5H3V%5|{RCW23)RVA|tn8!h|KiM7lyFTCDI~etcd%Kez ze{d*<{o$a$I~t1V!Qt-y;bbz}*%<_*{ZZfF6{G%PFxneThKK$Of_Z?Wy-2#5pN2_p zKt24uU4LH$f=~9Rf!GcB=s@fpazEG^9P-I zzKE8lBhLY}v_q80pt^{j4t2PW+|5cvKb|DV=|ZMgsZ{5Qcl4{yuKW;#5hE4>m8UW| zewtF{kbVLay-KqcrW!aPfvNNnnv$&p?ykxV;-xiZ*I3?Ck>xU}Fp$VBzrlS0=(0&F z>_34Q{T)P@Wni=^If?aivruuHu{TLdB{yWI1}lTZWvj~6a{(Lg+JG9xWW#h#8_ zfC^_x;T?H{et+S0yoFfcAu{OqFG5-nrU4VaMA=RMYC|A4-jF4e-8Sa-bPbQru7-EN8@(^Z!_IliK^BPm}bwyrs|D06{t}R z_TXm8LoErbb)+-DPYZPf+?dXc5x5V3KKm^E0*wnFf5lXMebXZ5n*o7Q{|qHrK(=|3 zct>`Ee*3NCX%xC2poUO0Dvb9VIS-pecIgI{*$%&q$X;z@bIDzQvQ_3Q;Msg4c^a(6 z9Ira;VU)ciZ9ClsezqM9CyB-&75(lCEomO?1D2WR;qOjMcE( zzIUGL*#6Sz+Je%ypa#t=${1eOt|1(~5dLJRAugOm>F5ySszEorC`F;o;$kiygjy&<`d9?jQCKgTn*=aC$K8 zPXi&uV9@Umcczo+4nN%WIv#(_s#K@L{_d{&ZaO&>gZ&ZjkB0tWBqoQ`k-sCSY>r{d6`1i|ExPYhhn!s^$(|elN~?U?@xmLiSO?YcX#~(5B7Er1mE{M9#m5c{n|K8Mt$M?gTp-$ z91af$gB`JZ7>srgI1hFY2ZslP!QRg3aEBlE_a@Wn;ZCr3xN|r?-0=_hC&9t=1QL>=?`wQ8{dtb@p`i;| zjryOhq{d3#zIH{8)s6p^3Tn7Ld7_bNqh+(w(zKDryFoKaDyQ0CSw1PiXQuAk3Wx-J zqRY>_LE9^}6>Mm|H5{pLNG>U%VUGHv!3tJQOy6q4&$bnc`^2&g7$iTIL-@=l>({dOI#Mu@ zj;JvhR{6X%U?{i!zsA_xH@QOBnfb0rZNQ}>{Ti|cNmy9DDjU@bRF%*)^Fl5m8eaFc+Bv5tU8R9`ptCBCKfo_w`P{H< zR-?%Aq~cko$@MiCpD+JpB3EmSj0QJ3&x@v|b|Z4sUVIs&#X_f!y7FT#*=rb)*JM|R z7;&D-n7zi8HqJgIuZ>lH-I}b8M_$?wX6t22OyOz~)b-f-_* zuT!fEJHFmUh2x`~|e%9(#cfnUnG9^@Z9H zwc-IJmo>cxpxqJ0BZKkTAPJEP2Q6l_OU9?yCf>0}B^0wPG-*JJ9u#@Vyq?1vRXkD4 ztf{gATo6XD#=)i}mIO-q7+`cW-jSJ!Cc}HOT{z_XY;nuQ}DTe zU4Q%iLDof2J7v(kh@ahbtlG_&@w8j=oBP~9A>SF z4cwTvPb(al6_T4e87=L)d$Ez^lc?1Q{XbtkuD&1~=aC(Um#dC$M*R16?AWe6M_MUy zpVbNf*_=A7nfuyaoi(lhmE1a|t~^mfMT@SpaH^Z@Mcg{&rCDp@MWS6-_ChI>p+)nc z#D!B4@nuaj1jX<>2tRpbk&I^m>=Owyoo><3M5I%hE_Avwrlwh(k5&#^@I>}DfD3qdz>N86Cu3QYK)+(yx^a>c3 z!-SmvGl;XRRGe^s-n612uql_2pM&vccik?1rlhE@uRgrPET3G~8+Zw8k?q(YWGAv6 z`odsa+k-~ygCYOGqfk9Rxx8w!mpVzOk3w&BQpohDR7g(OT?b0K_Adye7QM_xim-*l z3<@m#4pvk+xs))a^jKXlUPEi?y7bmIYo=-@{ZKZk$$ zqtYG?_M3O){qJ7~zp4Jisi^hAkKU(G3z73rb|ZaCWbjFCyHB9?{j9{~bS84mje6w$ zrhZO~EI+wE&0u%y%chVq7*Bn|Az2ul@_>oY zi2;EDTUx?XPR2COsLJA-f5-1XO{IiHdYnAx#}4b#za|`EdnixX{<^iPaZ66rV!<4q zrCzDq)q(nIF&3^7>3`xXn&T?IS~$g5j-uFPZl4=Du}K?WH(Fv74$2V{jxhOE@3Jon zzSyKYbp++ zh2@m#+Hu{tkjZn5@D#deWd+L&S|}@%?U0u{cWsE5Odko?s6Ulz2Xfgx7|W}on~Qs2{bbMktrX;E)ZKq#)2RBm60x8nKV`|gSK_m5_s5^BK zyP*sU;{;^uvQ05vj)%Ad-G%iz_&LqiN4WpuXhZ>cQUF$(~o~6n7gA9WVf%HL- zQVT2!{T#QFL&RDMU3B^W_UwqA6lp5d zBz8)VSs(>!EBc32D76lGPxDM|Unn;?mkSebSh3;t+&udpY>}H~=I7D-2a$r3Sk@ai zO0$O$6Nj#iGk^xV8MM%qrir^sxWRf(aTDkwpq9Ur@8AEVc>7^|eqKQcP=CKZ{>kfj zb0}mcjHt1 z%ZKqP_Wh)>@8uYar}Q-vJjP?@CP&%CcDRaxu)Z^^SX3=_bqRmf*3)MOQa(>mr~aaq z)65!>?fO7>Bc?3SL*oTo#ALz?2$U@n4^-QLzRMcPmcb$_r@{){2sk0muuRt%hTo8| zeC+$$p>5he(HYLKGdK*F?4JdXpbD9W_f&Ub7>f!OGJ8zjENOk}m7CM0F&846`y$O} zB3_qu52A|tSm&CcY_0zVI>wRb(CzXhL>##;DuE#mgNjal$tayotv```t%8D41m9G9rXwX@c=-y@69(zL;#w~!m zP9>HI$|50><7qC^F~IoM*VL)h(cA{67Yl+xNmr`*4d*LdEu=$y$i%b&JC8bZB9V(o ztwi$BIDo&QDJ>=w{WC&h=R7s_{b;4BU#8s8GgHvdlvd89e=qX$w@<>!g>RVp$f2-_ z&9M9-!t$&yak1B`@oQusP{@01(BEU9*)TI0yEcAS!kU=#hfo%2n@0a;FzjbokB$91 z+v&5^*Mt>Xwwyfie@0Y@@cN!I?fe zR;}pIgBrKh$#w6gL%5jU>2J#e|3DwIz*$@YUuJF`gNo|%9c5+00Wmp`+vi2fD zgS)!~w*bL|y99TK;O-C>cXtg0cXto&?y|VMJKyG<``!Cv`>E-tXSS!NySn7lco!97~@pwe7c44?h=M8sN_@R_EDub_x#Z1ah!(M=e8&A>iL6c z<5;z0SkhQDO`C(CqS0~(nA8+&e5NaMH_B*C5I&$(b-i+~#NPwkTHqL$x*|GjMG&R% z55g<$RIM$Ic~CeQ`KH*m^~`dqya#vMKw}rh|kRJGD;~q4OlKS_|ZO z9PBxNM{Rz&>Y9jQ=6&2L_GJN*B(>j=N~<%s!{$k$3=f7?;un>u?9Zemp{9gPq78bw zHx1;aA98&uRfgZEa-*+@p}=)Mm?sJwHCST7KSfymmWKq<(R1c+k3>_>Khb@TI<5G!* zAtRw%Yp4?nysn-926%DDze;PAPL5wTx+=~Kcc^(FeGxj8=BR@0cv~d88-#dwc*GCh zA;XcHL?IZ(A~CMc#^@=cAoFeKZ<{f-%gIrIC6lcAx{u@uRqD_?rys0wKETR_pqZP~{wZ zkX73Oo9t)rBU(JjowEHNd=~stKX!SJFrty4&pP90;j^-lOc2=n>9Ain98=qBs98>Y#zfY(x@%l$5u^ zTue>58y~A{Ko_wz@G{g-KDI1uf=A^b7pN7dzG#(&zbb_$w%Yq{&>TQP_UAA}LttP> zh^AOj4x|X(`Vj69qk%NdcF8>X60_7Hz$?(feZuI!A-f+z=}A3*?fdqtOK@d9Nbu$D z*WF~t`unCnOxp|ZTgUWImX)`ZcW?q{?pK@zUnM53clz4QqK_G0SMB+UH?jAZJN1N$ zaX!G~`S>Rk(c>E8m$N4IDtx`E{$~-qk3QuBo=W$$ze}KN1M16$;FP(yu4kldO2Gx% z4o}luPm@0!Wc7RIj_Co35oA8sWS{E=VPEm#B`^fPZSE}7>wec+H1>uosn==Y%f6T7 z{yLR9{L@r(YZ7l#uSJ1~i}!k4ng1Pqtz`&zvLy3q;-1N@&TsihwK5Q0*K%kfPp$pv z5)AN;q8lw0bg^-!OrrOQ9PFWg9LS`TMwT62pLWbULVkI_zc1}ITU4i+Iz|C+(ekR& zBMON0{|@^gogJ;g^y(3*$S+VR64s;+`abh1T*vw~wYtm9Rv5cY04NvqYiF>!VN6oQ-q2DN%={x1WCJNWqq8K1suc(xr}ERJ=B^ z@YUlDfzNRMYfT7FRJ_Wt@Phq;5aCD3Eh1D<9a6~^e(+WT^}5XV@+*cQ%g^pDbp34*v?O2U3mXUmCtQ-7nAHJiM_Mn0 z!H^vQnC^1-`74HzCkShMpotq*4`LhY(CX=R{JpiD=M%M*m_7d_6(~sS6Hmna$joMD zF1Q8;uUzD3iurfEY<-@oeN!o=@FOY~#H5;5FHxPBYSJ`D z(2Q9y(KU`Qr2|j#7}EW1^hQ&wYm#_aKm0Z*Wv@*AVix&R=xZHZE|3*QI~7wk%UJCi zi@3wn#m(*E*w;8&j1GM)oh&8XOrGC4b++n+`tWS#`%tT{vF-~&@S89>DaQkXkvw6f zU_#rf;RlJ=#mYuwMMcE@$#hk>iI>?a(`d4ZRAZa#fe(WbyC7qxHn1g^S``<#x-z_}eqcm(Q zT=~h175D^s9xWujZSlYF14jej&YmDnG<%>r2sRe`F!0l73$*fwDjCW__8Fmapr)<1jO3~_#n1n4xk8s;4%8XRR*VA+E3C7;rq?*Esnj;X`y5?T>4?Y@< zkxpXvq!tdkwJdEB+u$!XToiaWZ3AyuC)-G8Hnb8Ab|CKXzH!*h`eGI4?RlAc&(^w+ z+QG9`^Y2nWHV199IH8~{;g=f^j8Pwn*%aOLvxUl72Q00LQFPY{q9bcF2xGF`&2Bkt z2MSQLfG8G(P&1}R`Vs1g-A$-Ky<4?GvxMwmBqhN#@-oReMM8u2pg)5VW+CnRdQ}?K z?I4Ndiy_T%O>0PtjIm@`#Ic={u0)l*Z&zuZZN=|5SI=KpI4?J+z5V?!voRm2DSBs? zhjvwQ3sX~zRUdjc5`C3qfvD3G$ewq>8iDjByTx!KY*9ls!!Vo6{okIwJ%V-UantYV z-{aQO*ON=|o~^DSe*L7OYVgxUwAx?VwX5P3cA;GG1@A&-`8LDYO02*9k#exKH%hDZ zkufe_Hh)IF_@P#|e*X8lD;#8ul)L*5bvslPV|FDZJVw|Mh`d z9qH8Ak88&+&@Ir7`KmA5TaX3Gm6uOlF~W{tN*`yy@r;J}C$lce6=C2}S>gGTdGwy* zy)Mt`PSyai<<|_a;`yV~-2F-wKbCw53rCpHt~}+4i^ACK3=RsON!Ip;(-B zw5G~X6Va87Lyu)Q+}>??jHRe+!b{<=MybC_$5*; zN-ReAV&4|qaWH9JDU8S@Sj$I;uVV!%{coKw+Tps0@SeJ;DvOCb7A7raY2vGJV`$-)H9Lua8ot*j@I zV}5*8%JoxU6J!C&v9YIRkOghtd5SFoCP?=Q#rv>YkLKtBw$RkazGi}b^^e)J&p9m0 zEMc9(r88HF`BM8!5Z&%D3_jjkJ{nnHBn);S)XEep>bWG<7QXfVWSTw=y0uEp8(OQF%_vZ@dNs(DZx zoX2Nmw;T>L4$sXy)#%PyPYymuS)iz@Zg~+tSr(Z>3nss`RmWdpqch{1r}_Vh`4;f~ zSi6OtqeV!rGf-E3cUl^hrb6NC)9o`^11ZQ3-%2)vkdO3*%vIdhdMF&j z$K!c?ZoTMsN9>cL5vI?3bKJZ8_C-}oJd$++Gj%ktTG=8u92Zqwy<)%Sr_y)q6W@<5 ze~a0%DaSuIlX2p-E`?(dDLhQM+s^lFM3f`gKNwK;@8vqNH!vs$5I`iqIbfoax9MkM zx2t}p(PU>Yev?7H(mhP7D2=@{ldvOZ)E;WMorj0R`!U<>9A6g9Da~|&-wQdO?7SsV zV)eCZ%sVZl;yq@<>c z8)YgaQ&xe@`ZMM~-2DLEe{}jW{PMs=GNQ+_k-J30n;VkEY^%qd3Dlc(^S0*SAoSut zZLR7G^!uw{&%etvaPsl==WUZ`0O#x|X8-ZzoatCFhiH-Y{!tCV3g<1fHOiz1DkPdU zrNu5DEp75;)RZ#X1R1VclBR_sf69md>L|{z zAM~?9|F*pr{?zr;aBfB&=lcpe4uZxie0AfUnGG2|LB@Ub7jWLn^VXua@63EtH)(T` z4z*^+NBNO*D@Wy4RX=_VHuZi@;emp%EcwvUEQz^#OP9$agKC(Yl-9(ZU=qw#@D5SK z>|kpP`|ieo*hV~T-)GWvUB_Q|oM$FY(y*c&8A{Z^W9gca(7=7aKu6h)QJm`8xIEVa zm4J|{(w)!dfhkL8@MGCJLHeU7W{%MFTfoTCfxcH0^&OP;-GIsIRES=w5kgN#ep10K z_j%*u`i&PIn|1j%|p>ggC0eebM?khBYZ{5+|^rae;d7hQ650E5`yJ%IgBd_}|q)G^SL(zv5_~)>50A3gC7IFUusou{;Fs zp>iS<*Mk>6bo2d-^xP{4`tpLxZ)8w5H zn!#=qEh@i9k1kyO zRYhjqR-Ei4IBn`NKtns|-efo#5Yg?x(s&=y#)3xjnjI!Uxis2_MP4J9rks)*pd8a zDBF(3{q$u=g$=KpF6~V>pie!$h6a0MuVQK(D z*q6GPENPp~X^=4mOBJ1JTVz!(`kr zefGbOM>1foCD=MHo3+Bh>)Ju{&ocshBIGtqf|HUlLJe(r0mHHev$EGnm6y?h*%;^ z2uz7Qg|+Y{Inr7GigiJ0Gb2R9ZG{z8vu4Ik84vSe={0wuseUuheCp5ddA~671y7y6 zK?$X`Sqx8a6DqTbkMyYHY`ts>B5my2Y6a^zh_g)=h?p~6lP1S=IMM(i7{AZ^O$bAz zu|4gRPBs% zLrGD4OjLnz1Hvo9J!2H$@x)C5eXP3kGp7a@5P- zJtUq@mn*356W}656_g&Arnlds4dWE7UXd;T%GiJ2tRE#s;dGyOlkBU29~dycs!1VmOvAXVud2*Ux`4jK>HT0Mc-YsI(>0a3+5C!_{=8br_xP%Z(=f^$D0C{g;5_8R{G2dzPB$ihfpvgQId z*`zREeCur0jE4B$4TEK^xb1&!7%TGcU;NM^sbtkY(Hb&P<^)ckK~w1*Z!~(>H(z$x z0I?S#87EBkVC$PP>*0{0g(8615R8yo(DiUN`m_>E2FiM|a!>BzQZ2J16z~--lEP&B zO|p~Bz*nEa2W4H@)Q^@_klR{D)&%hn&G5mcvu~A)H$)`bra~SxNsEwe`~)#!pC{Gh zehM%oA5?2#YLFP?d}FfS7$Q&r%#8B(9l**}1M_0Rcb zpKk#(SfoVdhkz-F94H}JATodmz%vqu2ylk$lkljJ$XH$nD`%fBYs{KB$atZJ8{q>P zvT)lm(VQUl-3E5=aBP5bCmv(g>tSg)k!V&vLcf!qy|7xUc|Dd&RPF+jmgg^b_z}SjgqeenJi0}snkJg=d{=hpdRxdr`qPsssEy};;R(L;h z^@KpcP6!{FHK=EpTONhqKHouWA3L2O4%*G~k5&h=TZjM0Uk-eJ({ z!X0W0=8(wE{92?QNR2qLXRv43NzH)^ewj87|DD*{CyneRC@pyT zS&gwZXkP@pH6|W+HCA%fErw4OKnn3O)P83Nrf6EKn&5Jp@GS&P)?WZxaz)XcP$9Iu zRUx#dWOjg<%Kr+D?XJbc-g^z2whLZSAnUu+<`l0ilHbZGiCOI5n_#Ko z(rRy=h0ON^ebLb{Kc<>rz0Z~cYsiY$*Qi3QM|eP^ZDJu-pwS6b|1*7vQQA}nAH#w* zB<|`@mIdF-;mEY}I zNaHfHH{hWx+f!|l1@?X-#u?!HS(NM{gUYtP>UzZjb{RpWnEBx*p}|7kWaFAENqB?0 zvtVrLI?0h3-@}tVj7;Mw>)`O0qjkFk+RDqjVQB`2H%*M8H!8|=+Qu6l9Gk!Si>ngP z4@NN^k=Vpmmvu&3PaO)hiTB;(DV5#(&kPP2OzAnrb&+9Tg~g$Jx?D;5PMvb$6Oi9Z z%RE2kv;M5-l$=S@@8y!)#?ou$GQ{$53;b-9(I=GXjTm~MuC_+NS`8w~{cdeq+1eK) z*)^}atg;}r4c4SIArb~Q`!wAAjYAt+YlY9z^S&?mq#*}I{`dk5_$_pemN(7 zTC>TDooLNa9V|qGoUl+Rkf>ftBj34MqSgB^3wE9&9XRPwN#8}Y zW8S*G-o$#r++9k7AkJ9mJz-8i+5jU2&|JJF+{zdA>rd)Nt#{+#c+jiP!Y=p)0el!r zY*v)$+5mJE+MSqty7_=d*XD2h8nwT1sZ<_jCzH;KSUW+jzljcSN&r}vF8lVXBKd+Z!<1}MSt3XcTt(E;;8KHt%a7F1W8mhs zX{an2A6)~a+0Ix1V6aGc1H^?a&xZA zDpF6^EKfx8pNsW_*jeuPXR@z{?(m{ zN85(x>*fxT#dE%Xr#zz$?)py2=r6f~q$@@mk4EeA{!sHH`mu(sNk;}lg7o1T-7|D<^r$lU+)ogLd-}S%XLkEbj zI3g)3En@|gdK=C15Swi<>^D>>-U!e3Z@d*&_&y``=Q-XPtoeV7|%Y==Ht@J zIWaLMooRFe{p+}kG~-p#hjHy$U!krmW~k?=E~rDCejmUg&J=SFs6wQR*)G7E)6sh{ z1n9#B^D@FI8Ng$!;0C#hG9D8w1(G_j>CzE|mGRx1i|kBG{!hJHxOLqdC}~Gj2>@a$CB%|B=DP0%pQLaP-qYG;+&2-bm#BLSj0qu zDMUVGct_4*$9#Zr=Yq(B;92EyR*TB#FKPwHNMTre0Laq`h^i<4L2km0EJ(&g@8gC53@|Ma^P#M4A+~^A~v_X~iZ< z-Uxe;zAeBw{ZRkDXleolBbiKwOm8Q2<3 z)F^&?!k#b;INQV;Ox=z(0?85cMa?769XHJbTi!HXkc-8%2=rqPF27i1Xx+`_5_Gbz zV92Q9QL0c?Z1;k=B1alMVaTVfDJiemOD zVawcf*g@L;*A`ou zL7LLBRv}SXCF?F+7WdS;L^liGOqzNu=#Mds*OQ}x7GT7Klq!=2KHR<@=7H9sA|zYF zd62U`Tiw!2m6Bn29ce;OlSQl{%Xgypy?8H95V2AL8R3BS=9lSuYm- zb+r|AVe`6-&yHyuOv}ZhiSCugUeGnqxmmNTTTHk~I~UePN_g#W2Fl6jeoca4WnL>$ z{r3ao$=PJU`S`x~648{080oTX7|6`&!A^L;X=)Xv1O&)Qg8mu%j0C`k1Y*B);^%a< zkCLcAYLwZwfu>>>*D3~V0+X<=;1^a0-N(iFD$j=vL2l_ZMEu%5^?HzcGbO5snv|i_ zq$lTI`U`N`j8cY$8C-(=Teaf%S_n`e1!ra`D}Z}#6^xg}*>Ux<55H7{6LYmI;ow&|eE&^AID-6r0YT&8)y zYR$qwX6=}Up!;z)_Dpg%8||@Y4GZi>F6w1G)g@Bp>vrUMn6!sSV$LDiPAF`2u(;8X z>=uTENY(yHQqs5F<}*m5noMuor-Uw=uTx$cDFu5HuvcvEgKwJ-3l|B4bc`Z`?88poiR-Yzq{|TGK{M zX51p&uQf=>zr6a0xm7|t4xW}!+Gj%kNLNkB7vqg9W)E4cWXC+=8t9f&Zt2|K*hVK> z>W?U*zsvMYgMw>sV^Nvn1)>6F{VE1Q%kquLZB%~cG7rG=L1D;RWM1kz!0XWA&U?CY zCW75TUa!E$H-Tl5@!kbup5yb}fnP-(ZRe0xm-n3uIZkt$ZliG47YV;ISZY%!BDJ26 zAwLtW*9L==mwkF^UReIg%6VqO2SY^;rR;&&Pp9*C(#mX!B-&Q_61gB$?{u-cdfFw#J{LgWRdK zC188gBLvw{x+cj)IfM1F(a`=EG%Cm>y<*|fO?0W=G`Q&-P_qNC`dhcl&81ImnVv(D;ygd0U! zct;*K`QW8wwSR(7a_3eeZ$+Y!?hZpwyJza9hNqD(UTF)C&nCX-YGPyy14NAArv-nn z9hmgq`se4vG){G!vbKsV!P$BZ569n{A+xvgF6?7CkP7_x5qr&rqdtTb!~TekisBk2 z10Gvy$TdPjBL!Zlh?s~Lh+jOu8u^uGVma6wWqy`l$jngrwshP)P4$MfbOQfhi;e~Q zRj7ON)GXL_Lv3JxTE`5Ag;J$2Ha2YkDC){5CSE(CAzw>#kCUvisC9ciRPy(6xZ8PV zD0$?b@lxZr3hl^BId$Ce#J@iqlo2Q}$W|s;Wk}>|q)&|CMbg(gP7$r5e2ui;h)9Aeh{N6IE z^DY#I5~=hVjk^0N07~|ELde4GEj)yj!As)BccFO7LYw+u$<^KyLX--HXu}LlhouhR z&Et3_y0vwc;)gY+hHkyhC9j$v7`q$ov`mU>d}o$KY6*A+xMSH^G2+^*Xh@r5e3)G= z9-!WWi+xtsGG3b&^*M+$D=!`02K3!TxZJ+-t<`PuP>xdb)qUh|#l*@K%Qu^By}l2- z0RVrRQ2+o)05kv&z|z^l0Vuwt+$HTc!yw&M6Y0hP0ulXyGysTs5mZuxSAbBr5!}*> zCmh^W%ynJ{6rjxBasrT{eE7+FJYD}UY!dP`uf^wucM~+`DVJ?kw-m!RAJONN&fn~q zjs+4oTRC3d&9_itU`Z}Bd^SHEw)XQkLwfc_0qm&H9$uUIiU>GlVEW*HHKAg5o-}#& zYw5D@{%;lw!IYCm(}D5E;xhN|G&~QD2vd8gLsqH$=|%b5>|}-e$}c;_C+2u({*xDeSHSG%n^l`Evm$H3G*Mkc^2Gp`cIatq_{{b=nNf!8KG@Ka<} z<$0zR#kPb=y?trMMJaM2{ z(q%X+l`wY0A6#z`oP!I#r85$TTn*@_nB6dyYCT3AL_2C~r7LKWkFRWvRj=duH>)v% z6U;+Th^x9$Q#ws--N<32b^PDBsHr?fC&dX2S|SY8GlP2&2PVI1jST+UJo^L1;T1M1 zFd?1T@|r`gG}YcCT0=OMVZhoZos2D$n6Og7+y9PIBZ?S7^(-+(Ge<3Og^IDP_!$?D zeno5N@V5F7^^$lGXLvU!-7f=z@iI$1{KvG#dLS&F*2U!&_n0#p`tc;3GdWv`=EDC* zc)oipXYOJ!`_-{2$Q05`|NW*(?nE-IO;s1AM}DI3>2||UJhhH^@*j8VOYbzti%2po zVTp%O9WN+tE~pWTdR5D%tu37OrOuQ)iTRr?j@;S%sN}ha+m*r^}2uglK#b96$I`MyJjBB%5# zaD|_Lt4o;P!1hNEB87c72-rooX%`j_@Rd>j^q4_Oy=j+lhx53)0O`4Dcf61{e)=EY zzb|ABfY`u^iPZK_{5y#nu%$q78|Qq2R=uF@&t&|LGS;9Ir9T)q$+({wqP-ET@17$D zpeNru`;#pseTy{oXp-zD+;nO~SQLQukiTdUwqK)h_-X21#_-!h1eQ6$3ccYo@ZI4w zw@JtI(3qB=)E(@I*vxH40d7L{K>0UCLEBMD@I&>>s1;qOlF(+i-u-0%$HZ2+@D!Kn zJ*W0BgUyhGP|;jLJ6GSTuP86pIzOeua-jSqp5n{#5W4w8@^}TfqbES3WcEaC{dZ&H zy362TT2%<4UFR5G$rU`I9U`~h*wMcIF8B~Pl6k~84;-Nz;Qnxv-+n(9M0!dk!W5sB ztk4bh3G-BYMgN=7&D{SFDePG{jUIU1WM#+V=XBpR#vRzCv7>Mk+qd`GY`Qy$0e1?@ zAPE)FXVo0r9pIyz=JM*~9iyjgIQM08VJ|DmFPWU2)nGRE@_3M=^n9l$9+MEaLEmoo zXKG~M3_VMOP)Bn~l$vUUg+lB?zA2s`I1cKYui|fW1MRNd0G(hS0XiYPp&nr_ZN5-H zBl0nEEL-wWEz#(lU`5xMYbm$Tnm6Pkk9iqoigjGRDfJ%GdkN#KzhW`o^o>~WDDPRL zMyTjaa2jXrHpaozS zPzWIlm3m*x!e}MMJ0fBsCu9Mf5mu)m#+d9Uu#}0=Rwpi;|BF)dXDOYg>Mgw}W(Zdy zc!UfEVbPnRA}w8EfJr$Z-UxNpi0xPYa3O4B`0y1icq9IUa>7cz3q8wFiK*#boSB&9 z!H+P4{@bBWvmI6(5u?LlW_fHlj}0pjq%g^~AzjzoHys(%ODd^`v}PX4ha-s&g4s9G ziZWPj^*O#{A&c_@^F~TjYfT52KFXyJB_^5UpgweAhCeT&VKvZ)CintLOI&K?D<~br zjSLOML%QsR6}YpD5u&Un1}kQf!%MVBSI-{Pr4IDs?7!a}9j8k~SkkuKj!~V6jFbJo zDy!1um3{>kBe(?far*G>iVVI?7F%jv+fGDPAARNS5)#wdPX)_poM&Sz+>myWv z3FbuoEL4}(_H0No^E>?_5T~KftFi^Y6kV8vFk9IMtZ@)WZ#s$fNQ1d@A- zk+NCJn%)I59)ZSLI8Lop>_CC!E-->?RpVsc~{oyh?<8a5m+H2<5CyECKWB?pYIF+`TsKF z=f+LNzC!LJaWMk%puqBQc|_KDO}P<*ZoaslY_Gg`@eO9@MvCW6A2zPOeng2=+=lEf$v-7G=;lE zSFaxyjnVf6FHvv%A4~G<9PfjU&enJnxEW{#bI$aa-f>x=dayH3kG~bO3K6WWD1S%> zCf~;!L@x!7SS{`t6Qx1bGpqCqkVL*FK$kLC1gd(I2?g zL-isuh^GbJR@hXJ<#>USVF9SJHodn)dGNjQd0^uJ!}(<>g@GMr9&Gb^Q@*BX*KvV-XhtDZ%V zt670;5F3a232Hbe%I=81r~S+ptRcixlsFx`#f1N_qG z#lsOZ$V*dq$duyBYk~f4PY<2@Yf4?Yo?2gcq7*h>lcZj+^V902YwXT%vK1$Ps5t5( z{Px~Brd0K>5G4_FF^m6mT#rs;HyJ6%e4TDwoA0u%lNr0mStnIb{>XW-p+FAoUUyWIg5I$aL8!Vw1Qv~c<)&f zum8SIBHwRxzVozTG0(_u9*Cker2diCSUHW)Aaw14D#%NtRY@|@fZKpA0d*|)9KH8f zM_^^3q1;0wk@_)npE~6;DGJ+k*CF#QqrJC(HrvZ3!gS5ref*^c*`O$6LBx7FpO{FC zk6mrO{Ax%BP2JHCxsGghoPBikkx0b`xGrk3RNM?9o@7}bNAt4V?GX={syS+<2uCF0 zNmC3fNeUn*zy`1asLvHm0&=P(aPFc3(Rz{vwY*?R(;eWKd^xX3h2E~%lf>ShlvO;P z_Nw*gEZI>%<{EPj{C%$W1Q$_nl>MV%0q=lUh)1YPW+f`XJ2U+2(?=I|o;9D#u2cO? z0hB%F_e2tb><`ah4$qYj`^P+Jjr3DvclqD(`qI32!w;iv+z*ewpjDM;sG!Jxm`h(q z6<-)zPL7hCj^KiPDFv{k9@(g(uHMp&L*n|joDPrR`E#qn+;Pj8<)^o%gDwPgb-Uh{ z+Fl>GZk{rl>}I04HpE9Sss0nqLkTA$p#6a}^M|PU&uFhHZ=i3#ewrqGB0Z&8jnU5qmZ2{8mt(!7_YC0mxcRXFau*HHm%#36f)Qr=-wA;@kO7}08PfP z#AaW|jz#g}`keaId&Go@r!iNvPZU4G31VlAxwSC<+HiI5-JR3Au45*kVTjZi`#b}X zyI#LwZa3_`F(Gg}S$9fFFvg@UvTF41R{DSayui{DiNGLDW#$}i4dC#z$jYQ+seni? zhvI1AYJZMx_0+}8)#|IPRH&MqOs?_PMCO#|w~HsBN&6yPUV)=*HIfp?68B@kEJMz1 z);Hs&8oX*e+?)-Fy-!@CEjmZ66Q@Ubh!dP`V$VY1FBuL-d^#0!SL+Dy>RmPe$Of5Z zcO-Ylb0CelbBrfAB!Phfuw&KHrZu~{oDL@DPZTUc@SEje}3qs2eliJ=&4W$nKS21&dk4w90b>dPKK zU4$KMkv$n`qYST!C7cR#oTkglSj{-4BX=|)cVJDnakmJSv(iLGzc3$-#ON=_=&q(o zrhDVON0!#+uoQAl_C{R%L7+@dkwT_CNLDNq+K#3EQWT1+Vt2Y!cp-ap6^3A@w?d*N zPom9FQTVxowKL^!3fnFpO{bywl?grhybxX1u%)m$b^e$1a(Jv^%V-x+I~D)kqQ)Ih zlz3k5ka)7zV$G-`qB)R%6t9q=qQ=T$p<*zd?FG2^`Jtb^!`FjtdUome%*oLm<=eLY zklVY$<0oPla}UvH{2kVWD$|sr;e)B!1T~rdGr9dlAtDEix@Unh(C>=Lf?6`x(dRdn zCw;;c#Z%tf?(U7^3j<3N+xZ=Bs`wtv1K*>1?K4-p51Ar|CBIkZvd61e=8kNOHb4Cw z_j%1T>XvIvyakQ`cb>27L((ZK<63N6I^GKTv6yM_sw7ws6pBu1(g7^fO-qeLBs9a0 z-_N^$8ECz?WJzmq^4Delfq(s#x@akR1z6R{Qj`zOHJ|MYTHgMlF1KE@lR$Y?9peU$ zL(N;C=c*Oeg`|fu*eW$;$>#&#qvaWeeG1|Pvd6Wev8jTOiY&{JY_@NrYoSKb)oH;{ zdk0UY>7sDEwC#n?MOY|4scGJxOg&Sx{wE$6owP8KjOOp*EkMOkYyb7!eFA^i} zcb@2x+LOxwC3OujZxkrI(EpIIvZlULS#co05t0ronP44*IcvKa}iCnqQ+!F^aMrgdd>m7h*)aLlC$SlFS)+Mtu!^k6*x}!m0(gqq`Y7fI`!*! zheG=8vA!bdjuK3?P9odt&=DdPUNKQ)@2(#55eCAV&wSxY z@rKkOrY?uCY_PxXqiElb_GoU0dqwwrX}B$%{TH3H$v~0BNo}&UrB1$qZyrw zg{5Afc^wJVTd93He5e(e0)79BQl2Gk1Q8_Eh>&=`!TxsVpB6atn(6VR$nYoZ_F-za zW5QT7pJ4F9ZoRLDyGz;E9?-BeOLh&KZVoM6cEcsav+lc)&6*eMqR27Y5 z#pfHY^YfFsi;oO25B<>rLsX^QZ_db*Js?%qi@nbo3}-IX`Fr0;uJ~fCVMlo!#Ygf| zi-xy(@3h%yLk{wI#j5TIVaWaojwX1S(8`X6{SWuFSO&+og>N)D)_DtZv71}&$X?)bctD8aUc*t5eu4y;^&(GMAj*9Gt|5H2P7 zLJlX!tMCM#f;wY&GDN!oWyiRGm$=_e3+>hUSD5?`angmk~esH?cd8oS0eZ&&En~u z-{(ZMO2NO*T8g5!k=-zLwD)a0?vWeo1UY9_TXMtt#G12O~j8HT(5eutsj2&jlyx1hg@>dTHR4TyT^8?=th zjnNT36lvTBvSbIb5aMK#0-5{n&iZlKL;M@lCwp)#2{Rw-Ox{6lc~h^UrJna$`QJ)s5rO(f0tXLc{_t9iH@2~3|KNF5} zw!z8c?hlqC@tu}34~GS;U`IBj$nXZg$l7y9N-We4;sSn#=DXqM`+$Vhg>0)15 zMzME$_4jHW=`zL-L)mv9lcBq)<9O8N-^hzLTHK=B&_8w5gMuw2@{eOs&2JX#2JT#5 z9t8X6SBIwp^0#H)sIGlu{C|PS9aroeObe|+%ld}z7ix80bKKHG*UvCJV4fWx~-mdv*M_d5zk==jk_! zg9ParjIbdROUYCbSw*tu(InX<^x^;h>5V|ID*HVvdnZY~)Cuw!XYN9Ho>@Jxs_W-P zG#jk^85#3ol_XIJm8u>E7yuyqC6BA{K)H@&jHC*(6i#GQ`t|KsW%qbq5nuHD$S-EqgZZQJVDX2(uCwr$(CZQJJl^1SakV|?fQ zs^3+k_Fa3;HRm;Xog@Q7AmG3LKIvqI=!x!%Gt*Dz9_}$?4)!?pE2sq#Z5FUxk2;G; zZy|?<`g60PyU`L??rE~UX$!$Czo-MT^#7wqWbt)4#V>|noUIDoRtR;0yVM3wtP7w7 zeRPP4f>c87O zo?_S|ZQAGcZW~lv#Ebc)IT9XBqRCH4G0G5!&bs7Uyutp*t67z+d;S`8twEzO zr>K~uKA&PJI!6%;pV#)tvbrZIADA6euEEQjWje|k(asr6!n~K`xpIEhy|CD7x4kA|rrocPr=f$r?u5NYJS+vfT4t?J}OQD8?0!11=CW(^yzQ9A}!Bgxu zTi52@I~W8Gd@R1T$Y(8~!?|Pkrjmd|@ z-vlTUcN|~9cUG4zN-N#hMf$Pg-8H{#d4J_B=4W=6Q;Y2MHYtgpPW^nd#4X^(8P~_+R5I2H% z+BP5@d8*4I0IeUR@OCmdcktyJ0)gn|qM-LesJ|8hff86QvjeK17GDOD>iN#s{dyn? zY;aS=pSt61CNk^cWVS?nFfS&by|m}ks&0^W(Zi^b2_;wTYA1DW))0S?D=D@+UsW=z zmaazI`&83)+eG?#PWR|R0WV+qjIB||5EPy_&G_M{F<4*_^=WWmK&j*PX_yC#z@JSv zuU1#~@|d&{%D*FYXHRlx*p+euMUiPE?gH<6D$Eo+uZAaK!Wn7!5sQa@rDHhd+F-KP z+u=7(&E*(q(E`_DT54VX{o}A96RFGa8w7pLni>R1#!!oAQkrZL?6XPjwL;5cXmP}L z>{LkNjvn97=b4}%_GGyieabxBEN4jtUT8MUbsO9;Ei3Q2nGJ_<^l`T4-t;cxfTJ zha%lrV9Ejs(7*BK>I z<9r)wgNz^n5l<1M)Yw=NlG3b6kwl)^jd&D;<-wAb8Bh9OK^DAoc-y*heFOqEFfY6( z&f{bH`B@tN>lNOPAfz{BZgGy=_sHhE)?}e7-UqQ%d1pPs%zNv8lW0oJULN-XVO}8$ z>t}e_wGLr_yQFQJ4y~0`2#yL-C#A|<(TaYwUWh{_nr3!DnJ(Z-W!0?mn{PHy^!p8Fh@4x zY*Z=^=0_xORRWjVC%9nbbbp%cV4D94aIlIon` zW$K2q$)ao~8Rt?gNop(Ru7#~iw2WcP&XXs=70Qh`X$W9<3{e+-Bs@J!35&cqR#=ow zU+%AM{c#N-p|gX#EeL6c)dJ$~mAL)-B0MsUpPE7i z1q!rQEv?eq%a~BO*x<*8^DNCLg&31y`p6Uxrja8oR)pTAzM{oM=#U55xJnzX(&4p& z5xKsZkqxCGzD4AI3{NSJ$L1X*(msL@TNLI?qnYn_pMW^GmE*KIv-CkJP?ImeDtBw-8>>P8yc|K zG3-Or@Jz2crtHLVUy~SmbRy$1!!ml4H!oL(>Ys3D*&t`vLg) z$(j3ENh=PRn5@Of>gk<;uo(c3a!em$Wq&W94}_#%|Ihlwk9?6C|M}{;uJw{XjLOKs zlQjGB&Yr1{B_~Q3_5mMB5ubJ9(ff}HPkG~B!6NCpL@Ar5Y(}#!I0R>t3Jw+D&Vdp% z<8Z)HM#RcKK04EVoPK60u7|N?Co4JR-0eorK&s)}D6-`2)Zh|vn>_#dR_Zl{r7rJk zd;am9Cy`*a$WHy)8`=8+p8Req8`4Fg8MoV$ZDX88H>%zON=;j_FX>fFxaCeHi$Bjs zQ_Ns-I{aCz@EhWvoXAdmF{^PuJhnsbdB>H1-&=4k^ghu);DDq>eP!u*{>>zQ+LU?A z2|tPMJyPLnJC&56*Kg;`F`&45S_jtXZPc9f_Rw0J+?N=ecZ6tHc+t4lhmGDAz|7f= zUqnUAosM;rm3-4p_Q!(k1l%wr=mN=h01!MR+}sPkO!TSLR&5to1|it#g%h)BOQIH2VjhAF1*Cfunu|{CPWZg}6OR6)2WY}GBIycfXn<8k|QnWxs!7OM3VII}E<(j;402>*f9&6SCk<`@P3tue#3N;6(K zF=>srJjD8VKV9@4%}>7#6kZb3ll06h9>jncQd zHjB}BRN^$s57q~&Cn>cV)iSGqo22s}!!ISPb(jtT&f*Q$3?lH!bZK7@Nje?N@TEB> zyD{*RA|=+s#~@AU6LN*gx>d6TO6tmH%?=xjHXE5@S1tX~WDHThq0Xp?^2~_yy2OrE zOzqB+jn0H;>Lsow)rj_u9yN zYPQz#EJBW@2>}CTcSl4eo_CJ@aeTlZO+uZ@jBnxoZCrka!c~TFlR>$RPKCls;Q>=E z_xb@rs>VT+8L$22Pv)b&SYP?H@!I6fheePl-W8bXK z3hVV9e9)koiZ^q{XqlRAwHK=KYnNII$amUTOI7}(F)^tx-xIE4CfooiDEj za1!|}{CY#bPJmK%KIAIu%kLAP{{!O`7`qd;+?O|x!nRau0j?oTDq z`qUX0dDF2tB^RgbNb%R&=L5SDg19e)PpBKIb$aKC!gCYWW(=O?_t~m1mwDVM^NXP7 z5J|AQR?{8y5tT+17d56SR|-{=Jex5wS;4YNAFTA-Nh7-Z!K31vMye%cu?ejlHAD$z zh}oK@WP}&htX$oTv9b#)mOw8M2m}&?KP8P4@h%iZTpAn^c=z7{)LMUk@Is#bLOBCm zZYvP>1XrYZ=H$?uN6I}=iM6=L?*`5Ef68t7&nDVAJ7^vm8wBt9;cja$Jr?{dLx3Xl z!QiYfLbo1^jt+0sRMgkA8J1_7VL}YWu85<%oR{7-zbw8Tt0GQ8!~)uZ6S83oRr30 zSbCS@J&fCt@ka0BYgE~o%B!Cl!dJQtZE8m^HF2Zk$>tp%gZTZ0?MTnNhqgbEzsk|+gvw4%fDMfEn zEKg`&ysE%owP?b)Wx_b7bTsuecJ(v{|9p?(rHc5AZJnlhozVWnqj3uEN~aLgwo&g9 zBAPvC)34c>oY$(%Jw|(Le1v4-$g0ky$`$4%+t5<*K{6x za$q#d8W7A2fL%NKS&_5}(6e>c`wd9?Top>(`XZ#4A9A+KZ$VpUcdO8v+dlcj{ateT zl4DY*c=@P)_24J7Le*8mXI|lRE%uRV^L)1GB}y{7rKjK6#%FHjqt`Yj`(zmZ6MwWe zR1dF6!+&H>%3W>LZ#C6d)Y%*;uX+a`3r@^eDb=*HZA7WmQs^5&zZyM3BklxfeCzA}Ree_2^pW#1s1}1!*DX)R6a;GhP zq#ht=b%b*ApA_;8N*!fRj!AD>%VTt379T-3za^~(N#$Lv$xfX8X@7jow5;*Vp5Y%k z;5Q8%Rkl1lZbgmU3|YtwX`>SkCUq|Fs2$ZzbwI~J&vivT=7vt7>#u1enRGxHZ_qfy z@=oXbRg7PfosB$|iOo2+SbYyn9vgshAICR|8F5NiOcqacq91UQ5xAO`az9hT9#v?E zX@fR)$AA2Woe;=w9w@Q>95)ytef=fk#Ke?UPi5i>F^`^M79o6%CBBCh>+YLLmDP$6 z?d^T1FFzF1A%0XfDUA#{-i^BDF@AR~ifo2WD4w=hGFR?rdojJ*7GJYa%+=O})Qp6l(bH2X zHa09;d;|(0!F@Wru+VqtsG^<7`AkO9YG%vphknX+$McB%0d}<-qkFTtBX892#*PJy z2IfnF`8PB7<{$A+5lA=eK$kSQmpt@SHqL1l%!6Ey9?5VAWxtn{_e* z>vewVb$;r#67p8?-R2pWeDqN^#+WYJ&-^y@d&r)`n6tqplb|b$u;UBtRZF+G{_ZJa zif+nQQo~0Ft|BRZ#i?&y#hSI{l7b)=LqiuyEvvV8JnlT-|2)(Fyo71Dt!`({{+5S{ zcL!UE=h_Fh_9_Eo?a!qf+8c*S;~Fyvb#2c7#%nm*O{R7!5Z9YW9~@3iOBfMDHaBh! zo#)q%4Ox^3K)E(vxy~lJx_!5c?_59*tfuc=m@ZzqXodnv&p*g7{b`3}?dT*?w^Uml zIxKHl?ljRo9R}DuE4`FDnAoQCV0rlNfNo#Mcz5r54_0zU=!t`bruTFCZuzQWV;0{} z?E`dtqizPHucggWt? zd9*E#H{v1bDWpt}^r~`R7doYA9vmczQgb3+8J%tOm_1sPAprg{!1$nCV*g!Is10li zMvILP2ZKT4cz(rLv&B^k3|iwA(VNz>_#d{$TS5H;CMemx(@R@z#NNAy7_3)K3h!ij zD3##Bf9KpGLYxFmg=9c9An4^;4)o}3mF-R&U|)|s#4TzKjz|L93B%RY?2hl_*T(Qv zS8ePJJ%;|85ICNv#J161+_gqEc=!vk@&|;LsMI<;tEp*5n+WE<_{QbL_Z4%M&c`WZLZ8ZC`RH~izCG{gqDICi(}#FjnpL`c8_ItUcnNO zw0N<8?>u9h{&K_nkXefLNF0#-j7!vy4V;h7M#wJ$u(Yt1I}#fdR!92+{e1|2kUci5 z%UAjv+9XHA$5$k#i@7hL+W0cU@*cdwJU*a@88~>Z$5UpqBjK-6;c)uHg6u5jmE*NW z2Ibx#^^@wG!dIQck0A^Jb&%#rH~8Yd^Z747^OT%f3O2N3!J>*)xy5l!!GnXQ@f(VN zC=&z4B>vk#T}56%UBI3-p%3*a84+3|mQ{;7l+~d&qT1mXhT3yZHnZc+Ww_1x@M7aQ z!9@D1RVka6WQ3hyAJIS@p!Nti!1fTko!`A}QXkQdcTP_6uh_15Hotr!4tW4E1=w*c zm%LiQx@8EwWwXA8LV*`}yIKi$(!sZ@7fuSX}-VcbI>^o+#Gzf2VfX|hC62fmF$-bZe&8sO~8 z-Obx-MVF2v;5vts;W|^EEqG1w)tRUK$*8hr{BQkhgbout+0!A<-Ybt#dS0vj!`oC* zoghN*mG{mF9)23T3)Of6S8xitOj4?*R89Z@E!c{_t7O!LJpp$K){V9bH*v$WpLN_y z+9_e#ECx(}CK$6dg4`{Z7bg=8=CR|=N%kD`IZpk8=1FyOLssZr*S<>ps z%@}##a|6}Zc3*dEWzkf!?uL8+f5{1{ERYb-Vm^?{r0q&A;WJ_eTW!A{m&x3o+!L?= zlNG2;e^dprmaSue9Scqwz-{AdVA^f!dCst4;fk%}>ISFEwPoQOfmMyzzxRRhtD4bG z^K7_kj6O5?KYxi}KjurSZk^NAsq*9lcrtTvmUjDvR^M#n5K0N#P$UIiKaA861!hiH zY1-gEpQ1bnwpOea)c@!S44@l>|6nnt#R(UP5kkTv#8LiNP|(zAB;i0q=Pq>jx5@mi z;Xq3LvU2&mY%$@7f~T04ztm-f@fezQ1?_^L{^PxEZQv@k1Ct%4|R6}VTqJB+w&M7j2mz4=Q}xL#HREq z-oGfUx&SMMiF*A7K2mIvox+L4mkkc5+pxemLPB8mH_wV<{NKF+vRy#_{Q zu&i^B>h89uBwZQvL&~7b>@Z<1#4Ci6%1QafN>NCYL8Tf`!`dTa20->?0@%<+9wm+VqtkeH#6^6*I61SC30WR4R>kptl+kZ71eXcd1W zCJK|O<>-pyP8P|kGLZ%z&biT))`uz zRF4WjwNPDk(%Wsod(R{=Dmyii%TbDzft9C&Q<(PmHjQ(1NOiQ$t>3(o$0kZ9I4A>w z<w%Dn9#MP zA}SFgjKRV2Fh=&H;qAn3@Moh6myB>DCc*46lXq#wsDjVA__X6fLAgN!H;KmXcgS=DwsnKUGDiSb`Zpzzl{EYzi!$YEfn$ z7F|VN=_R!> zpxuQIJU#qOLwlX7|Fm`}tUasAurwR^4lRR+B?+Iss>-nH-v4e=Eh$c=h@J_IhW>Y( zm>)z1wZy58gsV-pH$dsccFz+%US;Mxq4G0pm-~7?$JWajA^JeS05#Zo&-q$J0HkNa zV7Wi|uYKoS-R82+Vl#W?eIdReEejz9^oGwdi)e0SV`XLk+j0siQXzj}w0Z%xg4#pw zBJ}ENA_HB&sg}aotFJCa#(fy##&Hw9oRGRH6L!!;uBQq7Bt5pzNhx@KnJDglrCn(u z*~&LgG!anyZ|W0d=j3$th{%wIO_(5rb!(LfRrHq4{=QLeMJm&qEiz7f2Yp5N&j#WJ z_C(nR_XK%7EIJ#zd-#M274;29HK6E~%btJt%N@cpKFQ z=hTF)PaEkK$)+Lzh5(0y!D4BL#X@5^oy2NXQ}L-OXwsL#g4 z+pCO&vb4@OhV|adyj?L|gX1H|M}Pq2IFm3__G@e|z!C0tgIzFZ5q_hB5c{gx_K{nx zgpcQX6Twd?hpw7WSI_s={p%Ti!E1$Zny>TX>weGpX8*DM<@@oRpTFzN{r%X+6D60{ z7k%eoi2sS<6M_P6! z_LHrkhLqD-=Dit+JEnS(9D8w654_yNRi2KM!b=VDiK?#WEPROhM;$-Q`vMhHW?q1i z6_f7v8sz;sI1TvLPQBA=$?PqCNQehW>ELKT)p1N2x&e0n<5=(02tSQvSNiOPZxO(ztT79qoz(D}|~p4>^sbH0>H)3QF*wm#LQtjhI% zM&$XElyogw5}uhv4)45(WBCF|^zauK1IT}hiCv@FYVyn8D!|;mS$!WX)ohSU3DP@! z?qNQZxoS6s12EwV*S|aonu0Rpw)r10{2@ir`&+%hXY~*H48YPAcS@K8V1?du18|*X zzXDyJYf2aQR&hhhOWe%xeJrtRH}RLHdEama*&y|;dVURi=7hU_E{Ja+jK)j(N8=lX z;OSYuGzom~eOUnNcX_Xz4}}xJj@YV4An=_u2J!GfIfu5rR|!W4Q=n zRwecrAK184H+IVFXnn{P66y_kNAmK*sy0h_YFEl906DmV=xll3-30I-!FZ4Oeussp za!~xj_55ieg!fDGprw2E@|DXCg+LHBC#-%}m_@YaFC}(nXZrnj5Hju}@3f*tMi;Aa z8mBl!2}y2jR-g{o{Mf$~t1~B|x6PEPE;6 zZfb{oS@ReujgFrc@`u)p5bSMx=>A=3=MmaXjIqZ{&HJ~N8s8x6)>rhd1AY^xoltU!GmS0qQdhP3S5F;r#y7 zn7FtU@?)BXhR04p1M-~RDz4ih`mZpEX8dW8DBrIU z?LVEl0l{|o?fM^2gmzwl*T;vASWLT`9la-CzMj)APQa^{@-tr!w_mN;AAX+l9d9nI zZ6tV~uZZt&w?gg%#%6dnvBG@7H{l&ijMv)_1O4gjZD=Fb&eNQb&X*JL)I?sa`?(%q zao>Ft)t09h6&ZV&tiZ@1wn~7)xAcV^KM`s2t1^i-h{q`RT^se!b|2vD{%acZW@nYO zYnE2R6|tKIF$BlTxL8ZxanAT8IcYMY1G-}`#%Sf&COn_2!gtu>zza!0w4HR1!mZAu zOrvesdp09*-Mg5J>}c><6#?Ns)&1`-Gx_zwSkqyVXXRt6Ew-LqPu-R&&z;7L5J`P$ zWwDm2ukJtkMt(s*X&}2$(@&PgK_Ofmp#rhmG2F3?GDH4f4prnlHP(vx`{Ac*Msy*{ ze?s9$N-YO)>*-^LnP+2!4}OwPKX#%I-e)Z1UI@uflT-q){piy3r0B0LT|VF$$WGgn zl&6;xb->tg;UDI!!?$gM{*Zuo4f6|BKg2H@td1}U48bVFTlO_tR-2iTX1RR?5(zwZ zie>3*_j`pege4ynW5T7KA#f=irfjWpcDcEu(29##LO$Ib{m+PVV?O2Zs|H&*Kv9~l zPgIv3Ke3TlCBmiX+wXxwkr&>e->^RvJHMB`%g3xsECIfuz<{!bydy9)XhcgT4jdXh zTnJOJ=s!p8dv7k^p|5&h`g5?>WMp2AKw2Ex^oFpE{&aYOx%Sv>b*A4`mSx<=Dh+k$pq!+hZ2r&mkhHwcNqYMI(cBV8IOdRP zw^1G!Tjktohp;E~{d36&&3H-3d%Yz3GNRd}HMBNVW`n`yGSqxF3d+ceyv{}GBRd|# z^$2|dWUs;nXSJJ?+{Fl&NADJ0{-|$skS3|ymzAc_M84b0Ys>55Ib}iqrn<(nC$q;3 zH@|1G#e6u&?=!%671>(^0KRmwpjG^JTUt4t&>X4PBc_$$!@&xXn(KFIDrysC9QeXZ zVaI(Y?)HPfszbgwf$DJgsyxy2aNJ2Vp7gI0A5AS&TGr(Q5M9uamnfifKLRtl54hN% zz>CMlZef&^cHhtb6aWBZP#}%i{=Hf=JkLFiKE{dO{=P$U$z&{PS6W(qk;(Ccd5bAU z>n0v;Gwn=av`hJ?y#UQ~0UTWy9cr{0&UHzQ59uvz>Rw-QLo@+hR_$btdLAvK?mbC} z9D6H&U9h7GUj@lFt9dZG%34-t49n>gJG+789aS6m&vI3i6ef+JBuGdHqMyr!hyEN{ z?*7@GbYQCOGq8B(rJMvW?+YpWjwD{1Qu~DGkdZIDABX1=WlQup@K(lwSe&hV7HT7e zLThqR2A}3!NU9e7>7W}+fzbK__$<*Nr&J=+lkid%UGh6o1 zVVRuDdb0-6Q`s)O#+4@k(=x4>M;H0R0_#a*D?i~@%j;> zmXY+a(j9w*oZb<4qRe&=)@zWU^&!r)GiT$}vsBHz?K*E^(d37x|HRkx`#|3L1J;K3Q!~N+>!sK24&f)(SSV!chW3}<~ z*Zb<(#>}W_SVqmEouYvM3g!uYFa5^;3Kj#yEw%ljT|9Dm%9P6dmql-)Sk~z7X5bqd ziQZkV*F$L_)#*rsk+4J=AU1M20&|bugT?83q&9T$2<~s)gd`^dmiV-wHlyVXV?=)D zOc->xC$`u@{bI5z1j9!#V|8dQ*Bj z7Z(ih^=_)j>-iSaCo$KAqub6`2e8|Sc_tYPtS`;(=#f?tW6ZB6dOragUT&_UamVsF zKKc1YL+^1Vp#`PVxhN`le*oao=jYlkTN9H`?oF0Xb41Dp)iSvcW|W<#<$`{_X;(NkF74V~Ae)th zn>qz`W;#}!6SrJq$p@$2i=p)Fl0AL-l*%s|X0p@`zf6mz8yprBU4zYv43SRXY0BYV zG3u{Nq=A+dRG24jk^Ev-E_C9$2b#4;*E)lyKyfa^b2b0gi1a7tU#2~Y&*MA&##_#? zUkI-Zf(}Zn+sM7)bhCh6fY#O)L=y7{KJCmjD`O)Tr0EP5M5V-O z*>vQiU4g)h?oQ$q0A-M};*?C8?8{eP)^JUOF&OiAmD%;A7*X2NS5;BdBw@M5{mnhP zYYFjn7_M+MUS|;Rj>JfVae1P@>h}#hJ)UO<8;`vkk}kWLb;?_w7K|&!JguaeTxM|8 zwJT;RVv980cD50xH*>F{x<2mjDMK^xrQ%_){n zv~1qsKh;*4&t%$FvZ>e|m}J;llR=9rQSh=9T$97W4Q}3;dn+~9gcUxx0qX{J1P%4A zcK#!K8$!hpWvvKJs;bg%juA=$t@vB@wx8j#e;?)_WGx4(VcQMZ9#?WyHRwO%w@DqG zHmUdQ-_c+jpKtsP0NM@*^1ypw?l1MPEnCEG4t`M<)ji=0`oD+;90^;1N#8XS!1(#* zgn>CfNnmsz#I$_L!Se4;H-B^G5Y&<{8fmh2o6vOgiD2rWok|MLXuT>OD;LjToJ&Af;0Ync6QIIe;rnJ1~zv_KM^B|4D9}G!4ldmN!!;Szdq@VU1D0I>sWn0VJfSDKfI5V>zXdB z(gtfL_n4kxV?I`|%+@Dj4r)D-iUaJ^l?{uN2ao+;mBzcD1Woee?%23x9F_+?H*^$D zLlPJcjq?84Yx{)g-hg*t|5_cgA%Vp>vi_=OpCVvH(PG|7(L|i1?hq3XH9v;-BF3xU zNgIoE=Pv6SqG!Aafnjd0MG|b|b}?&Gu{ZZ);|V|xzXpeSFLLC$C>L}jiLxfTorYj# z*LWvs6^zyiHp&o5ijnZFhMi^9@XgsyD4uXM5)GEIE91hg@Og0vZTVB~nt>!*U-cC7RJa=j@wmxx^g!oIntzoNV2f5^{uu$XWi3 zOy%UF{>Nw==~3uZ$23HmokOEKjO~SbLj*@Mb%?J+No>C>0Xjwk*L59*KYQG9ZB5{8 zd~>fcE`Hh_JK%on@t6#B_R)AZ@Y-#?vTFnYTGb^s9dbIFjQYkzkZFa0^jK& z;QG2U^8%!0H`j(L>ak|I^2Zatsui5q6wEETrb+BJMYGrHSwCw+2+kg&JK_ivkbMi- z+*$M5ss(g!`#rdQ+}Pc>^gZenQaJ{TM0Iy?t#5dE&1$~bzAUvALfN*P;H-mZj4rde zwwKvLZXp2zj&juk)#5RRvMA59e@~~`=VU^2s~^lAjg?d+Oc2V`@$2g8==cel4+or? z+)gc14_*o8sjOW&yHmq+Tk84rtM9n0y%%m^+#{7k<&xT$Qlm zk)mp9($3Xi`KN#T8Uj{RttbMkY4ff|tBEA(8rkr5a6X@5l0RWKq^HU|PsZZhE(@y+ z;}V1l)=qB+#@?PvD(+6dJ`&^$4sP1HQWnav5Fmh`4wClJq_9CHFX+qb_x}*)K27A$ zAJu7LZJ(s*L!|j$hYn&t>P|+!={RZe8l<#ibR{e#6kJ43&@|{Fp+q@8mgqbr&3nP-3^@Ae~*ubq=zn;G^a)l z8RAt?)41>h0q;ZaIWY3I@pN{#e!d^5wo$s5MI=}Ib|`9-eYT$c@O!Db`|fxdGx1B~ z1e77bawF?6nW=<>n7O#jc39X_ybManoWcBR%4rR`pH z(yye3+e<6QYEM(zdAy4h8bJ^+GcjtH=-~V{U;VtA$?kq8UHAUhmOsX+%+JImq0uhs zz~7@d-nc$qrg96RyBv~hM|+Pf@k)|t?0mj|s`WqYD;Vs(l zjE*a3tyOgPkE$juQL`{b^YZ3Vog47C<$Wie;_G9_?q!7pu;rvFrmQOB?%>--_8Ror z;#J$S@(A$xI^Mmx-?6)UNyIw|24YycbC2;9r&wlPB8t5;fQs7mS)=c9Mu?52@44Vh z2(Tb-cTK@3^k89r^k& zDA_n0eS}MK|G?{o7lOjVocg{@VNi~IzX3{G!qI<6 zO2u_TtvntCnr_)mdOB;qWZ2IOp@z3OEY>!?3V^V!*egN#!uH(03$KVhPc37>DwrZa z7#nPC(57R{Sf5>PmCm36QV>bb@tp@GYP|F+f72c*J+kQjU% zk;wO062{I0RzAGEAV1*W0q0ZKJ7)m9`;|2VKuFmt7p?-L#pt&MrBrNXzh60P7|C(z zA-JhR6Tz<{BepVXNwsb7T~&M}xoB&vAJ%NtwcF^gK~5OYxFlD(Fr9`>%wNjN!_3bP zj8r1&j;<_j)pp^A9q{T?ln;hI4S(qh-88r@Sl=4LCXxh4EbA1o54)Bz+N2^u6b>bY z;58zC7x$W#{04;whF_ZzXx3)~sPfUclf*2NoD^k_E{0V)#UEpkS_3r;AN{uKZ2Z<# z=HxzT>#J)pWCYX4yP=uc7fRlBj&&yXN2{nz)HJ0eAN5c&b$w!R2Ahgx&7((sSw?^) z?ETvV$&9IgScX+Uwe_7bmHjrO{W;T;k<}cagt9LpQ@(}-_o+B2H%kaXP_Hs&#*~4L z4E?)}@2NRQ0?O1PwP?z@WPh5@sX;v*R;GSGlg98HgceiCD(r)S zXj3G;f*xEq$grl|Jw`8niA*SijfZ)}K>E?#$JMJuS~ZLSbuCNlS)*S%`@wO#SCJ;^ z&Jh=%p`@(cTnUt=mQKs90D{SgSbD*W4n{*DZz9_V*54?}6y!4XRN7OmsAy8zutjo` znIS*o-ZxpZEumVbSW}VSX#baG~Z`^vi&e+Kl*qz47)Gpdbd{P;cSMk_5vS-*c+%0xb z=t7@*XO3IHjdaUQ)FRR-)k$OW%2KBCVTBX``{y+ zy>a;t=%E@mdTZt|>KLN!`q$ddAWyUVS=!&YM!Mc{jc?xITJKIR&X8nav)L;Kg7D5f zSS3w2nWR$wjNb_OJ=-Hn4g^~az+#V&D76u-O?ouAvU$q^cPpquWWvwsVs2tyCJfw- zN+ItPL-<+t7^xEfn--hZq`%DwzQFg%1G3KRh2D4qUnDw`b_x#ApZTk*N!8adgXcI! zuF8b^i}dqM7)hfEIm;j-#$Yz36RiXyVDCV^nw$8y+ja8fxQ#0>rVQ@0jv0xAPd}9D zaeOEi?=AbFG!+?f2RHuk_rHspzY~Sj&Trm4lN7$3A^{aZ+$m>m)KXxjHl2Gq)5pjA zM@1U=P>ajK&jYH%huGXPubr^-Q*KxdmhZ%zwC{%eY`hh}d#u~kFyT-~7Serwj-f_Z zeZwcU6~qxy=~ZH;bBqNAG~9TJn|G{y)q}#=TXb$zPXs({>Us^`u3(M;EpWH_QjiUx3q@(-Ld<-wFDmwiDBuk%l@hi*8YQmxsrQ{?%bm?RI7Gew&rG<^)kV$^9+ z5t+HWZ0S>Tb;J&O?qF&LBS6A2kp@dt{Ub8pMJUG`$MsozCbcly3afSTkl}t9(8Koe z`h*Z##ze@4?(9fz@I~7jJARg!k3eW|tk?cG#;xKKc+3S5Gsh;QuDAVM7|LnTYAvD% z;8Fp*kvgU%G=f^NFZc024Q1F`N#9C$Dsn{zxY1>oF1BhelRE8aSKMI1%%t9UlQY=GKRu-=~wnH1S4_J>Gh z#}H96g#k0ddb)%yoH+)idA0RteCVOKbSkJOKd!xy=&mm9FHp6Y$R#JAW2d1goRO9> zXb;Q&OX}dE0FtZiN92u~C62>9w(Uv50c}aPV9PWuN0Qu`!U1lszK0Qx0?Ri7l0Oo5 zA}8sfy?lj%29;;E;0+w6>G$wK<-np}g(m{$GY%A0Q}L$TeV2XXus)(+J^4EW%P4zf z-EE7zvU?I7R{I3&NeO57Lg`#ti7YrkZqOrC5l8ceSDWMwTrYx-DKvxV6#jXAz5Cu3qp zA3o|oOOKCqJZ6IpTRlcPIx|3@)6kg{Zjlg}Zp@2xh9q3?7H^9T6#-K+Z~if#I^H)XNf2LNmxeqSaQ0J(4c%9)TT_-v z{n-=1btpBVgf1;nBiBulLU8~a)=u?C>n+Eqa7$e?k7hL@5P3JUupoaBxiB|Jxcd~M z+bl92#0CZnU^GEkzdIcmTVho}`5m*h5vxw|cpmXQrpkjUnN%I5cWU6(TjZn02k`rh-XImc85_xqYC^Oxp9mhH;ZKSZk#=YV$m^qtSrhytyp@X z^S0H*H$(tkVd~f;_@B{uWE#}IEYYHBYJyzlKg8-wX;ul9O2|4xn0qBeo>hrW$ypRc z21LQc3NYKpJ_wVkzdIN+Vdj!519(5;A{mRgvg%}_z;&5v$Rt*AuDJ~^Nz6$oj*iUl zJVnV=8o2YUVkWw~P6&S@-nj?^Up$NGNf^2u9e!~ljm1qUe24+O)o*B7sno?HG+R$E5PLd&oMx`uFt=Xy(D$ zwEn(F7g4zy;g?j#(ohMEnq5ZY7CV>0hfX;;;-I0o>FSsz>w?-8E;T7cP3neoVj#70 zm7qb86aGzNm{up0BWa`{Zrn?RWmBns;z3|A|&PA{6$ z%svR%RfT0$dzPOaLq0pbA=Fpi}S!eY5Kaq>SmA zV+LBrN}Q-%dH*FZrI__peMO}427a1Z0K{r$!UGM{U=X>1-_I>R+^;dm{GgA$MYf5? zSZ2{Z*;oAuk@+A%75@Ek(?(Vc<-7iAiA}#F6a0rCx8Z+=glO6qtK(#qT_(sJdUMK& z)D*~3?lTXQ#LfY%H(3rIaSF6wo63759KSUtB=~0PDjv*38<%i-jf{1?DO@`a; zadUQtJ^tYmnDj=bWn!9m`_FAMImmAAFKCcS?dW)bmsJN={qxC6?;hR;7|rc82BHgI z=2f8rXO5wslv!=3nr#fXRfv1Zyyaf;f%xasXrjSKgFT-w9Kjp?)o|K)T9W~-D)_LT z0Zpn_i&D*kM^ zH9t{?=t{J9FuC<_FZ$OP8t(AyHVRCNmZN|NH4iYc2QG@(ZH#mqPBFasRW!Pl`0Ak| zYd0;^FdAfafvm~#h)_pWBLR?vKocO@vLfXkg5x*CI)$NDg}A&x%R-K)H(99b5HwdN z4#g112QH+}%Q*ZS-$?@_=6L6vY=%%LNZW^G;slEE0zwEm@&GJDbDXF3^sfTtzdeWJ z6*kkr!$#t^$UZo7yr-=tt~ZJ^!kePB(-p*CT@4Klxsb4RK$?e7kdorKcNIRh9qYb+ zZZ|UXu8$vQgjWJq%`Hhw%sup0spqWPM+IW^-TC<@e_>p*=JBY6%JHF7l{NKJ#(1;!T}gN&enFh}>kvhwD-gu~xpZUayQ!)WMit z@c1k%ti(z*oTma}EUFYmOI5A-{D7JkXPl`-j0a01Ma-&CZZpskCMSvTFL`7<(gAzM zAHHdo>7xj&_s<7N^K&R>_!nafOgbTK3o3DBD5BLB?B2C=Iw=QhA-F@13^J87&=Sq& zn_!iVIVuX=lO=KTy`6qU=1dRB-&Ru`1qm#XMV>IpS{qb;JcrJm{rOVP^xQ|mpceFK zfJ&geAV4+Uym`S-eMq>F4;?Wtcn~+p!x3-zyR%@hzNbU*{YWX6#?t9g6l@j=KC{(Q za5q=75LrNYPB<~yR`3WPzRUy+AQ{&#w#d1gwK3I#+UwQ(+B;uZ8~QnZQ6XP-pz=N5 z^^)&4i_LBkfYNOOh9@dNb#Bo*qh^)c!~pD4Ko8BH^F&n8tF z$w!W!dJkGoEdpN}7 zlgqP<^V+tqO+|f`kF2hNXN;$%C^BBkJD)htec_&5o{r8&*PqVEmlsDhz!qBv`<*K1 z2A%f?AA_1fkz`5DZq4nGnxOENZnwX;*WY3F9K-lxzrPdA(A1y* zUVwky7U9}Q7DNBw-T1wOb_f>RMC!N@z*!Yb#?hP0=HNwdw3>x2=kYB!G%WC1+;)?7 ze0cQf;>VNA%hB;kqaz{}4S%syBdD>h!=qEZ4H>+Pi7deqg;@k&jKTYhpUzJ%SNj$y z#2F$pEBJ!EU?^SmhtcuNd%8Ng{xCXzVNV}Fv!{>L(<1~NxcVrb6{^Z_8W$dBGcpa1 z;Jv5fU_*8EU=!MGGKBKT;reL5$h62x>cBQV`u_6b;=1-|e0_OH=Lg+}TZaH@qDU`w zT&9t_6UBWYOQBmw18uLM>4j_Q$8~9^x0WpxH=hxgHZ`WS!_N8%OJwmYj(5$Sn+l#$ zBE3kLycDfNg=VN1xH66WD9@BGos~W80=$!W5#-rXnQ-|`9aj;kqT%8XGqAgSNnm32 zkBQol_pSp|Wwd!){kwZM2Xi5&;2jC++fsQe(xuH=j&RW7S`bU6(MQ3LtpDqA1i!|0 z{P(-_|EaqZ&vK}tqeQE^EO;qq%MSj&qMzoZB3FK?z^C~myzVeogufqk=pt9H&}7wY zyWkHWGdH{;=pl}3S`rNQTao`e{8mqvD$Zon<@@l5EB5XW7f0tK^d<8i-5cy&l`e1s zyf2u{VhTn`1%y|0(cD5k+T%6ykD9Pw2Ov8?wM{w9Dz9 z_PW0CWstO|qIwOoj8Ykh^2+pTL9#mwxX z$YI?j8@5$<_B-y?8IGqpRjUJ**|gxgEUMUG!M4EjEH4CIykPGz!+iJda=U$#8zK;w zkh06Pf@zDDk!nhtQrk#$28fx34r7x^QCkh~(xRbMda5$P&JV9&9}Lb9uMb|c885{> zUv@HHzCL(3c>Mu?H%E8*{^;%A?tYXP0vzYeYGgWndLw)38OhaWp5$^y#toBPl(~t#@c`jZXJq%T-wnyF+)H1>vF0LSiQq|(afqYz4WJ4= zdJ;o7#{_W5cK5Z#0+x@8(lcICNd?m*0fKb_%K~B_hEduhprK3%+T-> z+6CjqH5pKxCBtuY11L2gm6+`U)AS~_FyZDWhQC8U%d`iwwVZ~ej;4>o++7!~VWRs;GC$gQT!X;?iG*inSp5#;0r;#$iy1p{?L13qgsWYNC zC|d1OgU$lN3mu>vvli4DlH~eV<~0Bm2_rqu2D_Q$(|(~;d4nS-YZchA)1{eC@GC>p zoVJM(nvSB@f;O5`1ixLG0J|O*l&B}J#@4U}2sMH<$){5tB2Ur()_XAtF-P}>o-ZHf zjdA$O-Q9NlkBr6jWR9zuleR6y+5*^cwZK5*Zt<0cGZ+uqKri)Rst1#N+N6bfAtJ-i z#!k`|2FQZv6i7~G4`pU(jTU%0p$VB)5a@1BmpLEE-7v$cWbv|(p85n^obg;gE3?4U zp@ofU;19q(Wz}LL3K#(8bu)5q1-x#)>V|l;zxR6Y?b{nX8}l=spYaFu?+p*f(Y2w1 zW~Oa&nw*0j5LSP(EMY?8^3XNR@_Pq+yRTm(@`u^7zIfJ*M1`-czr8E+>fDfRI)#T^kq!E&ZnHJ3 zjFAC-TNY%c?3B5f$M0=t=H&P|NVtiR3>6Xxd5U3(py@^P4*-@KtMXVa%m;-4<`0Wj z-B}Kf#zy|L{+_kDQ_MnXm|{dkJj5a|Su(*YIeCo7fZ6CgZ!TD~co-0?ras?=kNPC@ z6>3TE3t5(i4tlkJeL_$w@|(Z`l$!B7QSh0$Ll%N(c%$+X6WhCn-V7j$us_;lR26lf zkkdr`scsmuJB2I-reHw497sAr2j$#Gw3>^huu<77m0WguuxbA)3WX#RRsiBu@qI!DmT;YN^RoPIpgKu=u#GPHlLUuPvdBsei4>6 zz`F;p-omZkhP{3^PhpsCi@N!>!rr}ry|P|V_M8}MwUvWUIKJ5Kf7ZwmoW%?V{x}@O zu6>!Osp93q>u{-!EEH)hCt!I5V(m4XK$a$z1)hV*)Az|Z5%{$xD%QT>%0OfT4U;<{ zv(Z3I^69{U9jq?sPJd@-Zyy46cz(Rh_(H~4@~`63klnQlg09bM%J^(nh?!@!EMJzX z62i17JDLIVqoLT&>5~`0TZ$e_)xF^@5-71wE8T~{Apmvgdl*u)cAUy(E^X3Lr^0K+ z2U5ks?GS@`-1D|N=y*h0#v$wO>+WiwsGu>tF&1Jg3ptyKW>*+=C4?(Q34pL19bgL9 zzIq-qLg2jtJ7is+rmp*~iBjn{c`cDrn~4W7^{3WR#<0owYBaW_wE*tsvM*m7 zu^iejyi5L984DOLwyw-2stR^|1*WMDpk^-`)KnGsyfBL&VL<6K$91L>(LSWLw41yR z+KG2<63C@yG!DwTIkmF6j?h_i9d`bsCvW6u;1p6LQO-p{mCu|j70esO?}EPG*{|*- z0t1DfE_r;*whR-vZPpB-q)U{AK`1jHNhp*J!QrHZ+=78^GdXptPI3jJDbY-pc$!mQ z8e%o4N^x=l84+B=A53Z~_$nDKZ?t`c8&&J8kV zxg)%-ug8}c|M3U5H4!D>hKLGOxD_ImhP;^r;0oSB;X%9$RN=F*m^C})OHr^l#DF|D zzA`V=!}7^N@uJ|%_93NG*Z5EIU{*!K(wjR*B<#o2!*eE+P2}Gu`IMz z+S}RNiQew-zutai-be)WV9p$rb^>@|-QSS2hGaA`XJIyMK^DbKd#=kaS?f;&4f6?16ahH{7aa4n=AdCHK%A=hmQf5=UZ{z^`0HeYl`_7y7B`;u zJCl5RWIi1iYEt)EIx;5^_7JGL-9W(8)~B_sMWi}!+R#gGBMfrg=xnf`4lmC~=O2a; z1cRmic_IFx1D?9?@+rFMw&Q{s?MeOkMX0dR0_{VMZZVnBlX$Ko`IAkP|HH?3ClOGg z=;-kL@bV9JdP5=of&(e-y0RFU8`6-HE`(u*p3H25p1&!tvUuLCLe%eUurozjl*NP7 zCrzOOjg8|}3sCz|-d#0i6Je;t__DL{beh(@O4GsK&hFl;jzRdnDt@RYVvK|jCn5BM z3{#`5Rx1aifXsZLg3L%s>8&!5Rt%xk58tJ)0s9Qd<{1X&&#N*~_gUYwQIxtEO`e;D z@ZQR_znZyQU7}lO&ddu? zQ>@C+CCN(d&TstdrK5(TtLU=LN|l?9qJXC{vyJtab)Su`(m2ec%pwpb?Z5fGj^a$( zpVO3QnMm!=85XjRfSl1YLzpr0%VL2f?}?lBk#QXY+F=+MoCg(ntk7cP(1I*082`$( z5e(;;eG=Q)bbwOhZEGF#XzOa)=S3{mQ%)fkkx#EeuKn2T)}He`Uf zHe}g-!h=oSau&?a>tiNZaQVdBPn1xxm}^}vgd3YTH7cg0+bUh^B2 zDyDY1k)^DGzJ{#%L7RTC!uT@aGS2v|Ta?oLTis_+Yn|*D5c~n*CvheRnJD|o4YA6q zSdy{aotz#kM8+2=++i7Fn^~_pW0<1%pGfriG~u^5!BS(Qdd)J0eu_3Jxy!|aOvuVv zu_yh=rXk#*ZDOcVDHrHc^I%Afyc3U^vQsr9a-y&YN)L~_st~2&TvcW@aB9llu!Jv( z!Lg*vd zT;lLe|1nCkJ_ohiEB<2M*{8^`J|o*ZQocLnAPsV(1NXFt+VNW#JB z%Pg<~SBdWpcwC~qjv9v6tLBXSLw^r$0cr{aA1JQyoIrcd$ zAOVy|<6$Oo&Ve@@>|&;{?yMQhrQli6yf zn`2p=H8a+<5|AsG9S*ak+awfD(lobjDEvVBJ)3pHrRu_L7ie+x*)H(6&33W7b0%%K z#3-Y}>g@U>I`*i<@Ge%T4%1<|0ZIqy1ZN1-IlKP&UKK~@qa$io6PlbT?dN^2?%5RZ z1vS@<7ZXE&VwI-kw?jOdisP#A6<2L_j*T`KA8Y7pmV(&P-J6bS4-G#Y1?Glk4TyGQ z7-35Jr_7rcgz^4*6f=w^#uUAjh|YN&#%hsQr8n<@q-6W;pm}}Hfi=ObT(~xyE#umx zw7vB^m-6_6uE0+{IP4q2yUJOW;l1qq=$)rA+$`7X{l6cdBj+KpAd&0(j6XbYR>|*M zW_7Pypr%j}O-{jenXFc&x5}+7>;A$lYmpe4{2Jl56xF`D`F7&Zd}Ru_fU?QW+cli&2}TwX0>klWGV z-8uDcLXErM*5)E|LrjIR{!?bZbt(JPg6G3pI;mcemYE)P`%uEkY3TqS3Yk5o1%+pb zG-oa+6G%jrOcR@=N>`IuEf(CCOlU;E;WZoxdY~KOEA@o@Rdr<(_A`)M+_ZrwMC<~i}%=sC=7shH-=9)>Zx!QmmdJc(T!wuRnq$m$ESf2vGun_kE| zlrH_60v2%jL%caMq#K@ZG~yXJ$HpQNpj$Tr+9Xx+?aEO7r|(>mAgH*4y-=$8V3_P$ zIhSRN5$u7|ae3WLWunW-j!X%Hyw?&fn`5I43hnFgB`e!L+-Iz;88Vd*Xs+%kBSG?B z72v2h1-(7qBbpY*D-n6)P?8?Fw%UQk8w~!CCCMrmC_{UFbt1QM`eGs_jq6geP(l)#>!?cwN@e;LqCKqCam%dFi zR@3d%h!%op8VdICl5uk7X4;joz)ZB5gexe4UBQl?+i!| z+99+s0MkqJ;ctox-GOY@Z37wM(GCMND(QGl>IGPjPA#CI=IU(i){d2RFx3>I^T2=7 zDvmv$OW^xf5XB({WUy|zfvBKV!4epV*3H8w42NKmE&=Mg3J(T4jJljFEo?_UI5*TO zWa9-To0;?^=0$>{`36;xAfHjRtc0};4dXfyfWNs&;Qock77Ys$sl4AIaRND_W9ahO z&QYy8-g{NV!n4m&Z6+Pw;!b2{gVBzO-6(k7_G+lNNIFvkbfwp@03C=na3dkX#O*<< zd9cI@0qIbx6w8tlxfzjN=smo?G;f2wLVmqATMC-DF}&FyC(1PJj<-v4Y`Ve5XYS~^ zD82!d^;xE~P7q^(c8>>j8#{z(bFKl@F882>Yi$DMaMbHV+%&XL#VjIyYJ)x|X zx~VxWxbA*0pZ)nhqE&{o>z?yG&|au-;8^0wWBEj_rc&;qC_HPCol zFVW0dMT{08b;j@ z;;3zEH^kGs7Esy&Hzj5j%2F(H5QrBXH+W&ra}4G(F3oZTW72(FAu|aqNq-fE>XC}I zM0IW=IA!fXjf;8im07#{x+62VV~-qxT`B)dR~)trC~?DzTxU~#v_ICBvZ@WP*}X{9 z$F@?rzDv3;%1}M?6kh4008u$?;{dFWnQI7n{k4E1Efh~zNB6jaMk5ZznwPJf(-!#~ zAiYU?ED?!>OC8$1R|T6DJgZV(STuXgn&i>yOO_XCyOCnH&WV&nR!&HOHgI^?CV6^H5xIs*PQ0F*HSSxM0W zSe(8KbEMl#%Wnt}KA`FdqZB#X`sJ9$w(dGP!-gA)XUPDn-Pk1RIaLWD2Ov8QWc)of zTfOOX4_;3zc#a8?A^YQII*~bF`2D!qW1CRcZsn6<+vb`I_cG5QUzJI;4&j|!}^GzLkoj0>eS4f%xKa$nGBr63|)8m z>AjwmGcB_j#pJAh+9ZTQfjDLx1*=F!!I>+BRGVnOLTaKz(~R;vUyh5&i@ABTbGH4H#{ETQM~Dl~_7ET`qkZ0Hi6a!3v)*!S1hV|U%y zx&W<++D~i<^-$51-WHFOB-Z2Z{YNj0%9%YtXvtZ8leIMtU)A5 za)ala^3sH-)9$Naje=w%b9GEhk<9gA!wxN?0o#gT5YkWYuJM(v z5Jm{W@O@bpdfv3?DX+wM#{O6MZJSyX41SF+*eO}6qKq9 zHVba2xyrQ<$|)c@lyy8dPhbjAT|s5(HMzni0;?uj&lgq5nK=lM4{%en(b$@v4XO{* z>3OxdHlK^+dzI^;?AEV*&jsZlg5leJ02ajzOuo;*>(=-`HC#V%o^FEc#u~xcci(|@ zbkmab;wxX9Ph6TEW|JHvkGLXpf>2A=-VZ@bCvedhp?{ilnA$WHaFayUM8x3U!sA#K z*2tO{LZh40)FRUNgY4hFg;}`U9n|`^@plwMMkrjst)17ys9+&C&17%FDsI9-*{sRW zLc*6kz2{5KRKYTFCkm41p{KC-UZB;p09$o|F7L zH}@=VuCtPWdCJpt!sAk2eyrWjg1O zAKeNtzV%}qu5H5>qMWOw&yH}6M4Dx;MQkYZy)4A6;sx-es3w4S4McpW7-3NrHaVA~ z|611@$FY;|l=)YdF3Ia3f~U;92crP}oAu*Ttm{zf+N588IFH80{Ui(V!F(<2C*(aO^ZwRV&72WW9$Hi0SQJ`f0iko1 zSl22UW;KGHGhDs;Y>XB}g9RZ+0fR}`S|D8*KHXa~5Qkf_#L&)Lu?()pF@-?+s4D^& z^kqY+ZPMwm5Vt7ff!*~jsJEh7a?h#ZaA%y7p|n7k56P1yP-1?3#~auc^X)SRiC>x_z9sm zIh`|dNpcPg)XQjWh)oEpPqp>Mom7=ZjB7|(Pf|XmWT7QXM9P;Ag-e3uOFwk?7pwDu zUHhrT9Zl*l`}6`I`hDyu&~Qb0sKWy;3JsTa`GXKSPYrQHst4&t*$$W~X!;TJeD#wd z+tD5CvHd;NYdx9^h`UW$ z&01LPcRE&*gStqE3D3>Bu=TyIy5Zz#&xjWtM()xlM|;#1T>pNQ{BS&KrYb=<)6p1R z!%->f075J^zt`04K}Qbz$&&6a%8|gc8QkvB$S3P4`ON7{ z8Y3Yuo*HsLcctpr^CDmnebOCv%?9a(4Jb>ZkrBGX?*9q=)OG_)id;`e&M7yPd(i^Q#ta+O3Dx9DC>=1Scf_J=PnRVu<& zevd9Vz{^yVOq6VNtV6Lqkud~M;v;NBeus)wI=&XG)u3eJ-frp*Hd+|E$1^B5Du&1v zI$I`Oor1@6r})DvC9sL=3hNj~$3v zaoDJCd%Nx21L)T8ZB6O`UxNk`Ew~&RwSs-v+2~l~Y!BHV|I{-7aLTrBzq{N1`~3eJ z^KXv-qYH5O(-lzok)4R=tVr`Cob%_ekDc`fcETm}TZx+Xx&E{x8^m0+T+SP=u+Oy( zmbVqKAX?16^|ACp2GCHY(Qg4oSM}_6B}n4~xW3inS7tI3&o7zy7%$oH%7{X}^F}9iK z795n^5R;Wa$fRQ=Dqr=qHaOG8doI(e5ZCiU=($RhA$!#<&*s#KQ(1_6o~Hed`T3rH zwbmsgPgGcZHO0?u@&UW}_0Y!E1v4LwsmxZmc=q|THfX&tBP!oc-*xa`r|(u6Y1d*M zCu-9)QOk5frLVK7P^x5^_FKRnOfu<>bSae+11QvtQEpkMg1*SoWjlk37BUWB=PC*F zabu$4R6uOJOB)QPQ|iNhEXFE1@*lQ&32Qj6Ha{hflY-mo8H@=sHV%(TkgQG=l;&I5 z`ZZRKhV^Lb>^~^o=UAwwOm*MzT76XFeHRxh`@d?^qX_H3AOkr~d>Qe8E*#-EA%(4_ z1T&Iu$_wC~I~#1P5ZkuO4#aZ@=;MiYse%?ft5Dr<+RTL4UjBrs%uBLxQoL<254Hzn7WRb8~)o z-|jf`aEmWysc6eZw3G(EhSCPfY3Pahs2?T?Ukyl9L7JIO$g{+5$WGle6Q<|SYT{fp zX|IRbug&o+|B-D7Wezcp_UUcG(QW3Tq!9K7j4;h}v$BAoLhp7R)XP}h9v zher4>L|MpKH_}Y5C?VF{A18*(;b?3f5VXMt5nuX^k*zkxwz)wHF&7!+Fs$1~`9xJ^ z12?EJg8zKR&FgZ;iS+>h*$=L^C`R3|bG_ zx8EM@BWD)+J6M^hjw%7VKE3Kw%NFyk`8>$#_Y?$tVta0}6kfHO2Wy;fmY^w=IQ8$_ z`s@cijHY4M7z4_|Fb9EL9~3I&_T`bMTspELP_78K0av?doGF)dmsd zsn`y2{isEw|4>bYe+JIi!^%v0ozpI@PamcORMIl%NO<)#K7HD8%D zSctOV#~FH75zDdCiFfM!vVKPSp#`(rmEYlu>(i^}ZoNft$Pm*5h|z)*0rho|{! z<-q&wu8lK)bZBM?YEPO~#PQaJX+Gm-Ki0=Hn&KjPXK`}UAbm;}5CdBW$MRXocGbW^ zqKl(LAM5bs;jYauI)(jra|TYbvRFQ23PMnD(qi6^i!$(gS2M2h-reKtweWU$~e8wlid+FC_%kqn60mf5Tyt3oJk`uRlDLN9fH$rtJNSjcufNKXEgzoETq7m*b2(F4@mr~*;mH}&ucs{vu-wM zvfbU$wXZJ)3>7MzV5$yBQXfO6aGwQaH6mC1x(}y)_vzC@l>Czyyg%hC`D8@(PcH5j z|4OJ(K!eRNC58PfM4oa~L=V|FKkxb}4Y~Bk`1!WBQRHZQ@p%)1GkzINOHifQ-&x_6 zRR`yf*SRX8GKt8@*cHECT)!19#M$cZ|${bP`f(&BWcTPmT((Yip zPwSDz9|}I@8D|OC^NHd`LK!ps=r`Dm+86;rf(bEf?y7n^zhSrrfG6raPErW)zz7sk zJm*EJ2W24yk`H=7jW)DQM9d2)?&G^h{igdle2h?}xaSDqC->F!Hd&~yU2W|A}-xtNV^jTF+t5S+#gV>)Lhl%DMti>Tr(e?iP$A<@@FJq z7x480a_^V(hOyNpTQ%25T0-e+n;^*YZYUtld6uN2KwTZ=qbjN_b9H(GM%&)YH5Wu0 zh`m>RR{I*x*M_^3Qxr-mN1!OILpoVmDco*h9Ypc_t9w~uiZz&{HDiLT=UVROfB5JQ0bADWzd|-((b6_oKHibV*y_C$~vC#FnLHvXqR~rRRNK0Uv zH0@c1NO%k)y%w34;D{|VoFFL30&zoNm9|v{LFI-irOda(&YGQXXi!TP@vzU2m!}N0 z6m09m$@R7`lc7Bguc>gtAcr~v_@u3zxqVZ|2mh)f{dd!Uy}4`Drm3;%3)g69>KN9v zG>EQO(wHv0Pc$}2_brz7Pdx4`4BF~UR~pJ+PF0VI{;c0)IoJAL733T~;abLEezVru z-)aH0C`Q>-{mvJFuxuK) z@X-xi{5OfnmN!5kAY6rVa${(hD(8%sKCxjb7otaL(lcSBTj+#`w7Rk4ZEOA5YPYSo zU-6a+vVS-mEiXXjTJTt4%*$gfpyt4u21h)ei-#~)fdVHuXg>kePgZ)N@w+aG-} z%}2+i#K?sxuGS_^8;AarW8t%~1##ET#EyZmB)3806ZG6b2@x0P^(!-VZF*xx5TV`M z9Zcy|+J2~8o7u)=O64%uBHF_UaJW$dD_+00JvM{Bu}4%>VRvTZ1RVys)k!#_Sh!M= z=n&W}YIDX$CG9ik@wnbhsE1GQ_Uzsm(#{I@Bh}jqE3)Hfbh#ptFa2%vsGxeuB}5| z6eY$46~h(O;Vnf-6}8#;M+|Ch-@^!C2vZy`-Un;Nt&a)Jg|b`*DZevU9=Fb*gicSd z4)&oH+uCJI!HaD+5m@l~jK>#OEKxLHn3T%F&?22ibd}WbfQwK(K{wsUCw_n4= zwEvON^)a}w$UnpGQSvf&&ULPbLIkeRTZNeMB1sKJL!+WBg6>(uOR?>j3aSuN30}KI zP{9rNQx^_wCR0i}m4O&3z=k)GKy@gSPLuRU~Cn4<`$f)swn4dp|WyLb?BB^$seHdoCEqC zpG`yQQ^gZ_M9I?iz|3OwXEo7-4eKNxVGjh{J{_{|4%=b7?4Jg&**|%1_>aW(d!@da zoHIN+Bdse@T#9MP%mb%2tR1nwR6&DVnI$g85`qZcQra9I$@-h9cBUD=#f<~Huys!M z{+n>KuMD7O@wxW*bc??XBvmLNN52t};Iq0f(bw}Ns=IN#)PHEL_t49{be`!m^c)|Z zhQH8f;jzw3=sEq@J%qlRf6zMbps(p0w8k^2F#OFb4_o7Yd@@`*C06t`Y{+(>FV3tzt4L@@0S-f^<=pW0kDB5+djbMqZEcBI&RTv@h!^bBNBCc!_Ci@q$QspXDvn6P3 z+S6tQ?a4sxLPct?SX;g>|9AUVM?BAmKKCh2!5H{^M1$!ZO3}nB(`5mX8ugj66JtNP zg7!zgxg$2{wY=aDSGVHc&w2PU>euK;y$r+PuPPJ4C+0MN%rq~ho{ zC)gt@ammnDqfw~cuNuzN29Ba^irgv08ibH=m;h= zNc@B;atFC6Vv&`6hB<-E%}@2$Kpk8N^nI`)s11b=@H3$KT=0jFnNtJ1oRij>*GT<0 z^)^EY7`d_1x6BUfZ+?ZLQ_ia=hEA?MQ249z_*z68gV?PL7I{6$FvtLRD6-?mEggLM!F)J|? zu7zPEWj4dCN0#vlpM_Sl`oaVYx@IZczIkL3))CSmKCv}I@mZhyK*jZ;ift2W?j3Mf zgq?xzN|yFq(eopGY^Q3fKcJ|6u)qImZw*|}PPanW?VvZHLf%D|E-#fT-^)~BR?M2> zvZ%5{eXcUoWc9^IEs78|dc1-%V=>P$@J)(5_cqVF2DZtzesuHa`5) z_GMvbuF%S>-Mv?V-38L})=Y~oWi8Jr4iC=`+?F!)w|anCY5aXflGbqgRpLm+ z3-rWZg&WNNqXDGiWlG|89juQWwTQa{0%r0kr4r?uGe^Q6W-o*UM}z7PF7i}BhIU@4 zDs!F5|QPk>ENyfgnsHgS==1B$9ZQ~q{ZUnA%i5u<%-p7u+^E*&NWx6+PnL+O5wI!k0d?amx#z%cG&brJ6uKR1V8P zS_Sz3dFc;2qSe#GO^E3e^m z(j~d%vMr#9+`Rqv6%whuP}4Sa;Kh^ptVG{=gb)B>6#DMBz~k0;9ypJ=(&aN?K0V5V zorAp&W0f4%E?+E{i`_- zdM?D;m8wWYF0w>qu?)ROMhXxur3^Ry5=SpqwWOmXP1TX=un)LxKFRk1%; z!PG+hu}2JV1(!?PHA4%O19c}k_-^*XA$}YMEPtXh0nKh8n54>Q1y2NqPTj8p^A#@) zOGX}wH}r&2vA|lIBX&F)( zW!-KWCkqB;n5(kV=_ppy-PGlFjYf{f1p<7;pP{NiGf0cVFQ9f4+j+gS(|B*4Q5ugU zN-*0N^M!tcbf793A<~eyRJSyjrC7Aaltn20m#KEiZR!me1b7c=R@O8Mpm@F9BT(8K zMJsuB+JV#@kD6I|8XjCxCBL5gR!AwEcF~Pj8*4-pA3WcZWwmoSYxm-Sxb~-fF|9?_Mqc^J?>2 zCTO-M8#H^4i{9GlY+7f1lES)ywwaJ=#TXsHe8e-T#W(0V5Njs#HAeF1!wGHWk6FtZ zOXZ!&gx2FiO+>p~X`7f!XCeaP5%%jHVg0+E{_fsCKOwUjhDAPsfNS%sU_jCbUW{H9 zVhEqD8%4BXle*drZ2v@pH{D8XuDENq`GDeGgYfI|x^Z3&+3wEH&Z72sAr^2tcX#$) zp9OC$zU@HTVH~_Zlkj3%K%$p*1j)YsT~Va>mlx;P&mu{#DX|j;qgdq$PeIbta$dMcV-K zcNf~fyU?y1`mgLl+ZI7mAwjB@d0^hs^XzyFg7f!ai~se(7SD3jrtR{Cm$s*%4X0^5 z=KoW?rmq^TVDqBzcd@%D);Jdj?!mh|JG0O&_n% zWBfdK;*X=XzQjxwD;~bTo%is*pVVV9H3BT?pIB9-w)(FbhT)L>q??oIm`7(1FTtoP1j-vmEV*a;paLYEXK z6g<5XMIvL%p@a4CRO+$;d-LZmHS7-m*gd|y7>`emyS?to<>kd?_fNlUQrkpi%l6L^ zolm(+41~ZHZxDP=Z39dn{eZRsC6yNKxrgoItv34~oqXC4qdo1kek$*@IlQTw{XO6G zntao3#|-~ooNBrO*By5&*}pQzyL(wzS;lw+k@nF9KD&(XYGS}Vt3fQo5_%M_jdMP zMY}uE&bQZluZH{I4)?!}cHRtkc6{l&lZ7nV-ERK`^CcD{<)!skOtg{45>aB51jz0j zvYRJ`%Bcje%?UOYyfkD*YR1!i&U-9Rg<<)uYr#~A#9Xb6mruKKLuMa6c=hVrH&Fb~ zbOGSaND> zRW!uXwZ;8D@mvn>cH#UCE>8}R&rSv#W?0w(z@onF-ijdZ>{G*IBf^r?%TI~Oq)0j) z>-I%Ch>Vx>SX@F=EF}qN+(M?h9Fps1Q7HF9)md z%=hRVBB8!9_$lN3x(;oP=IwsRK097Ze-iC8YppK$pM5tx_zasc&V@ zGEq*k>b(yd^5x%E29i;(k`5G(o=#=luQ|<|e`V>C0*T}u$!l1(AEX$%d1b~DS%|po zY`B`*JWIffn*A`oWDAvuK08x|P7@pUluKWA>0~ z7SGXR`{>-r!)2BCJ9M9)t0R?VFb{U(F3r5z11WR9a5YxF8{BBjC_sf_3NGjlMz&g_ zcI|<(7n0NZnBE2*27t^CL%BK16=vD4DJC&7VHwn7##sUl6-kj+-QVzoiCsffzg+SX z3YYBbt}h`hqTtk79XOnu(fIJp%)*BZ}Y@F7#G5ym$2}!-K8Wv4g?CS zW}|?sbfK!*oK<-$vs<$(vA(@3*x1l=*bHXMFhhMghbq%Ep!a}Po>nsn>@KbEM}Tw* z;NPp_*fuw_^?Bax!JyVHmN4c>PD)Yk2S>su5tzo=Kk^k4zpz1Lr5Rt~=EtQ<6E zWt!~l42Of=o!5<7Iry5ha^PoWcW)=`hnX{~UBXim4rGQ$0!}dQP)j2)`z%&}!-G3k z$!Kgk3Jp@u$8Z=Z+GT$CI{a-;bW-U0BXiB}?(}zQv((-#Ru`8sRnA4x=;q*A-N5AU z!UDK-&CQO!J$P&vy(ALpdM?<4h~T6ubcyQKO;;DH8$(VJ53dD zjQB5=D5TIV$5a@~di1UtIRUGWzh&e!=0Z$mngXyM-7Hj*#lxaD!BBL;dJs=A9UzzCmRdP#dNuPh!hPZ{;F#zGgDpvtlw|Vy&JcI!oS^l9RRkR>o z_ZA8pkY=9eGBVpBf;|=RXRgjhslb;A80(OXI$nXiLhKr?=FO<@*_fwDK|L?S4ngsB zI39I)E)AOko5byqdhurQZu~yN8g(*{7F_=&0yR)a=4V|01z-)^X2(aA8JshfndX%! zcp}W@p*tH+lLe_=R~mo_yMgrXFQ+oQJyo%h#cT(S7v?6hFAY;mjOVF}Zz;ylOd9BQ zA)krm=(|y5B#W+H4RYnbQ@0|)`Vly7{dS;3W`v23y*)ywKVTm;rsM8+nl3E%B4~VZ z(E5cPb8UG7{+xWCyOl(rcp_hHr52H$m&5ffgY3gAh3#GZ)Nk&D_?)eqWEkptE(%#X@CQqU?8W zg~*TH_tq=siC(}x^hw|i*x-2TV1qun%AGeV^kqYv%XuO6T&19ark2<#%2>NQ`|N@3 zX(O*@I;HITm?0a&VCMWzs>*q%H62^GcK3F);RX4U{WE*D!yecxz1?9Jfot3U&~#<7 zvx*j{Gl2LZN9<~NLdlI<9V@~?ZFz77wTad){-?WH*LXp&=|-Pe3P{7D5a<8|DF&G`b8+-BMSi^O_5umh-<_A4AAw6-Mfw=GAh#$1>Akq6(}$0x9OnP=Yu5s*@!ExFFwV z-*QtsbRA4XTvJG@YgXIrSK4uXAh+En|YJ%zh_*17jzIYF|Jy zhf9HKF*ddzn8)_1b!@gY_gY!izuBLpFvm>2A_>zWn_HhE^_(hEm~DX9>V~tDcVW+^ zYIb3dKnkYorK(USHVlV(KLdpzHtI70OppHzSs=724cVWy$~xg-HBF_AJ*X)|qa{lf zPdcfZUBOSokFQ}D7JQb9J8*9UuiKK%xt_~x*13?6gLZlNNy!jzxOIffzO> zYhn3FnkeAINdL-G!S8H*8E^%#*j96_`yD(3q^%)-banr=_HytUy&Sxt7rKZ^{b(t@ zs!B>z@v_c+$Dql(0;sjUW08Ofd^h^Qu8+o+J+*>t78inRbd~^F8XAANx)^-8ya@f= zQ4s`5$yB0)X?{2QaD6mh*YUwiIzD(w#|QO}I~gw>(e$~^QG=03x9sZt@R}`n9wrFG z)MPxq4X#M2=9o+j-COYds^q0U$;v_+4h`~J*3&20`+KhLnVOa&^BsZnQw3QGA<2RP z6@nc(`_!u)-RYp(_X97*J#W%~%}6Oc!`Eo_C*o=520Deo(k=p50kf4*U;=PKg{>7E z8w$ChVXZ9WY$gieNgBPw9HHBRp|j`~1s6s5zx2Egv761rYL{{A`cP=yHV=&q&+7;z_tqYE279lm5A)A%2Q{Bz z7XSz#ursc2aSQT1Po=P>b%QpIUiS9)`}Y6ubUUafefa>+4vzvx4i?%x+ivvsFm(T8 zY&i`6hh4|shUg5LhsYa%<}^=bEX#CRt6J&p4M4XzSOm%3XV^qci0H$cX^YtEj>J4! zkr^0JfQI=^17{?jC2)UciFW55y%5|*%L9Xg!R=IL)q~^DbZKZF`80K)wpqGFqvR4u zi9r`jU!^!mZt&{a;X>2K2np8(Ew{md1{ib0b73k8o2&?2L9x$Z+=!Qpu;CPv^8F_)CgbC1~K96pORb&{2fe}4P? z?Q7C=Eu){qaoplq@UC2>4*GS+2lHX2mWq_wv?$YRHs|YB?tyQFb@tvhi;3=cC?8Cq zM%w{Uy;9~$F*n187f5)=etk^OZ5`(3Dni9$Y=DsjzZR2vCBT!R=0#<1n5gWL?4c!SCjQdW0D9X&Ql_`6e5QqxWwv5` zP81}o*ay!gOMP0XGM%fu zl9?@+JC%(V!AoYUcikQV7c0z*?gHE_Wjxpq>LtGYCUCoM36Xu%Bzb%LP0OYPb6e%N z#Y%ty)Mn7kY?3;x4j=N8{nj(-`I=lt3oT1xX?C{VY}C!Z>5zOT^+`aBhOV*%)1q?8-)KZWq1%X{^ONr|x;SiKn8O;u3gxjVM+eTt^u@8^E z{=TQ5G4v0?)B=1Ztty&1U3i~D=Y`bbPGwooE0Y)Gu{gv3ij+HAi96&G<*stg?op}} zqWJjhnq`eQ+jL~7` zc+Q}TfYp(lg>`hK3f9XMjOrc8#8jmmWh>@;=%6XVd;r%n_I~;G14W#S9u$rQtvWY*d4i0z|;gTv$F{g)UjXg=~j_?tbuh8~>*IPxKG9*sO> z+L%Xa&gO2OFtAch^~|$DSy1Xh=%_kbz#YqWuAMmP;u_AF>r#QboLu9MlTILHX+|vA zi0QOOj9 zM(Sd;9J*xsIzoTY6BkO65`A7TiMB9Wgt5AW!rUbYZL25CBqhK`8-T+hPY`TGd*EVO zi8QYYZ~F%qxMCYEF?`s-Z}5!KYUl`=-N_Z2@^b~Zo=siLoNd03=3#(O-5;sRe-uOSyqLv z39>M_jTnXq+IcIuxq~$iAlL zjlhgHl++5j^p|1;)nZv@n%yUizX>rs?gc`RfuQ4I_#^=68-Sn3fX@k?Y*RGwMrZhN zf??{fM7``R~L3y+0J( zgGP@;f(YKqj299-$rk z-bO1S(IM9pyZ?qVt|vv|5X{l2=N@!Km;N=9c)zC`u={oIA&Fwe$gCS=mt65#uZ-YcqP00vZ zOvJX#vTc}H+j)_zZMbDvYX^O)YQjN=R{%4zOqa5hdF8PWVoVRa^XW2ot4ht>Xig{q z@z5;7h2IsJ9Xig_?j$AjuCCCleB3o>e>Yud|F>+^oy&#p8eP15^GbKEY78^0x{xcFRPY2#HSO40+y~*{pzM#FW{%`(e{oDFT=PpAKi_F2>+uRF;mw znh|OlF}U%@UiJrpmpP_F!9UE-4YhsN1xs-^O`ZjiN}R@N7W+&Ztr8(HMX9E|I(EeS zJX^(ak0zMIwy?e8SVrM^D3>`;R7gvQI4(0;&6Qv#Z&9Jm(s8AGVrcD~Z2vhBUGeX^dihwuNX%{j+0nV5UehU7Mu25&e_dYcPV*W07T(O(wzF36x}D z@tumf(ppYo_m+vQq}imPD|$5$ckCbN6(bJt#i$?z`w3KOb{?k85}B-MN#Rhl#Bh_uiZa-i?XPS9W-0te%&?Sz``XPcGtdXp1OZ{2A`~$(z{tP z#VU8rh;;G4y>Wqos$o+mm}bqxbp^xapo^W{Z8;6S(?Mw`uM9I_Yja? z&Ci+lTQQxg()^gaA88JoU;pBBAj@ioE)>>xXcC)wZ_YyS&&zxjF3kNz-R|ouDR@dF zfx~uuk`=jnKe6{rf6iHRwov(Uek^{jN;y`YM2(iyPMS}O&YdjtG@o`=AaiN_5Emy!(>j*d&D{Uw;^b|CE27U#LIe+6tb$+ zd{F`Ji8i|?>Tc#SrLlR*G#eCvgy3nFnp>}`#xuaW$i=6#q1pVE&)dR_QB}ug(|PT z@!?(F?)KP@s8~F*?fnwl4;7|`VhVDyuPrks4W!+3#DUnQE7YFtH~Q*~KC%N7DRa4? zp@zcK1n)-{1%+}hxm5W6jDuMq-tGXwyu|M3v4OzzC3UzlqtaX^SUBb7=9W z$>d@=zrrefUo7<7Z!q+@Pk@o)SFW*ostTXi>r3m-qSaf11&>_ek?LffOrb`kaN2*{ z|M2em{Nl&=fAT35m_8wR9ug1H--x?mWOF zaB4pzr*vJes&%?7r^`9xRe^|;a=PiqtyBv&nuWL=bA<;zXKwir;JfeX_kayy$HL3O z&3~R(U8C}oXAvY2RHb>oKhLXu?>QHBEZUx2!NfX)K!F12V|R#{#oWNWVdBEdVj-s# z<78@lRoK4YYHhMdBoQHzSoh7lu#X~q5%pY5Rn95UQ%sE>LK$Gb%|kV3k@uMgXJz-t zLwmNL4nz>2gnmSEG61GP{MUde6~D13XHakru)1k@+YE)@nUM5;0&UT%+TQ``X+G`B zuKjf@4v5_bhaCmOZUwX75XQa^f^F3$%cMqYoC1FyNTwF0Qp1^b_T$OL>G_#>Ke+0@ zzc?1J;f}q6T?{S+Pm;9R4ZY3wZoW@zGt-s2e)Cv#r zdLVcGeh!h_Rw}WH)p08*gWr+AQ={vBdj~wXatmYGOx78%v0Bf)>incA$rE zT_1e%X7nCoMYK{ppj3PL*qALP7?BMKQ~dY$BBn}F!<#4c_~y3AT-*!T{+dYh958ZH z&WmzT7628?dF;F^e)O%&=)f_T7w>pSA7dycgz4Y@ki#(KD%swk`&{j}S{PYs9@TXp z2TUxU)@BjxC`Mg$%s%8~Z~h>TW{jLm8ok=F#H zi1X+@1T3QsE@QJw#^l9n8Re~j0zPOAJ1&gmP!x)M6g z$4cBOJi1CXFK$&r!7E%%50p0x02S>~D+2uvU zu#*H_t06E zD#cwX7YkJ)V6qiz&Q8CgWOJKPLI~tTjjN^1Xdhpc#aL;NSNr3|`PKF7{>9n#@ci<} z{^|KgoAr`sD<^w}Hd>C#lUlp#2cpGjLv11S{EGK(lv-S<>UEkY6hiR_ z^u_I_5F(ax4i5AkHO`jg*R$5Ad#BNWJewL0+0^Z+*PH zL%uoG*7fO4;7QBKe)cSJh>PSPA<&f-ptmX(;N(^&N&v zxb4O$5}7HoYoGpzGKeYT-edM{upU*$3F(C8!3@`x|S*YaA3S9*;SrkN2=k>xrfX``0d_f<) z(p|Y&90zT)&3TfhJggzD&1h{ztqJffFB0`s1L5Ei?+pom@=JUQ$fRgJy2)1)4HjTjcjaoUcu;1I;=YL(w?0@hx|CL*c$btX$A0QU| zvDm&SnB(t%29V+5{cus>TvEG-y_ayf?`=QkmTyB4+WGA2V;o_$``e?7KD!vQXTp?q zTDP5{>Ed$ZVWyC=u1llcPjU@}h4gHH2maB;pH0bILL|9nw}5F2xO{Q!Win6mKw;!O z4D$dl6%#p*ca?BXY|OBkEHO$L3Yc=)#CcCN?!69M9>0OBc=0mLTh03wb%Uot{@ zyU|A2k}wzkT_9J3w9B=XCTX-oxdyJa)9q?ZPb5V7L_DQ z;6O=HgrQHcG!~nVzx+@5FdA-+&BbXolV#$z^%pm!YW_|fIp3-ly9`&9Cw%RPCYnpY zo;?W@4Ga5byFq^vmU8&Q^3dF+iQ49a@;!ZnenVi0J*f$QvAwkeshosx0RDe=t8MKx z{li zz*_85Kv=fwpe@XFuAkJp*W1#!V+6s3yk0*A7Z=bfAJ57nPk(7Zi^CpF^jL^tqRL58 z&c*4)K)gBaZE5%I53lqEWVU*uoyK(acGzSbw7|Q)ttxYf?x0?HC@iz$&W|M|;?P1S zgf9fFt+Z&a-VVDG@KA{02o+|~f>VNr*)^MKwhBImi--a^j?v1+8{|_{antgmOsDQA zO310lR+68lD;)VN+-6^Cw6L3^UNc5TKoEQCnj6q3xek`hNoQ&VN3yvanBRsd*cM?1 zG?J*~#nuJUD;Hxl?=&pPq=ZGMf(2pWxC(2n84KfIaJ7i=^r3`Mk)@=T#x5 z02Nm$UljH3Xhj6lxXa;|KUaDN8)uPo>=qDYr&{E6*Rkx?c~PPy3>#5pMR1~}$06ft z00*I03rNzE-XuqVkIcB`FntkooFfW4cF*Ppk5+uML?Xv2K;kW^yvxGcLPI< zQAcv4{oLiOcOaH*e4g280<@BQB+-Q zyK*omGC=l^5fMUoW-7x5DQ3Ct{hKjZNj18B*M$b**~9I+dJOqOGZ>~(>-sXaU@S5Z&D}~45P1} ze{%#~314>b$Cn4M4&g@>!aV_3+y=799h$vxzbbOAyfk?Pfd?R37%qDUVbXVoux#t6 zt|--C)VLD6RPjChH7Se5774p3NRPav3LMi%F&>vDz^r(8^&w;zLuge(H!_bAO(xZZ zB9jyfa+{#RiE)oEy_WcOBnX1M~U5xn+7Z;z?R^^Yw?=UbK zd}yH%J?wVtykc|m>GvlWZ_c~#&X142{^r|S`P77~x5NG6@GXuKrRLmH9EK^$)JJQJ zNa@=+>YYMIAHU)hUa`yC?Ou}=O+=%qos_2wsIE)?yC<-`ADmyFT)n@%etj}LUz5lZ zrm*Z-!%`O%#dO@oq!oBdKXH1>zx=l?6zt7T<9LaH3ER#Tx_j^p@+y3j5*C(fM-+wp@M0=S!|MK4-hFtF< zKD{>^NG~Uo^iy=qh9AEBuK!>EyWLFRDivhIY7PbD^<1BCh~_d!hX{Y<=U;B(m1Svh zzpUdvi2GTCRrU9GwYuun`=*&&@{f@CFRA^C8!=O7$eg;X5lXii$%twt^5B;*5+`8X|uYmy`B_&kSopS+EZC zB2oK0V4$Yad9oOtdMmy}>pUh}rT=UEr?*gVg=od2sbKI@HtSng;1>kYF& zADUccOW8cXia%MCVrBa1f(cX5)3Sx#Prrr=yUoZNQ$|*;<}p1!o}T5^VNFl8%X?79 zRJ)j3?$n@2&Qe`2!7TlHnM_q>9Z>i|{jq0=BtFrI40`7gd9$Xb`-v3?DON3Z%r$qI zsG<^sN=$PPGh=_D%CX8Tx>F;snTH%$s<}*aJ`)_A3z&@4>KXXKIyLnNAL^e$#{p+WW2*iCF30) zy~1R?&)G5R`Bz;3AiZiU7LjE+@TRgHnXw!f8S&ZlJiE!8Q^z;B{bG($T1{zw5J+60 zd9fcf0ds zbA;$XTofjHy~sLHbRf^7MIY9zRO@4*+_BmQAPwRyh;%amwGBu*=EJvG(qEI~{Y%s- zw&$}$L4&#Q6w#nHfolRnH^-Q+$!q{k$2N_JMVNkOOyh&2LTfE5n^B2RP^(8rTGndU z5;=*!{k6cef!X3S&}SP*{S)KQ3K1gEMiF+AFKn1`EmfjbuXqB(x4 z+4cG+U7TK?ozh!1OaCP#|FO{%PHeCyU>ssIl+UPkgfWONrj?K5yeJY5j6`aCBmAOB z)D;<;?6v4oP`Mz54JZ)t?RXrmLJdiw6t@W#!A+lVP&DgGJJ`aJ0+?F+u`|%rvKr5nPvUT?AY2s~Ld^s~ zX5vyomodNdhzsnI*9X3-2kP-2-toW{JD~7F1Zz6Md|Z%D#p$3t64g>F@Ba?;=>>#b zr+FHsXtGhvsmwS?(8fKtdLMy`6R=SJ?ryV-_h;w*i~iLbkC}ZXbe%Q9-Rz6^;Je-H zE84(g!<`MiMl*7)&&Kuf=eR@arYT#6$C?GLfQOmHYM*Ut3yZixSd#As@eYl;z1{Eg ze?mjMt^OAa`(rKao7z)tS8r}eX&qixRK(|FW?8XM zh?`{x=>M?Ij7}$K`KsH!0;|`-!Mk)*qnE!~>0TS$P#g>B3!;zd#|BhOnu~N%;pt}P zKR{Ar3z3Kv+ijF9ey=+zmGa!-!#@qL-@QNk@b-*GLOafel=h4rsu%_lg3XFk8Kw$W0L_-y#`iVqv!%!Vfu^1F7pn#GF?<+cfom7 zg*IzJgBG#paNKwus3Ck{?Ih;?;3ufY!l>d!do}p^=GCAtHmt^?RFf>7&Ke3h-%m=_ z#TVQrFs=<%b2~;G>E`b3 zr_{}z)W<64PQt^q^ZIw6p`Ke&(J-Zdst~0n_)qkP5lo$b!YhWW|Cc+)uYJdGeZBc5 z!+x^~B5sRf8O+f(Eq}9HODO6QmzMZ;`z7S!OUT8q6msDv+dp=&#jk>V+zPAv9mMqA z;pNOUHdA&w-O03K+EKzX;DkhEpLZa+WIH}nnOs?;^XBly8{qD~c-$tpCRjwo!$p|4 z3-hDEn$hi6#pJIL!CtEFSdM4vBi^;D0vH$Y>7Z1n=9#Y}Zph}~Dt%@%0^ri|C}xM( zjwA8Trl=8bI%WPU;<5px4wZ=0i-Dz>#cKw}`t7h^!An-2%Nr%M%`(%f#NYW&k4Xlp z(v;p{;aNZ)>mH-fRWs>Vg7gPdEYN&$vksf@M&E^qJv!;jM&3xuNu zK<(bje5`s~*lnjoS2pnPHnyW}9^7rQq7DNP6fy@bqPuvaVF;kPn!fdLIUR_YSsr{$Q6M7C zab2i=mjp5!6@+8L;tH23dRgS>^LT$bOIbT2nLZrB4Me<1%*LbQQpTb-R=+)Y=9?M zs2A<39h*-A14wUHofyrpL@a*UM8tuV{kW8X2dL$K8Q>X2N7I+u%l%)11+Fu%ew;LRe)zf z&(5yHr`uMzLNH?N(%$e zCA&mRRm%pa)ePt-uDh$u>+S~LkZ54~z)SMfy=FH{Zxf4;v9r4emiPLlcdhlk`EuO? z-?YKM{V=>bzkGK-{QlaUE9aL#o?rSV`Fo7=-o6r^4!)H>u+v8i^v(A78Sd{f-Mfx% z(AC9{v5>^BPGk4VV_i875cbwftzA$#wkx<)n*$LKDS~$36NZ2tMrkg~m02cfKF*d& z1GO?bhdM$RPOXEVFrZJ4id%35mdYJF0yrJ;&H}(oG-HTaS+nNW5hH~RXz})@T2u-M zNa-GfM53k{tfK<}mo0R(Of!T6>TNkAEd$yz{jJkUAQ!`k^TM;k8+J zy?eHhBjmSb4Nx!{Q|%bvf^&QUifo8 zmRU^$6|`S99pbQLOLkQ9Uss&Gee1U)ODAf)8hiIpOCTH6m17F{b#GiazVIOvAPfp= zn+5TC5T6M#yI5=}IVhuTK0HiL*lf?OX7hHDa=djmK%9&tC#h%n#)U_HgpVkQy@{>I z6tT#krTV5L-a*UPM&-M4zndw*+Jn(fWFrr zTDImYNtg4E(97{mNG%em*>HF!iqgUpnPSY2xohgZ*AX_@e@9%Nyc4_Fki8!4()bUy z)ZkS^i*#-jewAST0fNBjCtx15!pJ--^RW^H5j8GQ!9191GJ>97TenWy^@DUAunxacCZ+t-||<0Q)AHYjS86^at{z-zo<& z4#$vp_4Z8`PD`Ujt}C=b(VPo%pZwZ2j(NXo^~1e!ydV0a;s?AhFM6!EAMDNL=L-w+ z^V?SNIsvWz{>CcxWL>f|gLgqh#=*2xC^LLx{c0EMF z_E98E!OHRl)Q|0d=o5I|05%U|vTFsa-fVCXW9Ok`JIGOI1sePORd_eKC=xYb@OKht zp;=+AQWy;xc_Ev?uHiP>J64?K`t=+Og)?mi!Gv5Fv&SfD_D{M5rV}ggW;s$_6gN-9or>L^qvtQbJ=#OKF|G^Rer7UHGRI~7!{E{! z9T}7@El9M51+;QQyRB`Xg1`mj(g^lbu+ud*T|i28rw0KMdN|y;Tc;5D7+4HI9xx=Z z>me|)TA8+H4x<_Ys>vcr)gzR{jwsbsmPtl-B~}9bkk3Tviala5XGSV3@~Nd%MS-*e z!sc4wXR6e(_}ZF!BG%LOmpd8}kJk|sSbcM6ZAKCWj#&U%Armno0C`d5-ed)+GMhZ* zZG^uQCqE32ZNVc|$r{WMLa`ayU6$SDB99#<7mGW;Pu!iZ2?LEy9gA(2>Wh2x!}+mr zm|nf7>au3H%W@n9o}*W)~*tI@IUm ztIR>&iE^210XprSSuT29Do>Zj+a|4Z$lHWQufZ_JYk>i>~CP~ks zL=KsrIALpPsTk%GW8VA&hxRjXyUsF>SQJuBmhex#%E#DSaD3q{C$H2LOsis8>pf>| zlSZ*lmSfzLv-Cz~>8vOc%XvSOi-pS5eA+=0P`P4`Fl)?lN7Ra3hrzbvhAP6qfDc4h zY~xhfcIdOh{JU-ZiNTDAlp+M@1q21iTpaS4^nyZg9&Xcoynk|;Z(z=Dir=-1x-eV#Job75DbF-S2## z0WCySOC2wUPsn0L>{=`fZzUi0j-LOU<+5v3Zexsr2X-9coR5PN`-An}*ZSG7-G#C4 z=@0zA37Y4><`Lm+FgfTR+8;384&0dP41#X!i=Gls+fKg$p6fIY)f(Wm-gAVp1AqZr z51r)pOPmuFUg4S-I1scp+H2#Qg1mbI$G-NwB0hj!JWe1qb2N<{n~7Ot>}Z%eHk0Tj zJ4DkR9wx`PEVSDdKEnY}v;DW&9X7K%#BC0Bi-WT_d`7h?sIomll)@@6iu|%Ds({?b zi?@9F;>FiT{?Bj9Vz~%^pEQ5G7ZLE@IyZyV#ae8@dj-A?v4rjoSzi;hE;b5V7f%_u z-iocX_Q2c_+W5&r*u_%^vA2e?KW)=LKb$=t(EbqHZ@XU6wEQ;hzA>wBi_N!g@r~Mh zTdlp3R5FifD6F`wC6Kj1Uqe#nM3s+7Ei;?toq}vlQ~AJb>t(QAsd8S=7h98MCe~+~ zi6Gl-jXKDGo2I`}5Y+})+O37&hp8=MsM_M;xZ2_Y$l9VM6R)0s_n-~)F&TKV9K3Z| zcw${1UQl~MrqOx^-e)(dEe9{m!VA=#_)*wQeT^r-wj=eoVD&fmRBR*xW(%W9_bDkW%u5U-&gyY0yonVQP+>KOig;)kHq z?JYFHLs{(C)u9_BW+A~yu+nTwVmIxnUWWvd_uWPU`jLNhthdN>BzaK!>BS$Yis{5g z>593`mom#dqf%GQ(y;1_6gu5PPLdTnWy=5vdoa}7)|=?muM`G zH%LcWNEeIk;?o7p9As+4QS|pJuo%HuXw1-qsv8k$2|j=t`6Pab&@y1~R-D@Be^?`0 z_2;=1b2XmHJk@hlv3(@mRipwnVp_@zU;|E4C^Qbs#Ug|CFLO)U2n=d=IIRF%0S#`= zJ7mW+!%!-7v;b#+ZB0AoT9k2{N=!hkGTr3?|LC$b>egfUx=E+&*)BOs8Y!mz4x|>? zObf8|`Nr1MvdI6V7&*q-nerG_bI+&Yi}e#G*fkCrgRXXH9Jff5vB}jkshazg_^fFbljl!7YJe&$;#od!G$5p5 z_Iu@Dk)*cC!Hj<>;utzRoZAm35Z?0pqLmxiD}irMsD=84l*(-YVmFN4z->}}TBP*c zsOfutUxB9(lP)IQN2wOuGzGRH^d(O-Vmr?ZQL6E>gv8aq6eAl_LJ3B}dcrIYBJ4Ng zTI8y$XGH~Hre2cqIu2|^YGIkj;PI#F0a$Mw@`#WqW>|z;yXV8;lv3(#8#G&}z{&VrW zZ9h!=XNvRj?|5bq-{GR}YrRzErJ98C;8V0o`^%rx)%ca0G*4`Z28s!uQzoA5ruApt zVAm1&+~gC`=~BN{EMVbyP(XBLT|3fa_SEc$}gI@l(jnHoRi zsZQsc4Qlq%tVBImOVl#8Z1vASRi%XNM7RlgR(!8wch-&^60N(V)<`+a;rbm3zQ;oP z13xqL@#XXvCoHBOtoqo&kjXsFpKvTd-o``mSygXlFMej-QQ+UF@}YU;2^)ceH*7?k zV|~!%ISKNs;bVFdNf*%O{4Ywd zV&SKnQP{ml~&ZCwhRat9q2!=gDgR2!fvnx1fdm2mhkS$|j>7Ib-%b0c|55 z>xujNuI-zr82Nje(K7l^+=?fg1^2XO?Mw&{G7ed zlDS?$=wcIo32vuAj|{df_~Z!C4Sn!^iog131$_+i>6)K`8Opq<61KhVh>!SQZ&v8) zvM8#LVj-&;JKq4ODqERBHZKrmgiBb%ggrSmS40AgC5t<{mKa9Qt7Hdn;CS9EqHMyq z5xfU$$Tz2ED=3+pVz*TiX#&QJcGxJFd-yh#&(7ve?vFK%vIWYyg3hVoUe#%&(n?qg zYjKK`;bd7AIG}5hPTK;&+GDt)AzZ-c%D+D}c#OYpnbk#6k@B{Fg3$zmSp(X)%ye;V z$I8uzJ)*D1(A52MnG?S9KE8T;R9|3vrN>p~fK(Et$7MP~?1G)6gM)95dRzF?B>fa4 z*Q!bA;YzYg2lMO$3=Blsgb_4Pjru=k+bgsYAYo{xe6)ps6w4~jAmT*kLLp9du!T4< zP1iu1nQ3#qU`I$)rN(IS<>2vrDl|AYd?H=FwPSjsC=-;y8y-NMPL`P;d(H@yKfKac zPACKH-CMn74sN%ziyd%jVP~FGFkET%OTQcC-6~9ve*Mr= zrD+jx_Cd7XHZ;njvhBlb-Mpx}(Ddysz`ZR#t&Zy?#Ji5!ZjX)Eg?2f{oC9TDujXeM zTgcpI7sqm;t5V51gQs~8)`L!6RH~s6vpDAz(vz*kF7)};=|Ef#ul9Ti-NQ8^B;!&R zOP#Ga340{RH)gBIkxj4|->B+snom_}nUoI?ED$LG<>^I{Yg0&~2(^H=xBugcp{cJ9q=Vb|BPL^6Fe|~1lPI7$-k}j!)Q!uE|J6l2QMcB8Hx-(yt7}SLy zqvy(kXIieoOqSr_oXK3gI6M-sSLSX_y4U&H#qfY?+rg+5r71lIm-<<*PpK&INm^da zMtHPYb_Ag}H`7n1xmc)DeD|Mc7Z`~H+m0O1Y&Ctx?sxK2e=$(y_Z0YwLC5~26bVH8 z67EWxWC}9;7NxpPafs!(N^kwyKygIi`Xt=LtSD}l3mh5@u^JPdkeM=BdW&o;Nv2M% z7%%7MSRCkk+h3}R5iDaxBV&^(yW6ZWfv=uX;Ipg58Mp#9_RB#4a7z*TRch3j8X@IU zUuI|k0;RHHhJB&_DlLDdA6J0dMYR+%PH_#1?zg|oBBX_BID&_w}m{Zg(3 zT0eUh{Pe(-EXDg_7Xyfiq#R2uKCKWa;UI=>Y=*wJNz95Y(L&}njW5{D2r67t_*_~E znHBl8Cob)NBJp`;t~a_c{eXjMI*j`XBZWQi;#}Q{{=f$wvejqF@67DZBm!>%pa)<0 z&9y%wSaURya_p zYEVNOLeS+cJ+2mYeGuLz6{#mK-d~*`i&KUl=>(5m)EWO!DzhX^cP{{Sq$m-5bXLrX zhd6duq>?X+yh{_Md!~R=7S}K7WEWWcz`JY;1~9Zve`uwJOl^dZ<6SoOG5 zkFo-Q%qdyMj|{9wzCt0dmldPdnSM4^3M*?xkugGhsW?zBrRr0oNZl`S?Vx0On_i@~ z)>PW5&t5Ml6Y#J6;$VJfGS5}UeZHilyi{Xlj)q!|i5uENcbR=cW@0X3WBTh-E!8mn zMPX{r<4g6OpI+dQU%IInf#x7a0Y*(FeTz2!pYhrR=C4gjAaL=$X7>sB||?D*~D}0}Y@N5O&B* z+w6ZvX*Ty(9C`5U<>PX-u+gCf>OgZ8P1{EBlBYKQl$PqvQkIF?Ci(-d#vLCm9&i%u zhqy2RQ4~%)Xr*T=8qlc(?pZjD@Kzr04%Z1*w}+3kHG~jI0vTS=WB2^%g`Yq{w+IMS z3&1%%FdzU8GI~9#;qW!RY?bjBoGwG^09Dg+M$gEDpCbvINJ| zCLaRZ4n=PQ*bXmp!EN|DwtbkGUzJ6M_EBnw7x4yRu?^?H;Fsbq(x#k-mlTE< zB0?=2*H+tMaqje>Z9VEuz@7Cy)9d`zP#@>y11~gG&J3Ch$nsouM5P5qt`{aVyxAiP z7wDQCacr6bk+7tN0g(m7Ep~{G9ZiAh+<;GqySeK5Mvt?x&T+g$`f))oRW4YD`S56b!uYLaGmLe55uQ;I;MxdRi$)Ql$K2FR+Xp; z1}BCP`X*icfbab1z0&B$MmznC+4wpI-Q96urACb)&>D8F_(JGjN{g)0Dw~A6V}W`( z8ex5h4X8w*)Fq5r$>?NI<6a==S4!B$zXo|G{}EFr*m1)`tra(T-w|Ot+RHY9-LlB) zQs+`vjZF2=6G`e!cah0lJz8=PaM2hRtyaV`Ckngt7cWG2qaqxosE^7R6wj1fCrMJ| z`hA|&yWHn34H!#BbgN*PgtqB#0TS-nGW@jlHERhb?ysCdkAFcPeXR2LVAgmit>rj% z0%~|QWa2WFB88l#%L)@blqOvnl4RYk$#5S?Y-X!!+x;rcAY<*7N4&{ zkfeV;6~eFmW_O9do8n$y%|TrgSxM$IX{)PwXNd1a)$acMlh*BKEMuoGe|4i)u*7PwocuHl^QnxMTuj8} z@T4csPX&0TifJhqvnDEcAnQi0u8@SF)Ux~h;M309zk^eNw0W`^aXp?6%sV{MiNh6g#YZc)Q@tm{0)J<}?@xfwoK>W= ziy=mEU?>K-E+{UE0bh1iZ`u>TXRj#W6ZL*?y&8Y)>D%#c?{|C0zc*iZ@#{ZQ3gTYJ zmRzeDBkJoSyHyak$W0loAmk~{r((JABNzJvbRl!)Su<=>%P^A%p`D1sgP!@n!{b*6 zuMRtbKHl@aL#8e8&K9o}^U4Wx*8Z(F4BvfsZjMP^G5N4}_nW9{JcGoACdd(db4FCb zdXY{h9BUaFXYg@igb{jQ-I0^1Oidw>MlMn|WNHc!a==KC$vp%)16j=|02&&+kK*+{ zywfxPdRP@KDo(R>4^U{a$Wn|H0Ad@@pn786ShXn&^6sm&c?bW0OVzyy&k9|`Tf9{H zfpr;weV~KT8D=;U#K9r(LP>!${Ww8~ix46yK32Kt4=m|2Vln_!B?^4|x<5F1M-u*@ fFMnVDzWjap`||g>fB$~~00960qtPua09qIT%= 1.21.0-0' + name: cilium + sources: + - https://github.com/cilium/cilium + urls: + - cilium-1.17.0-rc.0.tgz + version: 1.17.0-rc.0 - annotations: artifacthub.io/crds: "- kind: CiliumNetworkPolicy\n version: v2\n name: ciliumnetworkpolicies.cilium.io\n \ displayName: Cilium Network Policy\n description: |\n Cilium Network @@ -425,6 +531,112 @@ entries: urls: - cilium-1.17.0-pre.0.tgz version: 1.17.0-pre.0 + - annotations: + artifacthub.io/crds: "- kind: CiliumNetworkPolicy\n version: v2\n name: ciliumnetworkpolicies.cilium.io\n + \ displayName: Cilium Network Policy\n description: |\n Cilium Network + Policies provide additional functionality beyond what\n is provided by + standard Kubernetes NetworkPolicy such as the ability\n to allow traffic + based on FQDNs, or to filter at Layer 7.\n- kind: CiliumClusterwideNetworkPolicy\n + \ version: v2\n name: ciliumclusterwidenetworkpolicies.cilium.io\n displayName: + Cilium Clusterwide Network Policy\n description: |\n Cilium Clusterwide + Network Policies support configuring network traffic\n policiies across + the entire cluster, including applying node firewalls.\n- kind: CiliumExternalWorkload\n + \ version: v2\n name: ciliumexternalworkloads.cilium.io\n displayName: Cilium + External Workload\n description: |\n Cilium External Workload supports + configuring the ability for external\n non-Kubernetes workloads to join + the cluster.\n- kind: CiliumLocalRedirectPolicy\n version: v2\n name: ciliumlocalredirectpolicies.cilium.io\n + \ displayName: Cilium Local Redirect Policy\n description: |\n Cilium + Local Redirect Policy allows local redirects to be configured\n within + a node to support use cases like Node-Local DNS or KIAM.\n- kind: CiliumNode\n + \ version: v2\n name: ciliumnodes.cilium.io\n displayName: Cilium Node\n + \ description: |\n Cilium Node represents a node managed by Cilium. It + contains a\n specification to control various node specific configuration + aspects\n and a status section to represent the status of the node.\n- + kind: CiliumIdentity\n version: v2\n name: ciliumidentities.cilium.io\n + \ displayName: Cilium Identity\n description: |\n Cilium Identity allows + introspection into security identities that\n Cilium allocates which identify + sets of labels that are assigned to\n individual endpoints in the cluster.\n- + kind: CiliumEndpoint\n version: v2\n name: ciliumendpoints.cilium.io\n displayName: + Cilium Endpoint\n description: |\n Cilium Endpoint represents the status + of individual pods or nodes in\n the cluster which are managed by Cilium, + including enforcement status,\n IP addressing and whether the networking + is successfully operational.\n- kind: CiliumEndpointSlice\n version: v2alpha1\n + \ name: ciliumendpointslices.cilium.io\n displayName: Cilium Endpoint Slice\n + \ description: |\n Cilium Endpoint Slice represents the status of groups + of pods or nodes\n in the cluster which are managed by Cilium, including + enforcement status,\n IP addressing and whether the networking is successfully + operational.\n- kind: CiliumEgressGatewayPolicy\n version: v2\n name: ciliumegressgatewaypolicies.cilium.io\n + \ displayName: Cilium Egress Gateway Policy\n description: |\n Cilium + Egress Gateway Policy provides control over the way that traffic\n leaves + the cluster and which source addresses to use for that traffic.\n- kind: CiliumClusterwideEnvoyConfig\n + \ version: v2\n name: ciliumclusterwideenvoyconfigs.cilium.io\n displayName: + Cilium Clusterwide Envoy Config\n description: |\n Cilium Clusterwide + Envoy Config specifies Envoy resources and K8s service mappings\n to be + provisioned into Cilium host proxy instances in cluster context.\n- kind: + CiliumEnvoyConfig\n version: v2\n name: ciliumenvoyconfigs.cilium.io\n displayName: + Cilium Envoy Config\n description: |\n Cilium Envoy Config specifies Envoy + resources and K8s service mappings\n to be provisioned into Cilium host + proxy instances in namespace context.\n- kind: CiliumBGPPeeringPolicy\n version: + v2alpha1\n name: ciliumbgppeeringpolicies.cilium.io\n displayName: Cilium + BGP Peering Policy\n description: |\n Cilium BGP Peering Policy instructs + Cilium to create specific BGP peering\n configurations.\n- kind: CiliumBGPClusterConfig\n + \ version: v2alpha1\n name: ciliumbgpclusterconfigs.cilium.io\n displayName: + Cilium BGP Cluster Config\n description: |\n Cilium BGP Cluster Config + instructs Cilium operator to create specific BGP cluster\n configurations.\n- + kind: CiliumBGPPeerConfig\n version: v2alpha1\n name: ciliumbgppeerconfigs.cilium.io\n + \ displayName: Cilium BGP Peer Config\n description: |\n CiliumBGPPeerConfig + is a common set of BGP peer configurations. It can be referenced \n by + multiple peers from CiliumBGPClusterConfig.\n- kind: CiliumBGPAdvertisement\n + \ version: v2alpha1\n name: ciliumbgpadvertisements.cilium.io\n displayName: + Cilium BGP Advertisement\n description: |\n CiliumBGPAdvertisement is + used to define source of BGP advertisement as well as BGP attributes \n to + be advertised with those prefixes.\n- kind: CiliumBGPNodeConfig\n version: + v2alpha1\n name: ciliumbgpnodeconfigs.cilium.io\n displayName: Cilium BGP + Node Config\n description: |\n CiliumBGPNodeConfig is read only node specific + BGP configuration. It is constructed by Cilium operator.\n It will also + contain node local BGP state information.\n- kind: CiliumBGPNodeConfigOverride\n + \ version: v2alpha1\n name: ciliumbgpnodeconfigoverrides.cilium.io\n displayName: + Cilium BGP Node Config Override\n description: |\n CiliumBGPNodeConfigOverride + can be used to override node specific BGP configuration.\n- kind: CiliumLoadBalancerIPPool\n + \ version: v2alpha1\n name: ciliumloadbalancerippools.cilium.io\n displayName: + Cilium Load Balancer IP Pool\n description: |\n Defining a Cilium Load + Balancer IP Pool instructs Cilium to assign IPs to LoadBalancer Services.\n- + kind: CiliumNodeConfig\n version: v2alpha1\n name: ciliumnodeconfigs.cilium.io\n + \ displayName: Cilium Node Configuration\n description: |\n CiliumNodeConfig + is a list of configuration key-value pairs. It is applied to\n nodes indicated + by a label selector.\n- kind: CiliumCIDRGroup\n version: v2alpha1\n name: + ciliumcidrgroups.cilium.io\n displayName: Cilium CIDR Group\n description: + |\n CiliumCIDRGroup is a list of CIDRs that can be referenced as a single + entity from CiliumNetworkPolicies.\n- kind: CiliumL2AnnouncementPolicy\n version: + v2alpha1\n name: ciliuml2announcementpolicies.cilium.io\n displayName: Cilium + L2 Announcement Policy\n description: |\n CiliumL2AnnouncementPolicy is + a policy which determines which service IPs will be announced to\n the + local area network, by which nodes, and via which interfaces.\n- kind: CiliumPodIPPool\n + \ version: v2alpha1\n name: ciliumpodippools.cilium.io\n displayName: Cilium + Pod IP Pool\n description: |\n CiliumPodIPPool defines an IP pool that + can be used for pooled IPAM (i.e. the multi-pool IPAM mode).\n" + apiVersion: v2 + appVersion: 1.16.5 + created: "2024-12-17T23:57:07.182234567Z" + description: eBPF-based Networking, Security, and Observability + digest: 182035ae7c2cf8d19490ececf618f6a11adc460ed1e7dbd38b23065f02f18b4d + home: https://cilium.io/ + icon: https://cdn.jsdelivr.net/gh/cilium/cilium@main/Documentation/images/logo-solo.svg + keywords: + - BPF + - eBPF + - Kubernetes + - Networking + - Security + - Observability + - Troubleshooting + kubeVersion: '>= 1.21.0-0' + name: cilium + sources: + - https://github.com/cilium/cilium + urls: + - cilium-1.16.5.tgz + version: 1.16.5 - annotations: artifacthub.io/crds: "- kind: CiliumNetworkPolicy\n version: v2\n name: ciliumnetworkpolicies.cilium.io\n \ displayName: Cilium Network Policy\n description: |\n Cilium Network @@ -1803,6 +2015,112 @@ entries: urls: - cilium-1.16.0-dev.tgz version: 1.16.0-dev + - annotations: + artifacthub.io/crds: "- kind: CiliumNetworkPolicy\n version: v2\n name: ciliumnetworkpolicies.cilium.io\n + \ displayName: Cilium Network Policy\n description: |\n Cilium Network + Policies provide additional functionality beyond what\n is provided by + standard Kubernetes NetworkPolicy such as the ability\n to allow traffic + based on FQDNs, or to filter at Layer 7.\n- kind: CiliumClusterwideNetworkPolicy\n + \ version: v2\n name: ciliumclusterwidenetworkpolicies.cilium.io\n displayName: + Cilium Clusterwide Network Policy\n description: |\n Cilium Clusterwide + Network Policies support configuring network traffic\n policiies across + the entire cluster, including applying node firewalls.\n- kind: CiliumExternalWorkload\n + \ version: v2\n name: ciliumexternalworkloads.cilium.io\n displayName: Cilium + External Workload\n description: |\n Cilium External Workload supports + configuring the ability for external\n non-Kubernetes workloads to join + the cluster.\n- kind: CiliumLocalRedirectPolicy\n version: v2\n name: ciliumlocalredirectpolicies.cilium.io\n + \ displayName: Cilium Local Redirect Policy\n description: |\n Cilium + Local Redirect Policy allows local redirects to be configured\n within + a node to support use cases like Node-Local DNS or KIAM.\n- kind: CiliumNode\n + \ version: v2\n name: ciliumnodes.cilium.io\n displayName: Cilium Node\n + \ description: |\n Cilium Node represents a node managed by Cilium. It + contains a\n specification to control various node specific configuration + aspects\n and a status section to represent the status of the node.\n- + kind: CiliumIdentity\n version: v2\n name: ciliumidentities.cilium.io\n + \ displayName: Cilium Identity\n description: |\n Cilium Identity allows + introspection into security identities that\n Cilium allocates which identify + sets of labels that are assigned to\n individual endpoints in the cluster.\n- + kind: CiliumEndpoint\n version: v2\n name: ciliumendpoints.cilium.io\n displayName: + Cilium Endpoint\n description: |\n Cilium Endpoint represents the status + of individual pods or nodes in\n the cluster which are managed by Cilium, + including enforcement status,\n IP addressing and whether the networking + is successfully operational.\n- kind: CiliumEndpointSlice\n version: v2alpha1\n + \ name: ciliumendpointslices.cilium.io\n displayName: Cilium Endpoint Slice\n + \ description: |\n Cilium Endpoint Slice represents the status of groups + of pods or nodes\n in the cluster which are managed by Cilium, including + enforcement status,\n IP addressing and whether the networking is successfully + operational.\n- kind: CiliumEgressGatewayPolicy\n version: v2\n name: ciliumegressgatewaypolicies.cilium.io\n + \ displayName: Cilium Egress Gateway Policy\n description: |\n Cilium + Egress Gateway Policy provides control over the way that traffic\n leaves + the cluster and which source addresses to use for that traffic.\n- kind: CiliumClusterwideEnvoyConfig\n + \ version: v2\n name: ciliumclusterwideenvoyconfigs.cilium.io\n displayName: + Cilium Clusterwide Envoy Config\n description: |\n Cilium Clusterwide + Envoy Config specifies Envoy resources and K8s service mappings\n to be + provisioned into Cilium host proxy instances in cluster context.\n- kind: + CiliumEnvoyConfig\n version: v2\n name: ciliumenvoyconfigs.cilium.io\n displayName: + Cilium Envoy Config\n description: |\n Cilium Envoy Config specifies Envoy + resources and K8s service mappings\n to be provisioned into Cilium host + proxy instances in namespace context.\n- kind: CiliumBGPPeeringPolicy\n version: + v2alpha1\n name: ciliumbgppeeringpolicies.cilium.io\n displayName: Cilium + BGP Peering Policy\n description: |\n Cilium BGP Peering Policy instructs + Cilium to create specific BGP peering\n configurations.\n- kind: CiliumBGPClusterConfig\n + \ version: v2alpha1\n name: ciliumbgpclusterconfigs.cilium.io\n displayName: + Cilium BGP Cluster Config\n description: |\n Cilium BGP Cluster Config + instructs Cilium operator to create specific BGP cluster\n configurations.\n- + kind: CiliumBGPPeerConfig\n version: v2alpha1\n name: ciliumbgppeerconfigs.cilium.io\n + \ displayName: Cilium BGP Peer Config\n description: |\n CiliumBGPPeerConfig + is a common set of BGP peer configurations. It can be referenced \n by + multiple peers from CiliumBGPClusterConfig.\n- kind: CiliumBGPAdvertisement\n + \ version: v2alpha1\n name: ciliumbgpadvertisements.cilium.io\n displayName: + Cilium BGP Advertisement\n description: |\n CiliumBGPAdvertisement is + used to define source of BGP advertisement as well as BGP attributes \n to + be advertised with those prefixes.\n- kind: CiliumBGPNodeConfig\n version: + v2alpha1\n name: ciliumbgpnodeconfigs.cilium.io\n displayName: Cilium BGP + Node Config\n description: |\n CiliumBGPNodeConfig is read only node specific + BGP configuration. It is constructed by Cilium operator.\n It will also + contain node local BGP state information.\n- kind: CiliumBGPNodeConfigOverride\n + \ version: v2alpha1\n name: ciliumbgpnodeconfigoverrides.cilium.io\n displayName: + Cilium BGP Node Config Override\n description: |\n CiliumBGPNodeConfigOverride + can be used to override node specific BGP configuration.\n- kind: CiliumLoadBalancerIPPool\n + \ version: v2alpha1\n name: ciliumloadbalancerippools.cilium.io\n displayName: + Cilium Load Balancer IP Pool\n description: |\n Defining a Cilium Load + Balancer IP Pool instructs Cilium to assign IPs to LoadBalancer Services.\n- + kind: CiliumNodeConfig\n version: v2alpha1\n name: ciliumnodeconfigs.cilium.io\n + \ displayName: Cilium Node Configuration\n description: |\n CiliumNodeConfig + is a list of configuration key-value pairs. It is applied to\n nodes indicated + by a label selector.\n- kind: CiliumCIDRGroup\n version: v2alpha1\n name: + ciliumcidrgroups.cilium.io\n displayName: Cilium CIDR Group\n description: + |\n CiliumCIDRGroup is a list of CIDRs that can be referenced as a single + entity from CiliumNetworkPolicies.\n- kind: CiliumL2AnnouncementPolicy\n version: + v2alpha1\n name: ciliuml2announcementpolicies.cilium.io\n displayName: Cilium + L2 Announcement Policy\n description: |\n CiliumL2AnnouncementPolicy is + a policy which determines which service IPs will be announced to\n the + local area network, by which nodes, and via which interfaces.\n- kind: CiliumPodIPPool\n + \ version: v2alpha1\n name: ciliumpodippools.cilium.io\n displayName: Cilium + Pod IP Pool\n description: |\n CiliumPodIPPool defines an IP pool that + can be used for pooled IPAM (i.e. the multi-pool IPAM mode).\n" + apiVersion: v2 + appVersion: 1.15.12 + created: "2024-12-17T16:25:27.254092202Z" + description: eBPF-based Networking, Security, and Observability + digest: 837a71ecde4a6260ede3cff8789bc18fd4ca2225ec9b43c05c742e0bcbcaa59b + home: https://cilium.io/ + icon: https://cdn.jsdelivr.net/gh/cilium/cilium@main/Documentation/images/logo-solo.svg + keywords: + - BPF + - eBPF + - Kubernetes + - Networking + - Security + - Observability + - Troubleshooting + kubeVersion: '>= 1.16.0-0' + name: cilium + sources: + - https://github.com/cilium/cilium + urls: + - cilium-1.15.12.tgz + version: 1.15.12 - annotations: artifacthub.io/crds: "- kind: CiliumNetworkPolicy\n version: v2\n name: ciliumnetworkpolicies.cilium.io\n \ displayName: Cilium Network Policy\n description: |\n Cilium Network @@ -3913,6 +4231,151 @@ entries: description: | CiliumPodIPPool defines an IP pool that can be used for pooled IPAM (i.e. the multi-pool IPAM mode). apiVersion: v2 + appVersion: 1.14.18 + created: "2024-12-17T12:12:06.952086209Z" + description: eBPF-based Networking, Security, and Observability + digest: 96a7e6e3b911eb746bac6aac9e7e74c25e1b32f3cfe019847c77081673eab6b4 + home: https://cilium.io/ + icon: https://cdn.jsdelivr.net/gh/cilium/cilium@main/Documentation/images/logo-solo.svg + keywords: + - BPF + - eBPF + - Kubernetes + - Networking + - Security + - Observability + - Troubleshooting + kubeVersion: '>= 1.16.0-0' + name: cilium + sources: + - https://github.com/cilium/cilium + urls: + - cilium-1.14.18.tgz + version: 1.14.18 + - annotations: + artifacthub.io/crds: | + - kind: CiliumNetworkPolicy + version: v2 + name: ciliumnetworkpolicies.cilium.io + displayName: Cilium Network Policy + description: | + Cilium Network Policies provide additional functionality beyond what + is provided by standard Kubernetes NetworkPolicy such as the ability + to allow traffic based on FQDNs, or to filter at Layer 7. + - kind: CiliumClusterwideNetworkPolicy + version: v2 + name: ciliumclusterwidenetworkpolicies.cilium.io + displayName: Cilium Clusterwide Network Policy + description: | + Cilium Clusterwide Network Policies support configuring network traffic + policiies across the entire cluster, including applying node firewalls. + - kind: CiliumExternalWorkload + version: v2 + name: ciliumexternalworkloads.cilium.io + displayName: Cilium External Workload + description: | + Cilium External Workload supports configuring the ability for external + non-Kubernetes workloads to join the cluster. + - kind: CiliumLocalRedirectPolicy + version: v2 + name: ciliumlocalredirectpolicies.cilium.io + displayName: Cilium Local Redirect Policy + description: | + Cilium Local Redirect Policy allows local redirects to be configured + within a node to support use cases like Node-Local DNS or KIAM. + - kind: CiliumNode + version: v2 + name: ciliumnodes.cilium.io + displayName: Cilium Node + description: | + Cilium Node represents a node managed by Cilium. It contains a + specification to control various node specific configuration aspects + and a status section to represent the status of the node. + - kind: CiliumIdentity + version: v2 + name: ciliumidentities.cilium.io + displayName: Cilium Identity + description: | + Cilium Identity allows introspection into security identities that + Cilium allocates which identify sets of labels that are assigned to + individual endpoints in the cluster. + - kind: CiliumEndpoint + version: v2 + name: ciliumendpoints.cilium.io + displayName: Cilium Endpoint + description: | + Cilium Endpoint represents the status of individual pods or nodes in + the cluster which are managed by Cilium, including enforcement status, + IP addressing and whether the networking is succesfully operational. + - kind: CiliumEndpointSlice + version: v2alpha1 + name: ciliumendpointslices.cilium.io + displayName: Cilium Endpoint Slice + description: | + Cilium Endpoint Slice represents the status of groups of pods or nodes + in the cluster which are managed by Cilium, including enforcement status, + IP addressing and whether the networking is succesfully operational. + - kind: CiliumEgressGatewayPolicy + version: v2 + name: ciliumegressgatewaypolicies.cilium.io + displayName: Cilium Egress Gateway Policy + description: | + Cilium Egress Gateway Policy provides control over the way that traffic + leaves the cluster and which source addresses to use for that traffic. + - kind: CiliumClusterwideEnvoyConfig + version: v2 + name: ciliumclusterwideenvoyconfigs.cilium.io + displayName: Cilium Clusterwide Envoy Config + description: | + Cilium Clusterwide Envoy Config specifies Envoy resources and K8s service mappings + to be provisioned into Cilium host proxy instances in cluster context. + - kind: CiliumEnvoyConfig + version: v2 + name: ciliumenvoyconfigs.cilium.io + displayName: Cilium Envoy Config + description: | + Cilium Envoy Config specifies Envoy resources and K8s service mappings + to be provisioned into Cilium host proxy instances in namespace context. + - kind: CiliumBGPPeeringPolicy + version: v2alpha1 + name: ciliumbgppeeringpolicies.cilium.io + displayName: Cilium BGP Peering Policy + description: | + Cilium BGP Peering Policy instructs Cilium to create specific BGP peering + configurations. + - kind: CiliumLoadBalancerIPPool + version: v2alpha1 + name: ciliumloadbalancerippools.cilium.io + displayName: Cilium Load Balancer IP Pool + description: | + Defining a Cilium Load Balancer IP Pool instructs Cilium to assign IPs to LoadBalancer Services. + - kind: CiliumNodeConfig + version: v2alpha1 + name: ciliumnodeconfigs.cilium.io + displayName: Cilium Node Configuration + description: | + CiliumNodeConfig is a list of configuration key-value pairs. It is applied to + nodes indicated by a label selector. + - kind: CiliumCIDRGroup + version: v2alpha1 + name: ciliumcidrgroups.cilium.io + displayName: Cilium CIDR Group + description: | + CiliumCIDRGroup is a list of CIDRs that can be referenced as a single entity from CiliumNetworkPolicies. + - kind: CiliumL2AnnouncementPolicy + version: v2alpha1 + name: ciliuml2announcementpolicies.cilium.io + displayName: Cilium L2 Announcement Policy + description: | + CiliumL2AnnouncementPolicy is a policy which determines which service IPs will be announced to + the local area network, by which nodes, and via which interfaces. + - kind: CiliumPodIPPool + version: v2alpha1 + name: ciliumpodippools.cilium.io + displayName: Cilium Pod IP Pool + description: | + CiliumPodIPPool defines an IP pool that can be used for pooled IPAM (i.e. the multi-pool IPAM mode). + apiVersion: v2 appVersion: 1.14.17 created: "2024-11-20T09:17:34.499269465Z" description: eBPF-based Networking, Security, and Observability @@ -20933,6 +21396,16 @@ entries: - cilium-1.6.5.tgz version: 1.6.5 tetragon: + - apiVersion: v2 + appVersion: 1.3.0 + created: "2024-12-13T13:24:53.007466361Z" + description: Helm chart for Tetragon + digest: 19bb9f3777ec823d43e7e5a1d2d6c8ef2320b54372f493d3fe460a0f842995e3 + name: tetragon + type: application + urls: + - tetragon-1.3.0.tgz + version: 1.3.0 - apiVersion: v2 appVersion: 1.2.1 created: "2024-11-27T11:05:58.573950346Z" @@ -20945,9 +21418,9 @@ entries: version: 1.2.1 - apiVersion: v2 appVersion: 1.2.0 - created: "2024-09-05T13:21:20.070471945Z" + created: "2024-12-13T13:21:53.111318705Z" description: Helm chart for Tetragon - digest: 711faa2847966e52323f92e50ca5da69a462046470a2427176d273b1e1899d8e + digest: c3bfb7cebf8fd777120c07ea1b6707436e6219fdde4bd9966f55bfbc79a5c295 name: tetragon type: application urls: @@ -21133,4 +21606,4 @@ entries: urls: - tetragon-0.8.0.tgz version: 0.8.0 -generated: "2024-12-02T17:17:27.239332118Z" +generated: "2024-12-18T15:38:28.689656249Z" diff --git a/vendor/github.com/cilium/charts/tetragon-1.3.0.tgz b/vendor/github.com/cilium/charts/tetragon-1.3.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..d070c5534e803051168fdfbb1b36ed73ba7226e8 GIT binary patch literal 32933 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/cilium/cilium/api/v1/flow/flow.pb.go b/vendor/github.com/cilium/cilium/api/v1/flow/flow.pb.go index a514552de4..199c59e375 100644 --- a/vendor/github.com/cilium/cilium/api/v1/flow/flow.pb.go +++ b/vendor/github.com/cilium/cilium/api/v1/flow/flow.pb.go @@ -3,8 +3,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.2 -// protoc v5.29.1 +// protoc-gen-go v1.36.1 +// protoc v5.29.2 // source: flow/flow.proto package flow @@ -1370,11 +1370,8 @@ func (DebugEventType) EnumDescriptor() ([]byte, []int) { } type Flow struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Time *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Time *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` // uuid is a universally unique identifier for this flow. Uuid string `protobuf:"bytes,34,opt,name=uuid,proto3" json:"uuid,omitempty"` Verdict Verdict `protobuf:"varint,2,opt,name=verdict,proto3,enum=flow.Verdict" json:"verdict,omitempty"` @@ -1471,6 +1468,8 @@ type Flow struct { EgressDeniedBy []*Policy `protobuf:"bytes,21004,rep,name=egress_denied_by,json=egressDeniedBy,proto3" json:"egress_denied_by,omitempty"` // The CiliumNetworkPolicies denying the ingress of the flow. IngressDeniedBy []*Policy `protobuf:"bytes,21005,rep,name=ingress_denied_by,json=ingressDeniedBy,proto3" json:"ingress_denied_by,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Flow) Reset() { @@ -1787,12 +1786,11 @@ func (x *Flow) GetIngressDeniedBy() []*Policy { } type FileInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Line uint32 `protobuf:"varint,2,opt,name=line,proto3" json:"line,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Line uint32 `protobuf:"varint,2,opt,name=line,proto3" json:"line,omitempty"` + sizeCache protoimpl.SizeCache } func (x *FileInfo) Reset() { @@ -1840,18 +1838,17 @@ func (x *FileInfo) GetLine() uint32 { } type Layer4 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Protocol: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Protocol: // // *Layer4_TCP // *Layer4_UDP // *Layer4_ICMPv4 // *Layer4_ICMPv6 // *Layer4_SCTP - Protocol isLayer4_Protocol `protobuf_oneof:"protocol"` + Protocol isLayer4_Protocol `protobuf_oneof:"protocol"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Layer4) Reset() { @@ -1884,44 +1881,54 @@ func (*Layer4) Descriptor() ([]byte, []int) { return file_flow_flow_proto_rawDescGZIP(), []int{2} } -func (m *Layer4) GetProtocol() isLayer4_Protocol { - if m != nil { - return m.Protocol +func (x *Layer4) GetProtocol() isLayer4_Protocol { + if x != nil { + return x.Protocol } return nil } func (x *Layer4) GetTCP() *TCP { - if x, ok := x.GetProtocol().(*Layer4_TCP); ok { - return x.TCP + if x != nil { + if x, ok := x.Protocol.(*Layer4_TCP); ok { + return x.TCP + } } return nil } func (x *Layer4) GetUDP() *UDP { - if x, ok := x.GetProtocol().(*Layer4_UDP); ok { - return x.UDP + if x != nil { + if x, ok := x.Protocol.(*Layer4_UDP); ok { + return x.UDP + } } return nil } func (x *Layer4) GetICMPv4() *ICMPv4 { - if x, ok := x.GetProtocol().(*Layer4_ICMPv4); ok { - return x.ICMPv4 + if x != nil { + if x, ok := x.Protocol.(*Layer4_ICMPv4); ok { + return x.ICMPv4 + } } return nil } func (x *Layer4) GetICMPv6() *ICMPv6 { - if x, ok := x.GetProtocol().(*Layer4_ICMPv6); ok { - return x.ICMPv6 + if x != nil { + if x, ok := x.Protocol.(*Layer4_ICMPv6); ok { + return x.ICMPv6 + } } return nil } func (x *Layer4) GetSCTP() *SCTP { - if x, ok := x.GetProtocol().(*Layer4_SCTP); ok { - return x.SCTP + if x != nil { + if x, ok := x.Protocol.(*Layer4_SCTP); ok { + return x.SCTP + } } return nil } @@ -1963,21 +1970,20 @@ func (*Layer4_SCTP) isLayer4_Protocol() {} // Message for L7 flow, which roughly corresponds to Cilium's accesslog [LogRecord](https://github.com/cilium/cilium/blob/728c79e427438ab6f8d9375b62fccd6fed4ace3a/pkg/proxy/accesslog/record.go#L141): type Layer7 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type L7FlowType `protobuf:"varint,1,opt,name=type,proto3,enum=flow.L7FlowType" json:"type,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Type L7FlowType `protobuf:"varint,1,opt,name=type,proto3,enum=flow.L7FlowType" json:"type,omitempty"` // Latency of the response LatencyNs uint64 `protobuf:"varint,2,opt,name=latency_ns,json=latencyNs,proto3" json:"latency_ns,omitempty"` // L7 field. This field is set if and only if FlowType is L7. // - // Types that are assignable to Record: + // Types that are valid to be assigned to Record: // // *Layer7_Dns // *Layer7_Http // *Layer7_Kafka - Record isLayer7_Record `protobuf_oneof:"record"` + Record isLayer7_Record `protobuf_oneof:"record"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Layer7) Reset() { @@ -2024,30 +2030,36 @@ func (x *Layer7) GetLatencyNs() uint64 { return 0 } -func (m *Layer7) GetRecord() isLayer7_Record { - if m != nil { - return m.Record +func (x *Layer7) GetRecord() isLayer7_Record { + if x != nil { + return x.Record } return nil } func (x *Layer7) GetDns() *DNS { - if x, ok := x.GetRecord().(*Layer7_Dns); ok { - return x.Dns + if x != nil { + if x, ok := x.Record.(*Layer7_Dns); ok { + return x.Dns + } } return nil } func (x *Layer7) GetHttp() *HTTP { - if x, ok := x.GetRecord().(*Layer7_Http); ok { - return x.Http + if x != nil { + if x, ok := x.Record.(*Layer7_Http); ok { + return x.Http + } } return nil } func (x *Layer7) GetKafka() *Kafka { - if x, ok := x.GetRecord().(*Layer7_Kafka); ok { - return x.Kafka + if x != nil { + if x, ok := x.Record.(*Layer7_Kafka); ok { + return x.Kafka + } } return nil } @@ -2078,12 +2090,11 @@ func (*Layer7_Kafka) isLayer7_Record() {} // distributed trace. // For more information about trace context, check the [W3C Trace Context specification](https://www.w3.org/TR/trace-context/). type TraceContext struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // parent identifies the incoming request in a tracing system. - Parent *TraceParent `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + Parent *TraceParent `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TraceContext) Reset() { @@ -2125,13 +2136,12 @@ func (x *TraceContext) GetParent() *TraceParent { // TraceParent identifies the incoming request in a tracing system. type TraceParent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // trace_id is a unique value that identifies a trace. It is a byte array // represented as a hex string. - TraceId string `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + TraceId string `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TraceParent) Reset() { @@ -2172,18 +2182,17 @@ func (x *TraceParent) GetTraceId() string { } type Endpoint struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ID uint32 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` - Identity uint32 `protobuf:"varint,2,opt,name=identity,proto3" json:"identity,omitempty"` - ClusterName string `protobuf:"bytes,7,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ID uint32 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + Identity uint32 `protobuf:"varint,2,opt,name=identity,proto3" json:"identity,omitempty"` + ClusterName string `protobuf:"bytes,7,opt,name=cluster_name,json=clusterName,proto3" json:"cluster_name,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` // labels in `foo=bar` format. - Labels []string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` - PodName string `protobuf:"bytes,5,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` - Workloads []*Workload `protobuf:"bytes,6,rep,name=workloads,proto3" json:"workloads,omitempty"` + Labels []string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` + PodName string `protobuf:"bytes,5,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` + Workloads []*Workload `protobuf:"bytes,6,rep,name=workloads,proto3" json:"workloads,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Endpoint) Reset() { @@ -2266,12 +2275,11 @@ func (x *Endpoint) GetWorkloads() []*Workload { } type Workload struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Workload) Reset() { @@ -2319,13 +2327,12 @@ func (x *Workload) GetKind() string { } type TCP struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SourcePort uint32 `protobuf:"varint,1,opt,name=source_port,json=sourcePort,proto3" json:"source_port,omitempty"` - DestinationPort uint32 `protobuf:"varint,2,opt,name=destination_port,json=destinationPort,proto3" json:"destination_port,omitempty"` - Flags *TCPFlags `protobuf:"bytes,3,opt,name=flags,proto3" json:"flags,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + SourcePort uint32 `protobuf:"varint,1,opt,name=source_port,json=sourcePort,proto3" json:"source_port,omitempty"` + DestinationPort uint32 `protobuf:"varint,2,opt,name=destination_port,json=destinationPort,proto3" json:"destination_port,omitempty"` + Flags *TCPFlags `protobuf:"bytes,3,opt,name=flags,proto3" json:"flags,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TCP) Reset() { @@ -2380,11 +2387,8 @@ func (x *TCP) GetFlags() *TCPFlags { } type IP struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` // source_xlated is the post-translation source IP when the flow was // SNATed. When "source_xlated" is set, the "source" field is populated // with the pre-translation source IP address. @@ -2393,7 +2397,9 @@ type IP struct { IpVersion IPVersion `protobuf:"varint,3,opt,name=ipVersion,proto3,enum=flow.IPVersion" json:"ipVersion,omitempty"` // This field indicates whether the TraceReasonEncryptMask is set or not. // https://github.com/cilium/cilium/blob/ba0ed147bd5bb342f67b1794c2ad13c6e99d5236/pkg/monitor/datapath_trace.go#L27 - Encrypted bool `protobuf:"varint,4,opt,name=encrypted,proto3" json:"encrypted,omitempty"` + Encrypted bool `protobuf:"varint,4,opt,name=encrypted,proto3" json:"encrypted,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IP) Reset() { @@ -2462,12 +2468,11 @@ func (x *IP) GetEncrypted() bool { } type Ethernet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` + Destination string `protobuf:"bytes,2,opt,name=destination,proto3" json:"destination,omitempty"` unknownFields protoimpl.UnknownFields - - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` - Destination string `protobuf:"bytes,2,opt,name=destination,proto3" json:"destination,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Ethernet) Reset() { @@ -2515,19 +2520,18 @@ func (x *Ethernet) GetDestination() string { } type TCPFlags struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + FIN bool `protobuf:"varint,1,opt,name=FIN,proto3" json:"FIN,omitempty"` + SYN bool `protobuf:"varint,2,opt,name=SYN,proto3" json:"SYN,omitempty"` + RST bool `protobuf:"varint,3,opt,name=RST,proto3" json:"RST,omitempty"` + PSH bool `protobuf:"varint,4,opt,name=PSH,proto3" json:"PSH,omitempty"` + ACK bool `protobuf:"varint,5,opt,name=ACK,proto3" json:"ACK,omitempty"` + URG bool `protobuf:"varint,6,opt,name=URG,proto3" json:"URG,omitempty"` + ECE bool `protobuf:"varint,7,opt,name=ECE,proto3" json:"ECE,omitempty"` + CWR bool `protobuf:"varint,8,opt,name=CWR,proto3" json:"CWR,omitempty"` + NS bool `protobuf:"varint,9,opt,name=NS,proto3" json:"NS,omitempty"` unknownFields protoimpl.UnknownFields - - FIN bool `protobuf:"varint,1,opt,name=FIN,proto3" json:"FIN,omitempty"` - SYN bool `protobuf:"varint,2,opt,name=SYN,proto3" json:"SYN,omitempty"` - RST bool `protobuf:"varint,3,opt,name=RST,proto3" json:"RST,omitempty"` - PSH bool `protobuf:"varint,4,opt,name=PSH,proto3" json:"PSH,omitempty"` - ACK bool `protobuf:"varint,5,opt,name=ACK,proto3" json:"ACK,omitempty"` - URG bool `protobuf:"varint,6,opt,name=URG,proto3" json:"URG,omitempty"` - ECE bool `protobuf:"varint,7,opt,name=ECE,proto3" json:"ECE,omitempty"` - CWR bool `protobuf:"varint,8,opt,name=CWR,proto3" json:"CWR,omitempty"` - NS bool `protobuf:"varint,9,opt,name=NS,proto3" json:"NS,omitempty"` + sizeCache protoimpl.SizeCache } func (x *TCPFlags) Reset() { @@ -2624,12 +2628,11 @@ func (x *TCPFlags) GetNS() bool { } type UDP struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SourcePort uint32 `protobuf:"varint,1,opt,name=source_port,json=sourcePort,proto3" json:"source_port,omitempty"` - DestinationPort uint32 `protobuf:"varint,2,opt,name=destination_port,json=destinationPort,proto3" json:"destination_port,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + SourcePort uint32 `protobuf:"varint,1,opt,name=source_port,json=sourcePort,proto3" json:"source_port,omitempty"` + DestinationPort uint32 `protobuf:"varint,2,opt,name=destination_port,json=destinationPort,proto3" json:"destination_port,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UDP) Reset() { @@ -2677,12 +2680,11 @@ func (x *UDP) GetDestinationPort() uint32 { } type SCTP struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SourcePort uint32 `protobuf:"varint,1,opt,name=source_port,json=sourcePort,proto3" json:"source_port,omitempty"` - DestinationPort uint32 `protobuf:"varint,2,opt,name=destination_port,json=destinationPort,proto3" json:"destination_port,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + SourcePort uint32 `protobuf:"varint,1,opt,name=source_port,json=sourcePort,proto3" json:"source_port,omitempty"` + DestinationPort uint32 `protobuf:"varint,2,opt,name=destination_port,json=destinationPort,proto3" json:"destination_port,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SCTP) Reset() { @@ -2730,12 +2732,11 @@ func (x *SCTP) GetDestinationPort() uint32 { } type ICMPv4 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type uint32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"` + Code uint32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` unknownFields protoimpl.UnknownFields - - Type uint32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"` - Code uint32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ICMPv4) Reset() { @@ -2783,12 +2784,11 @@ func (x *ICMPv4) GetCode() uint32 { } type ICMPv6 struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type uint32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"` + Code uint32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` unknownFields protoimpl.UnknownFields - - Type uint32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"` - Code uint32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ICMPv6) Reset() { @@ -2836,15 +2836,14 @@ func (x *ICMPv6) GetCode() uint32 { } type Policy struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Labels []string `protobuf:"bytes,3,rep,name=labels,proto3" json:"labels,omitempty"` + Revision uint64 `protobuf:"varint,4,opt,name=revision,proto3" json:"revision,omitempty"` + Kind string `protobuf:"bytes,5,opt,name=kind,proto3" json:"kind,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` - Labels []string `protobuf:"bytes,3,rep,name=labels,proto3" json:"labels,omitempty"` - Revision uint64 `protobuf:"varint,4,opt,name=revision,proto3" json:"revision,omitempty"` - Kind string `protobuf:"bytes,5,opt,name=kind,proto3" json:"kind,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Policy) Reset() { @@ -2914,10 +2913,7 @@ func (x *Policy) GetKind() string { // EventTypeFilter is a filter describing a particular event type. type EventTypeFilter struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // type is the primary flow type as defined by: // github.com/cilium/cilium/pkg/monitor/api.MessageType* Type int32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"` @@ -2926,7 +2922,9 @@ type EventTypeFilter struct { MatchSubType bool `protobuf:"varint,2,opt,name=match_sub_type,json=matchSubType,proto3" json:"match_sub_type,omitempty"` // sub_type is the secondary type, e.g. // - github.com/cilium/cilium/pkg/monitor/api.Trace* - SubType int32 `protobuf:"varint,3,opt,name=sub_type,json=subType,proto3" json:"sub_type,omitempty"` + SubType int32 `protobuf:"varint,3,opt,name=sub_type,json=subType,proto3" json:"sub_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *EventTypeFilter) Reset() { @@ -2982,10 +2980,7 @@ func (x *EventTypeFilter) GetSubType() int32 { // CiliumEventType from which the flow originated. type CiliumEventType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // type of event the flow originated from, i.e. // github.com/cilium/cilium/pkg/monitor/api.MessageType* Type int32 `protobuf:"varint,1,opt,name=type,proto3" json:"type,omitempty"` @@ -2993,7 +2988,9 @@ type CiliumEventType struct { // - github.com/cilium/cilium/pkg/monitor/api.Trace* // - github.com/cilium/cilium/pkg/monitor/api.Drop* // - github.com/cilium/cilium/pkg/monitor/api.DbgCapture* - SubType int32 `protobuf:"varint,2,opt,name=sub_type,json=subType,proto3" json:"sub_type,omitempty"` + SubType int32 `protobuf:"varint,2,opt,name=sub_type,json=subType,proto3" json:"sub_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CiliumEventType) Reset() { @@ -3043,10 +3040,7 @@ func (x *CiliumEventType) GetSubType() int32 { // FlowFilter represent an individual flow filter. All fields are optional. If // multiple fields are set, then all fields must match for the filter to match. type FlowFilter struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // uuid filters by a list of flow uuids. Uuid []string `protobuf:"bytes,29,rep,name=uuid,proto3" json:"uuid,omitempty"` // source_ip filters by a list of source ips. Each of the source ips can be @@ -3142,7 +3136,9 @@ type FlowFilter struct { TraceId []string `protobuf:"bytes,28,rep,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"` // experimental contains filters that are not stable yet. Support for // experimental features is always optional and subject to change. - Experimental *FlowFilter_Experimental `protobuf:"bytes,999,opt,name=experimental,proto3" json:"experimental,omitempty"` + Experimental *FlowFilter_Experimental `protobuf:"bytes,999,opt,name=experimental,proto3" json:"experimental,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FlowFilter) Reset() { @@ -3450,10 +3446,7 @@ func (x *FlowFilter) GetExperimental() *FlowFilter_Experimental { // DNS flow. This is basically directly mapped from Cilium's [LogRecordDNS](https://github.com/cilium/cilium/blob/04f3889d627774f79e56d14ddbc165b3169e2d01/pkg/proxy/accesslog/record.go#L264): type DNS struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // DNS name that's being looked up: e.g. "isovalent.com." Query string `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` // List of IP addresses in the DNS response. @@ -3476,7 +3469,9 @@ type DNS struct { Qtypes []string `protobuf:"bytes,7,rep,name=qtypes,proto3" json:"qtypes,omitempty"` // String representation of rrtypes defined in: // https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-4 - Rrtypes []string `protobuf:"bytes,8,rep,name=rrtypes,proto3" json:"rrtypes,omitempty"` + Rrtypes []string `protobuf:"bytes,8,rep,name=rrtypes,proto3" json:"rrtypes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DNS) Reset() { @@ -3566,12 +3561,11 @@ func (x *DNS) GetRrtypes() []string { } type HTTPHeader struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` unknownFields protoimpl.UnknownFields - - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + sizeCache protoimpl.SizeCache } func (x *HTTPHeader) Reset() { @@ -3620,15 +3614,14 @@ func (x *HTTPHeader) GetValue() string { // L7 information for HTTP flows. It corresponds to Cilium's [accesslog.LogRecordHTTP](https://github.com/cilium/cilium/blob/728c79e427438ab6f8d9375b62fccd6fed4ace3a/pkg/proxy/accesslog/record.go#L206) type. type HTTP struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Method string `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` + Protocol string `protobuf:"bytes,4,opt,name=protocol,proto3" json:"protocol,omitempty"` + Headers []*HTTPHeader `protobuf:"bytes,5,rep,name=headers,proto3" json:"headers,omitempty"` unknownFields protoimpl.UnknownFields - - Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Method string `protobuf:"bytes,2,opt,name=method,proto3" json:"method,omitempty"` - Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` - Protocol string `protobuf:"bytes,4,opt,name=protocol,proto3" json:"protocol,omitempty"` - Headers []*HTTPHeader `protobuf:"bytes,5,rep,name=headers,proto3" json:"headers,omitempty"` + sizeCache protoimpl.SizeCache } func (x *HTTP) Reset() { @@ -3698,15 +3691,14 @@ func (x *HTTP) GetHeaders() []*HTTPHeader { // L7 information for Kafka flows. It corresponds to Cilium's [accesslog.LogRecordKafka](https://github.com/cilium/cilium/blob/728c79e427438ab6f8d9375b62fccd6fed4ace3a/pkg/proxy/accesslog/record.go#L229) type. type Kafka struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ErrorCode int32 `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` + ApiVersion int32 `protobuf:"varint,2,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` + ApiKey string `protobuf:"bytes,3,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"` + CorrelationId int32 `protobuf:"varint,4,opt,name=correlation_id,json=correlationId,proto3" json:"correlation_id,omitempty"` + Topic string `protobuf:"bytes,5,opt,name=topic,proto3" json:"topic,omitempty"` unknownFields protoimpl.UnknownFields - - ErrorCode int32 `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"` - ApiVersion int32 `protobuf:"varint,2,opt,name=api_version,json=apiVersion,proto3" json:"api_version,omitempty"` - ApiKey string `protobuf:"bytes,3,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"` - CorrelationId int32 `protobuf:"varint,4,opt,name=correlation_id,json=correlationId,proto3" json:"correlation_id,omitempty"` - Topic string `protobuf:"bytes,5,opt,name=topic,proto3" json:"topic,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Kafka) Reset() { @@ -3775,12 +3767,11 @@ func (x *Kafka) GetTopic() string { } type Service struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Service) Reset() { @@ -3830,17 +3821,16 @@ func (x *Service) GetNamespace() string { // LostEvent is a message which notifies consumers about a loss of events // that happened before the events were captured by Hubble. type LostEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // source is the location where events got lost. Source LostEventSource `protobuf:"varint,1,opt,name=source,proto3,enum=flow.LostEventSource" json:"source,omitempty"` // num_events_lost is the number of events that haven been lost at source. NumEventsLost uint64 `protobuf:"varint,2,opt,name=num_events_lost,json=numEventsLost,proto3" json:"num_events_lost,omitempty"` // cpu on which the event was lost if the source of lost events is // PERF_EVENT_RING_BUFFER. - Cpu *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=cpu,proto3" json:"cpu,omitempty"` + Cpu *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=cpu,proto3" json:"cpu,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LostEvent) Reset() { @@ -3895,12 +3885,9 @@ func (x *LostEvent) GetCpu() *wrapperspb.Int32Value { } type AgentEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type AgentEventType `protobuf:"varint,1,opt,name=type,proto3,enum=flow.AgentEventType" json:"type,omitempty"` - // Types that are assignable to Notification: + state protoimpl.MessageState `protogen:"open.v1"` + Type AgentEventType `protobuf:"varint,1,opt,name=type,proto3,enum=flow.AgentEventType" json:"type,omitempty"` + // Types that are valid to be assigned to Notification: // // *AgentEvent_Unknown // *AgentEvent_AgentStart @@ -3910,7 +3897,9 @@ type AgentEvent struct { // *AgentEvent_IpcacheUpdate // *AgentEvent_ServiceUpsert // *AgentEvent_ServiceDelete - Notification isAgentEvent_Notification `protobuf_oneof:"notification"` + Notification isAgentEvent_Notification `protobuf_oneof:"notification"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AgentEvent) Reset() { @@ -3950,65 +3939,81 @@ func (x *AgentEvent) GetType() AgentEventType { return AgentEventType_AGENT_EVENT_UNKNOWN } -func (m *AgentEvent) GetNotification() isAgentEvent_Notification { - if m != nil { - return m.Notification +func (x *AgentEvent) GetNotification() isAgentEvent_Notification { + if x != nil { + return x.Notification } return nil } func (x *AgentEvent) GetUnknown() *AgentEventUnknown { - if x, ok := x.GetNotification().(*AgentEvent_Unknown); ok { - return x.Unknown + if x != nil { + if x, ok := x.Notification.(*AgentEvent_Unknown); ok { + return x.Unknown + } } return nil } func (x *AgentEvent) GetAgentStart() *TimeNotification { - if x, ok := x.GetNotification().(*AgentEvent_AgentStart); ok { - return x.AgentStart + if x != nil { + if x, ok := x.Notification.(*AgentEvent_AgentStart); ok { + return x.AgentStart + } } return nil } func (x *AgentEvent) GetPolicyUpdate() *PolicyUpdateNotification { - if x, ok := x.GetNotification().(*AgentEvent_PolicyUpdate); ok { - return x.PolicyUpdate + if x != nil { + if x, ok := x.Notification.(*AgentEvent_PolicyUpdate); ok { + return x.PolicyUpdate + } } return nil } func (x *AgentEvent) GetEndpointRegenerate() *EndpointRegenNotification { - if x, ok := x.GetNotification().(*AgentEvent_EndpointRegenerate); ok { - return x.EndpointRegenerate + if x != nil { + if x, ok := x.Notification.(*AgentEvent_EndpointRegenerate); ok { + return x.EndpointRegenerate + } } return nil } func (x *AgentEvent) GetEndpointUpdate() *EndpointUpdateNotification { - if x, ok := x.GetNotification().(*AgentEvent_EndpointUpdate); ok { - return x.EndpointUpdate + if x != nil { + if x, ok := x.Notification.(*AgentEvent_EndpointUpdate); ok { + return x.EndpointUpdate + } } return nil } func (x *AgentEvent) GetIpcacheUpdate() *IPCacheNotification { - if x, ok := x.GetNotification().(*AgentEvent_IpcacheUpdate); ok { - return x.IpcacheUpdate + if x != nil { + if x, ok := x.Notification.(*AgentEvent_IpcacheUpdate); ok { + return x.IpcacheUpdate + } } return nil } func (x *AgentEvent) GetServiceUpsert() *ServiceUpsertNotification { - if x, ok := x.GetNotification().(*AgentEvent_ServiceUpsert); ok { - return x.ServiceUpsert + if x != nil { + if x, ok := x.Notification.(*AgentEvent_ServiceUpsert); ok { + return x.ServiceUpsert + } } return nil } func (x *AgentEvent) GetServiceDelete() *ServiceDeleteNotification { - if x, ok := x.GetNotification().(*AgentEvent_ServiceDelete); ok { - return x.ServiceDelete + if x != nil { + if x, ok := x.Notification.(*AgentEvent_ServiceDelete); ok { + return x.ServiceDelete + } } return nil } @@ -4070,12 +4075,11 @@ func (*AgentEvent_ServiceUpsert) isAgentEvent_Notification() {} func (*AgentEvent_ServiceDelete) isAgentEvent_Notification() {} type AgentEventUnknown struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Notification string `protobuf:"bytes,2,opt,name=notification,proto3" json:"notification,omitempty"` unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Notification string `protobuf:"bytes,2,opt,name=notification,proto3" json:"notification,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AgentEventUnknown) Reset() { @@ -4123,11 +4127,10 @@ func (x *AgentEventUnknown) GetNotification() string { } type TimeNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Time *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` unknownFields protoimpl.UnknownFields - - Time *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"` + sizeCache protoimpl.SizeCache } func (x *TimeNotification) Reset() { @@ -4168,13 +4171,12 @@ func (x *TimeNotification) GetTime() *timestamppb.Timestamp { } type PolicyUpdateNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Labels []string `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty"` + Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` + RuleCount int64 `protobuf:"varint,3,opt,name=rule_count,json=ruleCount,proto3" json:"rule_count,omitempty"` unknownFields protoimpl.UnknownFields - - Labels []string `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels,omitempty"` - Revision uint64 `protobuf:"varint,2,opt,name=revision,proto3" json:"revision,omitempty"` - RuleCount int64 `protobuf:"varint,3,opt,name=rule_count,json=ruleCount,proto3" json:"rule_count,omitempty"` + sizeCache protoimpl.SizeCache } func (x *PolicyUpdateNotification) Reset() { @@ -4229,13 +4231,12 @@ func (x *PolicyUpdateNotification) GetRuleCount() int64 { } type EndpointRegenNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Labels []string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty"` + Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` unknownFields protoimpl.UnknownFields - - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Labels []string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty"` - Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + sizeCache protoimpl.SizeCache } func (x *EndpointRegenNotification) Reset() { @@ -4290,15 +4291,14 @@ func (x *EndpointRegenNotification) GetError() string { } type EndpointUpdateNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Labels []string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty"` + Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + PodName string `protobuf:"bytes,4,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` + Namespace string `protobuf:"bytes,5,opt,name=namespace,proto3" json:"namespace,omitempty"` unknownFields protoimpl.UnknownFields - - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Labels []string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty"` - Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` - PodName string `protobuf:"bytes,4,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` - Namespace string `protobuf:"bytes,5,opt,name=namespace,proto3" json:"namespace,omitempty"` + sizeCache protoimpl.SizeCache } func (x *EndpointUpdateNotification) Reset() { @@ -4367,18 +4367,17 @@ func (x *EndpointUpdateNotification) GetNamespace() string { } type IPCacheNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Cidr string `protobuf:"bytes,1,opt,name=cidr,proto3" json:"cidr,omitempty"` + Identity uint32 `protobuf:"varint,2,opt,name=identity,proto3" json:"identity,omitempty"` + OldIdentity *wrapperspb.UInt32Value `protobuf:"bytes,3,opt,name=old_identity,json=oldIdentity,proto3" json:"old_identity,omitempty"` + HostIp string `protobuf:"bytes,4,opt,name=host_ip,json=hostIp,proto3" json:"host_ip,omitempty"` + OldHostIp string `protobuf:"bytes,5,opt,name=old_host_ip,json=oldHostIp,proto3" json:"old_host_ip,omitempty"` + EncryptKey uint32 `protobuf:"varint,6,opt,name=encrypt_key,json=encryptKey,proto3" json:"encrypt_key,omitempty"` + Namespace string `protobuf:"bytes,7,opt,name=namespace,proto3" json:"namespace,omitempty"` + PodName string `protobuf:"bytes,8,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` unknownFields protoimpl.UnknownFields - - Cidr string `protobuf:"bytes,1,opt,name=cidr,proto3" json:"cidr,omitempty"` - Identity uint32 `protobuf:"varint,2,opt,name=identity,proto3" json:"identity,omitempty"` - OldIdentity *wrapperspb.UInt32Value `protobuf:"bytes,3,opt,name=old_identity,json=oldIdentity,proto3" json:"old_identity,omitempty"` - HostIp string `protobuf:"bytes,4,opt,name=host_ip,json=hostIp,proto3" json:"host_ip,omitempty"` - OldHostIp string `protobuf:"bytes,5,opt,name=old_host_ip,json=oldHostIp,proto3" json:"old_host_ip,omitempty"` - EncryptKey uint32 `protobuf:"varint,6,opt,name=encrypt_key,json=encryptKey,proto3" json:"encrypt_key,omitempty"` - Namespace string `protobuf:"bytes,7,opt,name=namespace,proto3" json:"namespace,omitempty"` - PodName string `protobuf:"bytes,8,opt,name=pod_name,json=podName,proto3" json:"pod_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *IPCacheNotification) Reset() { @@ -4468,12 +4467,11 @@ func (x *IPCacheNotification) GetPodName() string { } type ServiceUpsertNotificationAddr struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` + Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` unknownFields protoimpl.UnknownFields - - Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` - Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ServiceUpsertNotificationAddr) Reset() { @@ -4521,10 +4519,7 @@ func (x *ServiceUpsertNotificationAddr) GetPort() uint32 { } type ServiceUpsertNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` FrontendAddress *ServiceUpsertNotificationAddr `protobuf:"bytes,2,opt,name=frontend_address,json=frontendAddress,proto3" json:"frontend_address,omitempty"` BackendAddresses []*ServiceUpsertNotificationAddr `protobuf:"bytes,3,rep,name=backend_addresses,json=backendAddresses,proto3" json:"backend_addresses,omitempty"` @@ -4535,6 +4530,8 @@ type ServiceUpsertNotification struct { Namespace string `protobuf:"bytes,7,opt,name=namespace,proto3" json:"namespace,omitempty"` ExtTrafficPolicy string `protobuf:"bytes,8,opt,name=ext_traffic_policy,json=extTrafficPolicy,proto3" json:"ext_traffic_policy,omitempty"` IntTrafficPolicy string `protobuf:"bytes,9,opt,name=int_traffic_policy,json=intTrafficPolicy,proto3" json:"int_traffic_policy,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServiceUpsertNotification) Reset() { @@ -4632,11 +4629,10 @@ func (x *ServiceUpsertNotification) GetIntTrafficPolicy() string { } type ServiceDeleteNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields - - Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ServiceDeleteNotification) Reset() { @@ -4677,12 +4673,11 @@ func (x *ServiceDeleteNotification) GetId() uint32 { } type NetworkInterface struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Index uint32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Index uint32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *NetworkInterface) Reset() { @@ -4730,18 +4725,17 @@ func (x *NetworkInterface) GetName() string { } type DebugEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type DebugEventType `protobuf:"varint,1,opt,name=type,proto3,enum=flow.DebugEventType" json:"type,omitempty"` + Source *Endpoint `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + Hash *wrapperspb.UInt32Value `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash,omitempty"` + Arg1 *wrapperspb.UInt32Value `protobuf:"bytes,4,opt,name=arg1,proto3" json:"arg1,omitempty"` + Arg2 *wrapperspb.UInt32Value `protobuf:"bytes,5,opt,name=arg2,proto3" json:"arg2,omitempty"` + Arg3 *wrapperspb.UInt32Value `protobuf:"bytes,6,opt,name=arg3,proto3" json:"arg3,omitempty"` + Message string `protobuf:"bytes,7,opt,name=message,proto3" json:"message,omitempty"` + Cpu *wrapperspb.Int32Value `protobuf:"bytes,8,opt,name=cpu,proto3" json:"cpu,omitempty"` unknownFields protoimpl.UnknownFields - - Type DebugEventType `protobuf:"varint,1,opt,name=type,proto3,enum=flow.DebugEventType" json:"type,omitempty"` - Source *Endpoint `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - Hash *wrapperspb.UInt32Value `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash,omitempty"` - Arg1 *wrapperspb.UInt32Value `protobuf:"bytes,4,opt,name=arg1,proto3" json:"arg1,omitempty"` - Arg2 *wrapperspb.UInt32Value `protobuf:"bytes,5,opt,name=arg2,proto3" json:"arg2,omitempty"` - Arg3 *wrapperspb.UInt32Value `protobuf:"bytes,6,opt,name=arg3,proto3" json:"arg3,omitempty"` - Message string `protobuf:"bytes,7,opt,name=message,proto3" json:"message,omitempty"` - Cpu *wrapperspb.Int32Value `protobuf:"bytes,8,opt,name=cpu,proto3" json:"cpu,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DebugEvent) Reset() { @@ -4833,10 +4827,7 @@ func (x *DebugEvent) GetCpu() *wrapperspb.Int32Value { // Experimental contains filters that are not stable yet. Support for // experimental features is always optional and subject to change. type FlowFilter_Experimental struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // cel_expression takes a common expression language (CEL) expression // returning a boolean to determine if the filter matched or not. // You can use the `_flow` variable to access fields on the flow using @@ -4847,6 +4838,8 @@ type FlowFilter_Experimental struct { // using non-CEL filters when possible, and try to specify CEL filters // last in the list of FlowFilters. CelExpression []string `protobuf:"bytes,1,rep,name=cel_expression,json=celExpression,proto3" json:"cel_expression,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FlowFilter_Experimental) Reset() { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/bgp_graceful_restart.go b/vendor/github.com/cilium/cilium/api/v1/models/bgp_graceful_restart.go index d24845f9f1..dd2cee83c5 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/bgp_graceful_restart.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/bgp_graceful_restart.go @@ -17,8 +17,6 @@ import ( // BgpGracefulRestart BGP graceful restart parameters negotiated with the peer. // -// +k8s:deepcopy-gen=true -// // swagger:model BgpGracefulRestart type BgpGracefulRestart struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/bgp_peer_families.go b/vendor/github.com/cilium/cilium/api/v1/models/bgp_peer_families.go index aac6013add..bcf11b9aee 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/bgp_peer_families.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/bgp_peer_families.go @@ -17,8 +17,6 @@ import ( // BgpPeerFamilies BGP AFI SAFI state of the peer // -// +k8s:deepcopy-gen=true -// // swagger:model BgpPeerFamilies type BgpPeerFamilies struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/c_id_r_policy.go b/vendor/github.com/cilium/cilium/api/v1/models/c_id_r_policy.go index b98e611a6a..2678070b19 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/c_id_r_policy.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/c_id_r_policy.go @@ -19,8 +19,6 @@ import ( // CIDRPolicy CIDR endpoint policy // -// +k8s:deepcopy-gen=true -// // swagger:model CIDRPolicy type CIDRPolicy struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/c_n_i_chaining_status.go b/vendor/github.com/cilium/cilium/api/v1/models/c_n_i_chaining_status.go index 26e8a7236c..70b7a6c30a 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/c_n_i_chaining_status.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/c_n_i_chaining_status.go @@ -20,8 +20,6 @@ import ( // CNIChainingStatus Status of CNI chaining // -// +k8s:deepcopy-gen=true -// // swagger:model CNIChainingStatus type CNIChainingStatus struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/clock_source.go b/vendor/github.com/cilium/cilium/api/v1/models/clock_source.go index c5106d8661..07df2b3dce 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/clock_source.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/clock_source.go @@ -20,8 +20,6 @@ import ( // ClockSource Status of BPF clock source // -// +k8s:deepcopy-gen=true -// // swagger:model ClockSource type ClockSource struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/endpoint_policy.go b/vendor/github.com/cilium/cilium/api/v1/models/endpoint_policy.go index 5f6150600a..1cf376fcdd 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/endpoint_policy.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/endpoint_policy.go @@ -18,8 +18,6 @@ import ( // EndpointPolicy Policy information of an endpoint // -// +k8s:deepcopy-gen=true -// // swagger:model EndpointPolicy type EndpointPolicy struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/identity_range.go b/vendor/github.com/cilium/cilium/api/v1/models/identity_range.go index f05ed337b7..548fe6ccc7 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/identity_range.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/identity_range.go @@ -17,8 +17,6 @@ import ( // IdentityRange Status of identity range of the cluster // -// +k8s:deepcopy-gen=true -// // swagger:model IdentityRange type IdentityRange struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/ip_v4_big_tcp.go b/vendor/github.com/cilium/cilium/api/v1/models/ip_v4_big_tcp.go index 41dedc1cdb..87032000f0 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/ip_v4_big_tcp.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/ip_v4_big_tcp.go @@ -17,8 +17,6 @@ import ( // IPV4BigTCP Status of IPv4 BIG TCP // -// +k8s:deepcopy-gen=true -// // swagger:model IPV4BigTCP type IPV4BigTCP struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/ip_v6_big_tcp.go b/vendor/github.com/cilium/cilium/api/v1/models/ip_v6_big_tcp.go index ed6a0f8676..e600f624b0 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/ip_v6_big_tcp.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/ip_v6_big_tcp.go @@ -17,8 +17,6 @@ import ( // IPV6BigTCP Status of IPv6 BIG TCP // -// +k8s:deepcopy-gen=true -// // swagger:model IPV6BigTCP type IPV6BigTCP struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/kube_proxy_replacement.go b/vendor/github.com/cilium/cilium/api/v1/models/kube_proxy_replacement.go index 6477cb154b..3c9e3e48a9 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/kube_proxy_replacement.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/kube_proxy_replacement.go @@ -791,9 +791,7 @@ func (m *KubeProxyReplacementFeatures) UnmarshalBinary(b []byte) error { return nil } -// KubeProxyReplacementFeaturesExternalIPs -// -// +k8s:deepcopy-gen=true +// KubeProxyReplacementFeaturesExternalIPs kube proxy replacement features external i ps // // swagger:model KubeProxyReplacementFeaturesExternalIPs type KubeProxyReplacementFeaturesExternalIPs struct { @@ -830,9 +828,7 @@ func (m *KubeProxyReplacementFeaturesExternalIPs) UnmarshalBinary(b []byte) erro return nil } -// KubeProxyReplacementFeaturesGracefulTermination -// -// +k8s:deepcopy-gen=true +// KubeProxyReplacementFeaturesGracefulTermination kube proxy replacement features graceful termination // // swagger:model KubeProxyReplacementFeaturesGracefulTermination type KubeProxyReplacementFeaturesGracefulTermination struct { @@ -869,9 +865,7 @@ func (m *KubeProxyReplacementFeaturesGracefulTermination) UnmarshalBinary(b []by return nil } -// KubeProxyReplacementFeaturesHostPort -// -// +k8s:deepcopy-gen=true +// KubeProxyReplacementFeaturesHostPort kube proxy replacement features host port // // swagger:model KubeProxyReplacementFeaturesHostPort type KubeProxyReplacementFeaturesHostPort struct { @@ -1143,9 +1137,7 @@ func (m *KubeProxyReplacementFeaturesNat46X64Gateway) UnmarshalBinary(b []byte) return nil } -// KubeProxyReplacementFeaturesNat46X64Service -// -// +k8s:deepcopy-gen=true +// KubeProxyReplacementFeaturesNat46X64Service kube proxy replacement features nat46 x64 service // // swagger:model KubeProxyReplacementFeaturesNat46X64Service type KubeProxyReplacementFeaturesNat46X64Service struct { @@ -1182,9 +1174,7 @@ func (m *KubeProxyReplacementFeaturesNat46X64Service) UnmarshalBinary(b []byte) return nil } -// KubeProxyReplacementFeaturesNodePort -// -// +k8s:deepcopy-gen=true +// KubeProxyReplacementFeaturesNodePort kube proxy replacement features node port // // swagger:model KubeProxyReplacementFeaturesNodePort type KubeProxyReplacementFeaturesNodePort struct { @@ -1447,9 +1437,7 @@ func (m *KubeProxyReplacementFeaturesNodePort) UnmarshalBinary(b []byte) error { return nil } -// KubeProxyReplacementFeaturesSessionAffinity -// -// +k8s:deepcopy-gen=true +// KubeProxyReplacementFeaturesSessionAffinity kube proxy replacement features session affinity // // swagger:model KubeProxyReplacementFeaturesSessionAffinity type KubeProxyReplacementFeaturesSessionAffinity struct { @@ -1486,9 +1474,7 @@ func (m *KubeProxyReplacementFeaturesSessionAffinity) UnmarshalBinary(b []byte) return nil } -// KubeProxyReplacementFeaturesSocketLB -// -// +k8s:deepcopy-gen=true +// KubeProxyReplacementFeaturesSocketLB kube proxy replacement features socket l b // // swagger:model KubeProxyReplacementFeaturesSocketLB type KubeProxyReplacementFeaturesSocketLB struct { @@ -1525,9 +1511,7 @@ func (m *KubeProxyReplacementFeaturesSocketLB) UnmarshalBinary(b []byte) error { return nil } -// KubeProxyReplacementFeaturesSocketLBTracing -// -// +k8s:deepcopy-gen=true +// KubeProxyReplacementFeaturesSocketLBTracing kube proxy replacement features socket l b tracing // // swagger:model KubeProxyReplacementFeaturesSocketLBTracing type KubeProxyReplacementFeaturesSocketLBTracing struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/l4_policy.go b/vendor/github.com/cilium/cilium/api/v1/models/l4_policy.go index b6c4c198b1..142c38bdad 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/l4_policy.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/l4_policy.go @@ -19,8 +19,6 @@ import ( // L4Policy L4 endpoint policy // -// +k8s:deepcopy-gen=true -// // swagger:model L4Policy type L4Policy struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/policy_rule.go b/vendor/github.com/cilium/cilium/api/v1/models/policy_rule.go index cf24453f2a..900a559161 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/policy_rule.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/policy_rule.go @@ -17,8 +17,6 @@ import ( // PolicyRule A policy rule including the rule labels it derives from // -// +k8s:deepcopy-gen=true -// // swagger:model PolicyRule type PolicyRule struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/routing.go b/vendor/github.com/cilium/cilium/api/v1/models/routing.go index fe028cf6d7..fdf8b0a930 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/routing.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/routing.go @@ -20,8 +20,6 @@ import ( // Routing Status of routing // -// +k8s:deepcopy-gen=true -// // swagger:model Routing type Routing struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/srv6.go b/vendor/github.com/cilium/cilium/api/v1/models/srv6.go index 1b3182a487..005b38889a 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/srv6.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/srv6.go @@ -20,8 +20,6 @@ import ( // Srv6 Status of the SRv6 // -// +k8s:deepcopy-gen=true -// // swagger:model Srv6 type Srv6 struct { diff --git a/vendor/github.com/cilium/cilium/api/v1/models/zz_generated.deepcopy.go b/vendor/github.com/cilium/cilium/api/v1/models/zz_generated.deepcopy.go index d93fea4d1b..bb5487c2e2 100644 --- a/vendor/github.com/cilium/cilium/api/v1/models/zz_generated.deepcopy.go +++ b/vendor/github.com/cilium/cilium/api/v1/models/zz_generated.deepcopy.go @@ -60,22 +60,6 @@ func (in *BandwidthManager) DeepCopy() *BandwidthManager { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BgpGracefulRestart) DeepCopyInto(out *BgpGracefulRestart) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BgpGracefulRestart. -func (in *BgpGracefulRestart) DeepCopy() *BgpGracefulRestart { - if in == nil { - return nil - } - out := new(BgpGracefulRestart) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *BgpPeer) DeepCopyInto(out *BgpPeer) { *out = *in @@ -108,92 +92,6 @@ func (in *BgpPeer) DeepCopy() *BgpPeer { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *BgpPeerFamilies) DeepCopyInto(out *BgpPeerFamilies) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BgpPeerFamilies. -func (in *BgpPeerFamilies) DeepCopy() *BgpPeerFamilies { - if in == nil { - return nil - } - out := new(BgpPeerFamilies) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CIDRPolicy) DeepCopyInto(out *CIDRPolicy) { - *out = *in - if in.Egress != nil { - in, out := &in.Egress, &out.Egress - *out = make([]*PolicyRule, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(PolicyRule) - (*in).DeepCopyInto(*out) - } - } - } - if in.Ingress != nil { - in, out := &in.Ingress, &out.Ingress - *out = make([]*PolicyRule, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(PolicyRule) - (*in).DeepCopyInto(*out) - } - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CIDRPolicy. -func (in *CIDRPolicy) DeepCopy() *CIDRPolicy { - if in == nil { - return nil - } - out := new(CIDRPolicy) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *CNIChainingStatus) DeepCopyInto(out *CNIChainingStatus) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNIChainingStatus. -func (in *CNIChainingStatus) DeepCopy() *CNIChainingStatus { - if in == nil { - return nil - } - out := new(CNIChainingStatus) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ClockSource) DeepCopyInto(out *ClockSource) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ClockSource. -func (in *ClockSource) DeepCopy() *ClockSource { - if in == nil { - return nil - } - out := new(ClockSource) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ClusterMeshStatus) DeepCopyInto(out *ClusterMeshStatus) { *out = *in @@ -342,52 +240,6 @@ func (in *EncryptionStatus) DeepCopy() *EncryptionStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EndpointPolicy) DeepCopyInto(out *EndpointPolicy) { - *out = *in - if in.AllowedEgressIdentities != nil { - in, out := &in.AllowedEgressIdentities, &out.AllowedEgressIdentities - *out = make([]int64, len(*in)) - copy(*out, *in) - } - if in.AllowedIngressIdentities != nil { - in, out := &in.AllowedIngressIdentities, &out.AllowedIngressIdentities - *out = make([]int64, len(*in)) - copy(*out, *in) - } - if in.CidrPolicy != nil { - in, out := &in.CidrPolicy, &out.CidrPolicy - *out = new(CIDRPolicy) - (*in).DeepCopyInto(*out) - } - if in.DeniedEgressIdentities != nil { - in, out := &in.DeniedEgressIdentities, &out.DeniedEgressIdentities - *out = make([]int64, len(*in)) - copy(*out, *in) - } - if in.DeniedIngressIdentities != nil { - in, out := &in.DeniedIngressIdentities, &out.DeniedIngressIdentities - *out = make([]int64, len(*in)) - copy(*out, *in) - } - if in.L4 != nil { - in, out := &in.L4, &out.L4 - *out = new(L4Policy) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EndpointPolicy. -func (in *EndpointPolicy) DeepCopy() *EndpointPolicy { - if in == nil { - return nil - } - out := new(EndpointPolicy) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *HostFirewall) DeepCopyInto(out *HostFirewall) { *out = *in @@ -485,38 +337,6 @@ func (in *IPAMStatus) DeepCopy() *IPAMStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPV4BigTCP) DeepCopyInto(out *IPV4BigTCP) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPV4BigTCP. -func (in *IPV4BigTCP) DeepCopy() *IPV4BigTCP { - if in == nil { - return nil - } - out := new(IPV4BigTCP) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IPV6BigTCP) DeepCopyInto(out *IPV6BigTCP) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IPV6BigTCP. -func (in *IPV6BigTCP) DeepCopy() *IPV6BigTCP { - if in == nil { - return nil - } - out := new(IPV6BigTCP) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *IPsecStatus) DeepCopyInto(out *IPsecStatus) { *out = *in @@ -545,22 +365,6 @@ func (in *IPsecStatus) DeepCopy() *IPsecStatus { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *IdentityRange) DeepCopyInto(out *IdentityRange) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new IdentityRange. -func (in *IdentityRange) DeepCopy() *IdentityRange { - if in == nil { - return nil - } - out := new(IdentityRange) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *K8sStatus) DeepCopyInto(out *K8sStatus) { *out = *in @@ -706,54 +510,6 @@ func (in *KubeProxyReplacementFeatures) DeepCopy() *KubeProxyReplacementFeatures return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeProxyReplacementFeaturesExternalIPs) DeepCopyInto(out *KubeProxyReplacementFeaturesExternalIPs) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeProxyReplacementFeaturesExternalIPs. -func (in *KubeProxyReplacementFeaturesExternalIPs) DeepCopy() *KubeProxyReplacementFeaturesExternalIPs { - if in == nil { - return nil - } - out := new(KubeProxyReplacementFeaturesExternalIPs) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeProxyReplacementFeaturesGracefulTermination) DeepCopyInto(out *KubeProxyReplacementFeaturesGracefulTermination) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeProxyReplacementFeaturesGracefulTermination. -func (in *KubeProxyReplacementFeaturesGracefulTermination) DeepCopy() *KubeProxyReplacementFeaturesGracefulTermination { - if in == nil { - return nil - } - out := new(KubeProxyReplacementFeaturesGracefulTermination) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeProxyReplacementFeaturesHostPort) DeepCopyInto(out *KubeProxyReplacementFeaturesHostPort) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeProxyReplacementFeaturesHostPort. -func (in *KubeProxyReplacementFeaturesHostPort) DeepCopy() *KubeProxyReplacementFeaturesHostPort { - if in == nil { - return nil - } - out := new(KubeProxyReplacementFeaturesHostPort) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *KubeProxyReplacementFeaturesHostReachableServices) DeepCopyInto(out *KubeProxyReplacementFeaturesHostReachableServices) { *out = *in @@ -822,124 +578,6 @@ func (in *KubeProxyReplacementFeaturesNat46X64Gateway) DeepCopy() *KubeProxyRepl return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeProxyReplacementFeaturesNat46X64Service) DeepCopyInto(out *KubeProxyReplacementFeaturesNat46X64Service) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeProxyReplacementFeaturesNat46X64Service. -func (in *KubeProxyReplacementFeaturesNat46X64Service) DeepCopy() *KubeProxyReplacementFeaturesNat46X64Service { - if in == nil { - return nil - } - out := new(KubeProxyReplacementFeaturesNat46X64Service) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeProxyReplacementFeaturesNodePort) DeepCopyInto(out *KubeProxyReplacementFeaturesNodePort) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeProxyReplacementFeaturesNodePort. -func (in *KubeProxyReplacementFeaturesNodePort) DeepCopy() *KubeProxyReplacementFeaturesNodePort { - if in == nil { - return nil - } - out := new(KubeProxyReplacementFeaturesNodePort) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeProxyReplacementFeaturesSessionAffinity) DeepCopyInto(out *KubeProxyReplacementFeaturesSessionAffinity) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeProxyReplacementFeaturesSessionAffinity. -func (in *KubeProxyReplacementFeaturesSessionAffinity) DeepCopy() *KubeProxyReplacementFeaturesSessionAffinity { - if in == nil { - return nil - } - out := new(KubeProxyReplacementFeaturesSessionAffinity) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeProxyReplacementFeaturesSocketLB) DeepCopyInto(out *KubeProxyReplacementFeaturesSocketLB) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeProxyReplacementFeaturesSocketLB. -func (in *KubeProxyReplacementFeaturesSocketLB) DeepCopy() *KubeProxyReplacementFeaturesSocketLB { - if in == nil { - return nil - } - out := new(KubeProxyReplacementFeaturesSocketLB) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *KubeProxyReplacementFeaturesSocketLBTracing) DeepCopyInto(out *KubeProxyReplacementFeaturesSocketLBTracing) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeProxyReplacementFeaturesSocketLBTracing. -func (in *KubeProxyReplacementFeaturesSocketLBTracing) DeepCopy() *KubeProxyReplacementFeaturesSocketLBTracing { - if in == nil { - return nil - } - out := new(KubeProxyReplacementFeaturesSocketLBTracing) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *L4Policy) DeepCopyInto(out *L4Policy) { - *out = *in - if in.Egress != nil { - in, out := &in.Egress, &out.Egress - *out = make([]*PolicyRule, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(PolicyRule) - (*in).DeepCopyInto(*out) - } - } - } - if in.Ingress != nil { - in, out := &in.Ingress, &out.Ingress - *out = make([]*PolicyRule, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = new(PolicyRule) - (*in).DeepCopyInto(*out) - } - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new L4Policy. -func (in *L4Policy) DeepCopy() *L4Policy { - if in == nil { - return nil - } - out := new(L4Policy) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Masquerading) DeepCopyInto(out *Masquerading) { *out = *in @@ -1055,54 +693,6 @@ func (in *NodeElement) DeepCopy() *NodeElement { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *PolicyRule) DeepCopyInto(out *PolicyRule) { - *out = *in - if in.DerivedFromRules != nil { - in, out := &in.DerivedFromRules, &out.DerivedFromRules - *out = make([][]string, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = make([]string, len(*in)) - copy(*out, *in) - } - } - } - if in.RulesBySelector != nil { - in, out := &in.RulesBySelector, &out.RulesBySelector - *out = make(map[string][][]string, len(*in)) - for key, val := range *in { - var outVal [][]string - if val == nil { - (*out)[key] = nil - } else { - in, out := &val, &outVal - *out = make([][]string, len(*in)) - for i := range *in { - if (*in)[i] != nil { - in, out := &(*in)[i], &(*out)[i] - *out = make([]string, len(*in)) - copy(*out, *in) - } - } - } - (*out)[key] = outVal - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PolicyRule. -func (in *PolicyRule) DeepCopy() *PolicyRule { - if in == nil { - return nil - } - out := new(PolicyRule) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ProxyStatistics) DeepCopyInto(out *ProxyStatistics) { *out = *in @@ -1246,38 +836,6 @@ func (in *RequestResponseStatistics) DeepCopy() *RequestResponseStatistics { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Routing) DeepCopyInto(out *Routing) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Routing. -func (in *Routing) DeepCopy() *Routing { - if in == nil { - return nil - } - out := new(Routing) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Srv6) DeepCopyInto(out *Srv6) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Srv6. -func (in *Srv6) DeepCopy() *Srv6 { - if in == nil { - return nil - } - out := new(Srv6) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StatusResponse) DeepCopyInto(out *StatusResponse) { *out = *in diff --git a/vendor/github.com/cilium/cilium/api/v1/observer/observer.pb.go b/vendor/github.com/cilium/cilium/api/v1/observer/observer.pb.go index 07d1d5d735..7654042313 100644 --- a/vendor/github.com/cilium/cilium/api/v1/observer/observer.pb.go +++ b/vendor/github.com/cilium/cilium/api/v1/observer/observer.pb.go @@ -3,8 +3,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.2 -// protoc v5.29.1 +// protoc-gen-go v1.36.1 +// protoc v5.29.2 // source: observer/observer.proto package observer @@ -400,9 +400,9 @@ type DebugEvent = flow.DebugEvent type FlowFilter_Experimental = flow.FlowFilter_Experimental type ServerStatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerStatusRequest) Reset() { @@ -436,10 +436,7 @@ func (*ServerStatusRequest) Descriptor() ([]byte, []int) { } type ServerStatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // number of currently captured flows // In a multi-node context, this is the cumulative count of all captured // flows. @@ -467,7 +464,9 @@ type ServerStatusResponse struct { Version string `protobuf:"bytes,8,opt,name=version,proto3" json:"version,omitempty"` // Approximate rate of flows seen by Hubble per second over the last minute. // In a multi-node context, this is the sum of all flows rates. - FlowsRate float64 `protobuf:"fixed64,9,opt,name=flows_rate,json=flowsRate,proto3" json:"flows_rate,omitempty"` + FlowsRate float64 `protobuf:"fixed64,9,opt,name=flows_rate,json=flowsRate,proto3" json:"flows_rate,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ServerStatusResponse) Reset() { @@ -564,10 +563,7 @@ func (x *ServerStatusResponse) GetFlowsRate() float64 { } type GetFlowsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Number of flows that should be returned. Incompatible with `since/until`. // Defaults to the most recent (last) `number` flows, unless `first` is // true, then it will return the earliest `number` flows. @@ -604,7 +600,9 @@ type GetFlowsRequest struct { // extensions can be used to add arbitrary additional metadata to GetFlowsRequest. // This can be used to extend functionality for other Hubble compatible // APIs, or experiment with new functionality without needing to change the public API. - Extensions *anypb.Any `protobuf:"bytes,150000,opt,name=extensions,proto3" json:"extensions,omitempty"` + Extensions *anypb.Any `protobuf:"bytes,150000,opt,name=extensions,proto3" json:"extensions,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetFlowsRequest) Reset() { @@ -709,11 +707,8 @@ func (x *GetFlowsRequest) GetExtensions() *anypb.Any { // GetFlowsResponse contains either a flow or a protocol message. type GetFlowsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to ResponseTypes: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to ResponseTypes: // // *GetFlowsResponse_Flow // *GetFlowsResponse_NodeStatus @@ -722,7 +717,9 @@ type GetFlowsResponse struct { // Name of the node where this event was observed. NodeName string `protobuf:"bytes,1000,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Timestamp at which this event was observed. - Time *timestamppb.Timestamp `protobuf:"bytes,1001,opt,name=time,proto3" json:"time,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,1001,opt,name=time,proto3" json:"time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetFlowsResponse) Reset() { @@ -755,30 +752,36 @@ func (*GetFlowsResponse) Descriptor() ([]byte, []int) { return file_observer_observer_proto_rawDescGZIP(), []int{3} } -func (m *GetFlowsResponse) GetResponseTypes() isGetFlowsResponse_ResponseTypes { - if m != nil { - return m.ResponseTypes +func (x *GetFlowsResponse) GetResponseTypes() isGetFlowsResponse_ResponseTypes { + if x != nil { + return x.ResponseTypes } return nil } func (x *GetFlowsResponse) GetFlow() *flow.Flow { - if x, ok := x.GetResponseTypes().(*GetFlowsResponse_Flow); ok { - return x.Flow + if x != nil { + if x, ok := x.ResponseTypes.(*GetFlowsResponse_Flow); ok { + return x.Flow + } } return nil } func (x *GetFlowsResponse) GetNodeStatus() *relay.NodeStatusEvent { - if x, ok := x.GetResponseTypes().(*GetFlowsResponse_NodeStatus); ok { - return x.NodeStatus + if x != nil { + if x, ok := x.ResponseTypes.(*GetFlowsResponse_NodeStatus); ok { + return x.NodeStatus + } } return nil } func (x *GetFlowsResponse) GetLostEvents() *flow.LostEvent { - if x, ok := x.GetResponseTypes().(*GetFlowsResponse_LostEvents); ok { - return x.LostEvents + if x != nil { + if x, ok := x.ResponseTypes.(*GetFlowsResponse_LostEvents); ok { + return x.LostEvents + } } return nil } @@ -824,10 +827,7 @@ func (*GetFlowsResponse_NodeStatus) isGetFlowsResponse_ResponseTypes() {} func (*GetFlowsResponse_LostEvents) isGetFlowsResponse_ResponseTypes() {} type GetAgentEventsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Number of flows that should be returned. Incompatible with `since/until`. // Defaults to the most recent (last) `number` events, unless `first` is // true, then it will return the earliest `number` events. @@ -841,7 +841,9 @@ type GetAgentEventsRequest struct { // Since this time for returned agent events. Incompatible with `number`. Since *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=since,proto3" json:"since,omitempty"` // Until this time for returned agent events. Incompatible with `number`. - Until *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=until,proto3" json:"until,omitempty"` + Until *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=until,proto3" json:"until,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetAgentEventsRequest) Reset() { @@ -911,15 +913,14 @@ func (x *GetAgentEventsRequest) GetUntil() *timestamppb.Timestamp { // GetAgentEventsResponse contains an event received from the Cilium agent. type GetAgentEventsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - AgentEvent *flow.AgentEvent `protobuf:"bytes,1,opt,name=agent_event,json=agentEvent,proto3" json:"agent_event,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + AgentEvent *flow.AgentEvent `protobuf:"bytes,1,opt,name=agent_event,json=agentEvent,proto3" json:"agent_event,omitempty"` // Name of the node where this event was observed. NodeName string `protobuf:"bytes,1000,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Timestamp at which this event was observed. - Time *timestamppb.Timestamp `protobuf:"bytes,1001,opt,name=time,proto3" json:"time,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,1001,opt,name=time,proto3" json:"time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetAgentEventsResponse) Reset() { @@ -974,10 +975,7 @@ func (x *GetAgentEventsResponse) GetTime() *timestamppb.Timestamp { } type GetDebugEventsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Number of events that should be returned. Incompatible with `since/until`. // Defaults to the most recent (last) `number` events, unless `first` is // true, then it will return the earliest `number` events. @@ -991,7 +989,9 @@ type GetDebugEventsRequest struct { // Since this time for returned debug events. Incompatible with `number`. Since *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=since,proto3" json:"since,omitempty"` // Until this time for returned debug events. Incompatible with `number`. - Until *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=until,proto3" json:"until,omitempty"` + Until *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=until,proto3" json:"until,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetDebugEventsRequest) Reset() { @@ -1061,15 +1061,14 @@ func (x *GetDebugEventsRequest) GetUntil() *timestamppb.Timestamp { // GetDebugEventsResponse contains a Cilium datapath debug events. type GetDebugEventsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - DebugEvent *flow.DebugEvent `protobuf:"bytes,1,opt,name=debug_event,json=debugEvent,proto3" json:"debug_event,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + DebugEvent *flow.DebugEvent `protobuf:"bytes,1,opt,name=debug_event,json=debugEvent,proto3" json:"debug_event,omitempty"` // Name of the node where this event was observed. NodeName string `protobuf:"bytes,1000,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Timestamp at which this event was observed. - Time *timestamppb.Timestamp `protobuf:"bytes,1001,opt,name=time,proto3" json:"time,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,1001,opt,name=time,proto3" json:"time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetDebugEventsResponse) Reset() { @@ -1124,9 +1123,9 @@ func (x *GetDebugEventsResponse) GetTime() *timestamppb.Timestamp { } type GetNodesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetNodesRequest) Reset() { @@ -1161,12 +1160,11 @@ func (*GetNodesRequest) Descriptor() ([]byte, []int) { // GetNodesResponse contains the list of nodes. type GetNodesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Nodes is an exhaustive list of nodes. - Nodes []*Node `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` + Nodes []*Node `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetNodesResponse) Reset() { @@ -1208,10 +1206,7 @@ func (x *GetNodesResponse) GetNodes() []*Node { // Node represents a cluster node. type Node struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Name is the name of the node. Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Version is the version of Cilium/Hubble as reported by the node. @@ -1229,7 +1224,9 @@ type Node struct { // maximum capacity of the ring buffer MaxFlows uint64 `protobuf:"varint,8,opt,name=max_flows,json=maxFlows,proto3" json:"max_flows,omitempty"` // total amount of flows observed since the observer was started - SeenFlows uint64 `protobuf:"varint,9,opt,name=seen_flows,json=seenFlows,proto3" json:"seen_flows,omitempty"` + SeenFlows uint64 `protobuf:"varint,9,opt,name=seen_flows,json=seenFlows,proto3" json:"seen_flows,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Node) Reset() { @@ -1327,15 +1324,14 @@ func (x *Node) GetSeenFlows() uint64 { // TLS represents TLS information. type TLS struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Enabled reports whether TLS is enabled or not. Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` // ServerName is the TLS server name that can be used as part of the TLS // cert validation process. - ServerName string `protobuf:"bytes,2,opt,name=server_name,json=serverName,proto3" json:"server_name,omitempty"` + ServerName string `protobuf:"bytes,2,opt,name=server_name,json=serverName,proto3" json:"server_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TLS) Reset() { @@ -1383,9 +1379,9 @@ func (x *TLS) GetServerName() string { } type GetNamespacesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetNamespacesRequest) Reset() { @@ -1420,12 +1416,11 @@ func (*GetNamespacesRequest) Descriptor() ([]byte, []int) { // GetNamespacesResponse contains the list of namespaces. type GetNamespacesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Namespaces is a list of namespaces with flows - Namespaces []*Namespace `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + Namespaces []*Namespace `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetNamespacesResponse) Reset() { @@ -1466,12 +1461,11 @@ func (x *GetNamespacesResponse) GetNamespaces() []*Namespace { } type Namespace struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Cluster string `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` unknownFields protoimpl.UnknownFields - - Cluster string `protobuf:"bytes,1,opt,name=cluster,proto3" json:"cluster,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Namespace) Reset() { @@ -1521,11 +1515,8 @@ func (x *Namespace) GetNamespace() string { // ExportEvent contains an event to be exported. Not to be used outside of the // exporter feature. type ExportEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to ResponseTypes: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to ResponseTypes: // // *ExportEvent_Flow // *ExportEvent_NodeStatus @@ -1536,7 +1527,9 @@ type ExportEvent struct { // Name of the node where this event was observed. NodeName string `protobuf:"bytes,1000,opt,name=node_name,json=nodeName,proto3" json:"node_name,omitempty"` // Timestamp at which this event was observed. - Time *timestamppb.Timestamp `protobuf:"bytes,1001,opt,name=time,proto3" json:"time,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,1001,opt,name=time,proto3" json:"time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExportEvent) Reset() { @@ -1569,44 +1562,54 @@ func (*ExportEvent) Descriptor() ([]byte, []int) { return file_observer_observer_proto_rawDescGZIP(), []int{15} } -func (m *ExportEvent) GetResponseTypes() isExportEvent_ResponseTypes { - if m != nil { - return m.ResponseTypes +func (x *ExportEvent) GetResponseTypes() isExportEvent_ResponseTypes { + if x != nil { + return x.ResponseTypes } return nil } func (x *ExportEvent) GetFlow() *flow.Flow { - if x, ok := x.GetResponseTypes().(*ExportEvent_Flow); ok { - return x.Flow + if x != nil { + if x, ok := x.ResponseTypes.(*ExportEvent_Flow); ok { + return x.Flow + } } return nil } func (x *ExportEvent) GetNodeStatus() *relay.NodeStatusEvent { - if x, ok := x.GetResponseTypes().(*ExportEvent_NodeStatus); ok { - return x.NodeStatus + if x != nil { + if x, ok := x.ResponseTypes.(*ExportEvent_NodeStatus); ok { + return x.NodeStatus + } } return nil } func (x *ExportEvent) GetLostEvents() *flow.LostEvent { - if x, ok := x.GetResponseTypes().(*ExportEvent_LostEvents); ok { - return x.LostEvents + if x != nil { + if x, ok := x.ResponseTypes.(*ExportEvent_LostEvents); ok { + return x.LostEvents + } } return nil } func (x *ExportEvent) GetAgentEvent() *flow.AgentEvent { - if x, ok := x.GetResponseTypes().(*ExportEvent_AgentEvent); ok { - return x.AgentEvent + if x != nil { + if x, ok := x.ResponseTypes.(*ExportEvent_AgentEvent); ok { + return x.AgentEvent + } } return nil } func (x *ExportEvent) GetDebugEvent() *flow.DebugEvent { - if x, ok := x.GetResponseTypes().(*ExportEvent_DebugEvent); ok { - return x.DebugEvent + if x != nil { + if x, ok := x.ResponseTypes.(*ExportEvent_DebugEvent); ok { + return x.DebugEvent + } } return nil } @@ -1669,10 +1672,7 @@ func (*ExportEvent_DebugEvent) isExportEvent_ResponseTypes() {} // Experimental contains fields that are not stable yet. Support for // experimental features is always optional and subject to change. type GetFlowsRequest_Experimental struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // FieldMask allows clients to limit flow's fields that will be returned. // For example, {paths: ["source.id", "destination.id"]} will return flows // with only these two fields set. @@ -1680,7 +1680,9 @@ type GetFlowsRequest_Experimental struct { // removed in v1.17. // // Deprecated: Marked as deprecated in observer/observer.proto. - FieldMask *fieldmaskpb.FieldMask `protobuf:"bytes,1,opt,name=field_mask,json=fieldMask,proto3" json:"field_mask,omitempty"` + FieldMask *fieldmaskpb.FieldMask `protobuf:"bytes,1,opt,name=field_mask,json=fieldMask,proto3" json:"field_mask,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetFlowsRequest_Experimental) Reset() { diff --git a/vendor/github.com/cilium/cilium/api/v1/observer/observer_grpc.pb.go b/vendor/github.com/cilium/cilium/api/v1/observer/observer_grpc.pb.go index 536886251d..362fb5b170 100644 --- a/vendor/github.com/cilium/cilium/api/v1/observer/observer_grpc.pb.go +++ b/vendor/github.com/cilium/cilium/api/v1/observer/observer_grpc.pb.go @@ -4,7 +4,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.5.1 -// - protoc v5.29.1 +// - protoc v5.29.2 // source: observer/observer.proto package observer diff --git a/vendor/github.com/cilium/cilium/api/v1/relay/relay.pb.go b/vendor/github.com/cilium/cilium/api/v1/relay/relay.pb.go index 3238ac08e8..cb38575371 100644 --- a/vendor/github.com/cilium/cilium/api/v1/relay/relay.pb.go +++ b/vendor/github.com/cilium/cilium/api/v1/relay/relay.pb.go @@ -3,8 +3,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.2 -// protoc v5.29.1 +// protoc-gen-go v1.36.1 +// protoc v5.29.2 // source: relay/relay.proto package relay @@ -92,17 +92,16 @@ func (NodeState) EnumDescriptor() ([]byte, []int) { // NodeStatusEvent is a message sent by hubble-relay to inform clients about // the state of a particular node. type NodeStatusEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // state_change contains the new node state StateChange NodeState `protobuf:"varint,1,opt,name=state_change,json=stateChange,proto3,enum=relay.NodeState" json:"state_change,omitempty"` // node_names is the list of nodes for which the above state changes applies NodeNames []string `protobuf:"bytes,2,rep,name=node_names,json=nodeNames,proto3" json:"node_names,omitempty"` // message is an optional message attached to the state change (e.g. an // error message). The message applies to all nodes in node_names. - Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *NodeStatusEvent) Reset() { diff --git a/vendor/github.com/cilium/cilium/cilium-cli/cli/connectivity.go b/vendor/github.com/cilium/cilium/cilium-cli/cli/connectivity.go index 1c1dd8abc4..117420aa09 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/cli/connectivity.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/cli/connectivity.go @@ -129,6 +129,7 @@ func newCmdConnectivityTest(hooks api.Hooks) *cobra.Command { cmd.Flags().BoolVarP(¶ms.Timestamp, "timestamp", "t", false, "Show timestamp in messages") cmd.Flags().BoolVarP(¶ms.PauseOnFail, "pause-on-fail", "p", false, "Pause execution on test failure") cmd.Flags().StringVar(¶ms.ExternalTarget, "external-target", "one.one.one.one.", "Domain name to use as external target in connectivity tests") + cmd.Flags().StringVar(¶ms.ExternalOtherTarget, "external-other-target", "cilium.io.", "Domain name to use as a second external target in connectivity tests") cmd.Flags().StringVar(¶ms.ExternalTargetCANamespace, "external-target-ca-namespace", "", "Namespace of the CA secret for the external target. Used by client-egress-l7-tls test cases.") cmd.Flags().StringVar(¶ms.ExternalTargetCAName, "external-target-ca-name", "cabundle", "Name of the CA secret for the external target. Used by client-egress-l7-tls test cases.") cmd.Flags().StringVar(¶ms.ExternalCIDR, "external-cidr", "1.0.0.0/8", "CIDR to use as external target in connectivity tests") diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/builder.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/builder.go index 25451c4b77..caeb75dc7c 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/builder.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/builder.go @@ -253,8 +253,6 @@ func concurrentTests(connTests []*check.ConnectivityTest) error { clientEgressL7Method{}, clientEgressL7{}, clientEgressL7NamedPort{}, - clientEgressL7TlsDenyWithoutHeaders{}, - clientEgressL7TlsHeaders{}, clientEgressTlsSni{}, clientEgressL7SetHeader{}, echoIngressAuthAlwaysFail{}, @@ -289,6 +287,8 @@ func sequentialTests(ct *check.ConnectivityTest) error { tests := []testBuilder{ hostFirewallIngress{}, hostFirewallEgress{}, + clientEgressL7TlsDenyWithoutHeaders{}, + clientEgressL7TlsHeaders{}, } return injectTests(tests, ct) } diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/client_egress_l7_tls_deny_without_headers.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/client_egress_l7_tls_deny_without_headers.go index 3b58772808..8e183c010a 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/client_egress_l7_tls_deny_without_headers.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/client_egress_l7_tls_deny_without_headers.go @@ -14,7 +14,7 @@ type clientEgressL7TlsDenyWithoutHeaders struct{} func (t clientEgressL7TlsDenyWithoutHeaders) build(ct *check.ConnectivityTest, templates map[string]string) { // Test L7 HTTPS interception using an egress policy on the clients. // Fail to load site due to missing headers. - newTest("client-egress-l7-tls-deny-without-headers", ct). + newTest("seq-client-egress-l7-tls-deny-without-headers", ct). WithFeatureRequirements(features.RequireEnabled(features.L7Proxy)). WithFeatureRequirements(features.RequireEnabled(features.PolicySecretBackendK8s)). WithCABundleSecret(). diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/client_egress_l7_tls_headers.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/client_egress_l7_tls_headers.go index 9ecc334fab..ea551b0738 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/client_egress_l7_tls_headers.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/client_egress_l7_tls_headers.go @@ -19,10 +19,10 @@ func (t clientEgressL7TlsHeaders) build(ct *check.ConnectivityTest, templates ma } func clientEgressL7TlsHeadersTest(ct *check.ConnectivityTest, templates map[string]string, portRanges bool) { - testName := "client-egress-l7-tls-headers" + testName := "seq-client-egress-l7-tls-headers" yamlFile := templates["clientEgressL7TLSPolicyYAML"] if portRanges { - testName = "client-egress-l7-tls-headers-port-range" + testName = "seq-client-egress-l7-tls-headers-port-range" yamlFile = templates["clientEgressL7TLSPolicyPortRangeYAML"] } // Test L7 HTTPS interception using an egress policy on the clients. diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/allow-all-egress.yaml b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/allow-all-egress.yaml index 5437de55bf..f395498d12 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/allow-all-egress.yaml +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/allow-all-egress.yaml @@ -9,3 +9,4 @@ spec: - {} - toCIDR: - 0.0.0.0/0 + - ::/0 diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external-deny.yaml b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external-deny.yaml index 8f0e6216bb..3243095ae0 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external-deny.yaml +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external-deny.yaml @@ -11,6 +11,6 @@ spec: kind: client egressDeny: - toCIDRSet: - - cidr: {{.ExternalCIDR}} + - cidr: "{{.ExternalCIDR}}" except: - - {{.ExternalIP}}/32 + - "{{.ExternalIP | ipToCIDR }}" diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external-knp.yaml b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external-knp.yaml index ea635927fd..b8cc4e511b 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external-knp.yaml +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external-knp.yaml @@ -10,6 +10,6 @@ spec: egress: - to: - ipBlock: - cidr: {{.ExternalCIDR}} + cidr: "{{.ExternalCIDR}}" except: - - {{.ExternalOtherIP}}/32 + - "{{ .ExternalOtherIP | ipToCIDR }}" diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external.yaml b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external.yaml index b2fa10cad0..53beddd038 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external.yaml +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidr-external.yaml @@ -9,6 +9,6 @@ spec: kind: client egress: - toCIDRSet: - - cidr: {{.ExternalCIDR}} + - cidr: "{{.ExternalCIDR}}" except: - - {{.ExternalOtherIP}}/32 + - "{{ .ExternalOtherIP | ipToCIDR }}" diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidrgroup-external-deny.yaml b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidrgroup-external-deny.yaml index 361589271a..31595869da 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidrgroup-external-deny.yaml +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/client-egress-to-cidrgroup-external-deny.yaml @@ -24,4 +24,4 @@ spec: - toCIDRSet: - cidrGroupRef: cilium-test-external-cidr except: - - "{{.ExternalIP}}/32" + - "{{ .ExternalIP | ipToCIDR }}" diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/template/template.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/template/template.go index f7d3b2952a..6e902bf93c 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/template/template.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/manifests/template/template.go @@ -6,6 +6,7 @@ package template import ( "bytes" "html/template" + "net/netip" "strings" ) @@ -13,6 +14,13 @@ import ( func Render(temp string, data any) (string, error) { fns := template.FuncMap{ "trimSuffix": func(in, suffix string) string { return strings.TrimSuffix(in, suffix) }, + "ipToCIDR": func(ipString string) string { + if ip, err := netip.ParseAddr(ipString); err == nil && ip.Is6() { + return ipString + "/128" // IPv6 address + } else { + return ipString + "/32" // otherwise assume IPv4 + } + }, } tm, err := template.New("template").Funcs(fns).Parse(temp) diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/node_to_node_encryption.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/node_to_node_encryption.go index d93bb9ebb7..d370119576 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/node_to_node_encryption.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/node_to_node_encryption.go @@ -21,5 +21,5 @@ func (t nodeToNodeEncryption) build(ct *check.ConnectivityTest, _ map[string]str features.RequireEnabled(features.EncryptionPod), features.RequireEnabled(features.EncryptionNode), ), - ) + ).WithFeatureRequirements(features.RequireModeIsNot(features.EncryptionPod, "ipsec")) } diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/to_fqdns.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/to_fqdns.go index b45e59207a..0fd37b7cbe 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/to_fqdns.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/builder/to_fqdns.go @@ -22,17 +22,12 @@ func (t toFqdns) build(ct *check.ConnectivityTest, templates map[string]string) WithFeatureRequirements(features.RequireEnabled(features.L7Proxy)). WithScenarios( tests.PodToWorld(tests.WithRetryDestPort(80)), - tests.PodToWorld2(), // resolves cilium.io. + tests.PodToWorld2(), // resolves to ExternalOtherTarget ). WithExpectations(func(a *check.Action) (egress, ingress check.Result) { - if a.Destination().Address(features.IPFamilyAny) == "cilium.io." { + if a.Destination().Address(features.IPFamilyAny) == ct.Params().ExternalOtherTarget { if a.Destination().Path() == "/" || a.Destination().Path() == "" { - egress = check.ResultDNSOK - egress.HTTP = check.HTTP{ - Method: "GET", - URL: "https://cilium.io", - } - // Expect packets for cilium.io / 104.198.14.52 to be dropped. + // Expect packets to other external target to be dropped. return check.ResultDropCurlTimeout, check.ResultNone } // Else expect HTTP drop by proxy diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/check.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/check.go index 3d64362796..0cf0549be5 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/check.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/check.go @@ -74,6 +74,7 @@ type Parameters struct { DeploymentAnnotations annotationsMap NamespaceAnnotations annotations ExternalTarget string + ExternalOtherTarget string ExternalCIDR string ExternalIP string ExternalDeploymentPort int diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/deployment.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/deployment.go index a90d4677a2..afe2e449cf 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/deployment.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/deployment.go @@ -28,6 +28,7 @@ import ( ciliumv2 "github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2" slimmetav1 "github.com/cilium/cilium/pkg/k8s/slim/k8s/apis/meta/v1" policyapi "github.com/cilium/cilium/pkg/policy/api" + "github.com/cilium/cilium/pkg/versioncheck" ) const ( @@ -574,6 +575,11 @@ func (ct *ConnectivityTest) deploy(ctx context.Context) error { } if enabled, _ := ct.Features.MatchRequirements(features.RequireEnabled(features.CNP)); enabled { + ipsec, _ := ct.Features.MatchRequirements(features.RequireMode(features.EncryptionPod, "ipsec")) + if ipsec && versioncheck.MustCompile(">=1.14.0 <1.16.0")(ct.CiliumVersion) { + // https://github.com/cilium/cilium/issues/36681 + continue + } for _, client := range ct.Clients() { ct.Logf("✨ [%s] Deploying %s CiliumNetworkPolicy...", client.ClusterName(), testConnDisruptCNPName) _, err = client.ApplyGeneric(ctx, newConnDisruptCNP(ct.params.TestNamespace)) @@ -1751,7 +1757,7 @@ func (ct *ConnectivityTest) validateDeployment(ctx context.Context) error { } ct.secondaryNetworkNodeIPv4[pod.Spec.NodeName] = strings.TrimSuffix(addr.String(), "\n") } - if ct.Features[features.IPv4].Enabled { + if ct.Features[features.IPv6].Enabled { cmd := []string{"/bin/sh", "-c", fmt.Sprintf("ip -family inet6 -oneline address show dev %s scope global | awk '{print $4}' | cut -d/ -f1", iface)} addr, err := client.ExecInPod(ctx, pod.Namespace, pod.Name, "", cmd) if err != nil { diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/test.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/test.go index c6a5f54961..ec6d9b1782 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/test.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/check/test.go @@ -833,6 +833,16 @@ func (t *Test) collectSysdump() { func (t *Test) ForEachIPFamily(do func(features.IPFamily)) { ipFams := []features.IPFamily{features.IPFamilyV4, features.IPFamilyV6} + // The per-endpoint routes feature is broken with IPv6 on < v1.14 when there + // are any netpols installed (https://github.com/cilium/cilium/issues/23852 + // and https://github.com/cilium/cilium/issues/23910). + if f, ok := t.Context().Feature(features.EndpointRoutes); ok && + f.Enabled && t.HasNetworkPolicies() && + versioncheck.MustCompile("<1.14.0")(t.Context().CiliumVersion) { + + ipFams = []features.IPFamily{features.IPFamilyV4} + } + for _, ipFam := range ipFams { switch ipFam { case features.IPFamilyV4: @@ -856,3 +866,12 @@ func (t *Test) CertificateCAs() map[string][]byte { func (t *Test) CiliumLocalRedirectPolicies() map[string]*ciliumv2.CiliumLocalRedirectPolicy { return t.clrps } + +func (t *Test) HasNetworkPolicies() bool { + for _, obj := range t.resources { + if isPolicy(obj) { + return true + } + } + return false +} diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/errors.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/errors.go index f9a553c99b..0ca5f8fa99 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/errors.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/errors.go @@ -64,19 +64,21 @@ func NoErrorsInLogs(ciliumVersion semver.Version, checkLevels []string) check.Sc failedCreategRPCClient, unableReallocateIngressIP, fqdnMaxIPPerHostname, failedGetMetricsAPI} // The list is adopted from cilium/cilium/test/helper/utils.go var errorMsgsWithExceptions = map[string][]logMatcher{ - panicMessage: nil, - deadLockHeader: nil, - RunInitFailed: nil, - emptyBPFInitArg: nil, - RemovingMapMsg: {stringMatcher("globals/cilium_policy")}, - symbolSubstitution: nil, - uninitializedRegen: nil, - unstableStat: nil, - missingIptablesWait: nil, - localIDRestoreFail: nil, - routerIPMismatch: nil, - emptyIPNodeIDAlloc: nil, - "DATA RACE": nil, + panicMessage: nil, + deadLockHeader: nil, + RunInitFailed: nil, + emptyBPFInitArg: nil, + RemovingMapMsg: {stringMatcher("globals/cilium_policy")}, + symbolSubstitution: nil, + uninitializedRegen: nil, + unstableStat: nil, + missingIptablesWait: nil, + localIDRestoreFail: nil, + routerIPMismatch: nil, + emptyIPNodeIDAlloc: nil, + "DATA RACE": nil, + envoyErrorMessage: nil, + envoyCriticalMessage: nil, } if slices.Contains(checkLevels, defaults.LogLevelError) { errorMsgsWithExceptions["level=error"] = errorLogExceptions @@ -309,6 +311,10 @@ const ( unableReallocateIngressIP stringMatcher = "unable to re-allocate ingress IPv6" // cf. https://github.com/cilium/cilium/issues/36072 fqdnMaxIPPerHostname stringMatcher = "Raise tofqdns-endpoint-max-ip-per-hostname to mitigate this" // cf. https://github.com/cilium/cilium/issues/36073 failedGetMetricsAPI stringMatcher = "retrieve the complete list of server APIs: metrics.k8s.io/v1beta1" // cf. https://github.com/cilium/cilium/issues/36085 + + // Logs messages that should not be in the cilium-envoy DS logs + envoyErrorMessage = "[error]" + envoyCriticalMessage = "[critical]" ) var ( diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/service.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/service.go index 74ffa2fd8f..9bc3d67b8e 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/service.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/service.go @@ -12,6 +12,7 @@ import ( "github.com/cilium/cilium/cilium-cli/connectivity/check" "github.com/cilium/cilium/cilium-cli/utils/features" + "github.com/cilium/cilium/pkg/versioncheck" ) // PodToService sends an HTTP request from all client Pods @@ -227,6 +228,13 @@ func curlNodePort(ctx context.Context, s check.Scenario, t *check.Test, } } + // Skip IPv6 requests when running on <1.14.0 Cilium with CNPs + if features.GetIPFamily(addr.Address) == features.IPFamilyV6 && + versioncheck.MustCompile("<1.14.0")(t.Context().CiliumVersion) && + t.HasNetworkPolicies() { + continue + } + // Manually construct an HTTP endpoint to override the destination IP // and port of the request. ep := check.HTTPEndpoint(name, fmt.Sprintf("%s://%s:%d%s", svc.Scheme(), addr.Address, np, svc.Path())) diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/to-cidr.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/to-cidr.go index 591b197ce2..f7c2aae2ed 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/to-cidr.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/to-cidr.go @@ -6,6 +6,7 @@ package tests import ( "context" "fmt" + "net/netip" "strings" "github.com/cilium/cilium/cilium-cli/connectivity/check" @@ -35,7 +36,7 @@ func (s *podToCIDR) Run(ctx context.Context, t *check.Test) { ct := t.Context() for _, ip := range []string{ct.Params().ExternalIP, ct.Params().ExternalOtherIP} { - ep := check.HTTPEndpoint(fmt.Sprintf("external-%s", strings.ReplaceAll(ip, ".", "")), "https://"+ip) + ep := check.HTTPEndpoint(ipToName(ip), ipToURL(ip)) var i int for _, src := range ct.ClientPods() { @@ -51,3 +52,16 @@ func (s *podToCIDR) Run(ctx context.Context, t *check.Test) { } } } + +func ipToName(ip string) string { + ipWithoutSep := strings.ReplaceAll(ip, ".", "") // IPv4 separator + ipWithoutSep = strings.ReplaceAll(ipWithoutSep, ":", "") // IPv6 separator + return fmt.Sprintf("external-%s", ipWithoutSep) +} + +func ipToURL(ipString string) string { + if ip, err := netip.ParseAddr(ipString); err == nil && ip.Is6() { + ipString = fmt.Sprintf("[%s]", ipString) // Avoid parsing IPv6 last ":" as port + } + return "https://" + ipString +} diff --git a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/world.go b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/world.go index 6c46bc81fb..e90221f615 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/world.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/connectivity/tests/world.go @@ -70,7 +70,7 @@ func (s *podToWorld) Run(ctx context.Context, t *check.Test) { } } -// PodToWorld2 sends an HTTPS request to cilium.io from from random client +// PodToWorld2 sends an HTTPS request to ExternalOtherTarget from random client // Pods. func PodToWorld2() check.Scenario { return &podToWorld2{} @@ -84,7 +84,8 @@ func (s *podToWorld2) Name() string { } func (s *podToWorld2) Run(ctx context.Context, t *check.Test) { - https := check.HTTPEndpoint("cilium-io-https", "https://cilium.io.") + extTarget := t.Context().Params().ExternalOtherTarget + https := check.HTTPEndpoint(extTarget+"-https", "https://"+extTarget) fp := check.FlowParameters{ DNSRequired: true, @@ -96,7 +97,7 @@ func (s *podToWorld2) Run(ctx context.Context, t *check.Test) { for _, client := range ct.ClientPods() { // With https, over port 443. - t.NewAction(s, fmt.Sprintf("https-cilium-io-%d", i), &client, https, features.IPFamilyAny).Run(func(a *check.Action) { + t.NewAction(s, fmt.Sprintf("https-%s-%d", extTarget, i), &client, https, features.IPFamilyAny).Run(func(a *check.Action) { a.ExecInPod(ctx, ct.CurlCommand(https, features.IPFamilyAny)) a.ValidateFlows(ctx, client, a.GetEgressRequirements(fp)) a.ValidateMetrics(ctx, client, a.GetEgressMetricsRequirements()) diff --git a/vendor/github.com/cilium/cilium/cilium-cli/defaults/defaults.go b/vendor/github.com/cilium/cilium/cilium-cli/defaults/defaults.go index 650bce1263..91bd6a43ce 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/defaults/defaults.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/defaults/defaults.go @@ -76,7 +76,7 @@ const ( // renovate: datasource=docker ConnectivityTestConnDisruptImage = "quay.io/cilium/test-connection-disruption:v0.0.14@sha256:c3fd56e326ae16f6cb63dbb2e26b4e47ec07a123040623e11399a7fe1196baa0" // renovate: datasource=docker - ConnectivityTestFRRImage = "quay.io/frrouting/frr:10.2.0@sha256:68733b8504b30d2a8565e43038f1313a500f2d9d58251882915eff0fbbd85e59" + ConnectivityTestFRRImage = "quay.io/frrouting/frr:10.2.1@sha256:c8543d3e0a1348cc0f2b19154fd8b0300e237773dbec65d9d6d6570c1d088deb" // renovate: datasource=docker ConnectivityTestSocatImage = "docker.io/alpine/socat:1.8.0.0@sha256:a6be4c0262b339c53ddad723cdd178a1a13271e1137c65e27f90a08c16de02b8" diff --git a/vendor/github.com/cilium/cilium/cilium-cli/install/aws.go b/vendor/github.com/cilium/cilium/cilium-cli/install/aws.go index 6e7893410a..91e371d2c9 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/install/aws.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/install/aws.go @@ -5,11 +5,8 @@ package install import ( "context" - "errors" "fmt" - "strings" - corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/types" @@ -22,37 +19,6 @@ const ( AwsNodeDaemonSetNodeSelectorValue = "true" ) -const ( - AwsNodeImageFamilyAmazonLinux2 = "AmazonLinux2" - AwsNodeImageFamilyAmazonLinux2023 = "AmazonLinux2023" - AwsNodeImageFamilyBottlerocket = "Bottlerocket" - AwsNodeImageFamilyCustom = "Custom" - AwsNodeImageFamilyUbuntu = "Ubuntu" - AwsNodeImageFamilyWindows = "Windows" -) - -func (k *K8sInstaller) awsRetrieveNodeImageFamily() error { - // setting default fallback value - k.params.AWS.AwsNodeImageFamily = AwsNodeImageFamilyCustom - - nodes, err := k.client.ListNodes(context.Background(), metav1.ListOptions{}) - if err != nil { - k.Log("❌ Could not list cluster nodes, defaulted to fallback node image family value: %s", k.params.AWS.AwsNodeImageFamily) - return err - } - - ami, err := getNodeImage(nodes.Items) - if err != nil { - k.Log("❌ Could not detect AWS node image family, defaulted to fallback value: %s", k.params.AWS.AwsNodeImageFamily) - return err - } - - k.params.AWS.AwsNodeImageFamily = ami - k.Log("✅ Detected AWS node image family: %s", k.params.AWS.AwsNodeImageFamily) - - return nil -} - func getChainingMode(values map[string]interface{}) string { chainingMode, _, _ := unstructured.NestedString(values, "cni", "chainingMode") return chainingMode @@ -76,39 +42,3 @@ func (k *K8sInstaller) awsSetupChainingMode(ctx context.Context, values map[stri return nil } - -func getNodeImage(nodes []corev1.Node) (string, error) { - if len(nodes) == 0 { - return "", errors.New("unable to detect node OS, cluster has no nodes") - } - - amiFn := func(ami string) string { - ami = strings.ToUpper(ami) - switch { - case strings.Contains(ami, "AMAZON LINUX 2023"): - return AwsNodeImageFamilyAmazonLinux2023 - case strings.Contains(ami, "AMAZON LINUX 2"): - return AwsNodeImageFamilyAmazonLinux2 - case strings.Contains(ami, "BOTTLEROCKET"): - return AwsNodeImageFamilyBottlerocket - case strings.Contains(ami, "UBUNTU"): - return AwsNodeImageFamilyUbuntu - case strings.Contains(ami, "WINDOWS"): - return AwsNodeImageFamilyWindows - default: - return AwsNodeImageFamilyCustom - } - } - - ami := amiFn(nodes[0].Status.NodeInfo.OSImage) - // verify that all cluster nodes use the same OS image - // because currently mixed nodes setup is not supported - for i := 1; i < len(nodes); i++ { - nodeAmi := amiFn(nodes[i].Status.NodeInfo.OSImage) - if ami != nodeAmi { - return "", fmt.Errorf("cluster has nodes with different OS images: '%s' and '%s'", ami, nodeAmi) - } - } - - return ami, nil -} diff --git a/vendor/github.com/cilium/cilium/cilium-cli/install/helm.go b/vendor/github.com/cilium/cilium/cilium-cli/install/helm.go index 66c93b6d63..997365f06d 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/install/helm.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/install/helm.go @@ -64,11 +64,12 @@ func (k *K8sInstaller) getHelmValues() (map[string]interface{}, error) { // Can be removed once we drop support for <1.14.0 helmMapOpts["tunnel"] = tunnelDisabled } - // AL2023 uses ens interfaces, but we default to eth interfaces for everything else for backwards compatibility, - // since the CLI was assuming eth interfaces before support for AL2023 was introduced - helmMapOpts["egressMasqueradeInterfaces"] = "eth+" - if k.params.AWS.AwsNodeImageFamily == AwsNodeImageFamilyAmazonLinux2023 { - helmMapOpts["egressMasqueradeInterfaces"] = "ens+" + if versioncheck.MustCompile(">=1.17.0")(k.chartVersion) { + // AL2023 uses ens interfaces, but we default to eth interfaces for everything else for backwards compatibility, + // since the CLI was assuming eth interfaces before support for AL2023 was introduced + helmMapOpts["egressMasqueradeInterfaces"] = "eth+ ens+" + } else { + helmMapOpts["egressMasqueradeInterfaces"] = "eth+" } case DatapathGKE: diff --git a/vendor/github.com/cilium/cilium/cilium-cli/install/install.go b/vendor/github.com/cilium/cilium/cilium-cli/install/install.go index a9a832dba3..9f8a750175 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/install/install.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/install/install.go @@ -92,10 +92,6 @@ type AzureParameters struct { IsBYOCNI bool } -type AWSParameters struct { - AwsNodeImageFamily string -} - type Parameters struct { Namespace string Writer io.Writer @@ -106,7 +102,6 @@ type Parameters struct { DatapathMode string IPv4NativeRoutingCIDR string Azure AzureParameters - AWS AWSParameters // HelmChartDirectory points to the location of a helm chart directory. // Useful to test from upstream where a helm release is not available yet. @@ -229,11 +224,6 @@ func (k *K8sInstaller) preinstall(ctx context.Context) error { } } case k8s.KindEKS: - // detect AWS AMI type - if err := k.awsRetrieveNodeImageFamily(); err != nil { - return err - } - // setup chaining mode if err := k.awsSetupChainingMode(ctx, helmValues); err != nil { return err diff --git a/vendor/github.com/cilium/cilium/cilium-cli/utils/features/features.go b/vendor/github.com/cilium/cilium/cilium-cli/utils/features/features.go index 1603ad03d7..925a7f6c7a 100644 --- a/vendor/github.com/cilium/cilium/cilium-cli/utils/features/features.go +++ b/vendor/github.com/cilium/cilium/cilium-cli/utils/features/features.go @@ -143,6 +143,9 @@ func (fs Set) MatchRequirements(reqs ...Requirement) (bool, string) { if req.requiresMode && (req.mode != status.Mode) { return false, fmt.Sprintf("requires Feature %s mode %s, got %s", req.Feature, req.mode, status.Mode) } + if req.requireModeIsNot && (req.mode == status.Mode) { + return false, fmt.Sprintf("requires Feature %s mode %s to not equal %s, req.Feature", req.Feature, status.Mode, req.mode) + } } return true, "" @@ -184,8 +187,9 @@ type Requirement struct { requiresEnabled bool enabled bool - requiresMode bool - mode string + requiresMode bool + requireModeIsNot bool + mode string } // RequireEnabled constructs a Requirement which expects the @@ -218,6 +222,20 @@ func RequireMode(feature Feature, mode string) Requirement { } } +// RequiredModeIsNot constructs a Requirement which expects the Feature to not +// be in the given mode +// +// When evaluating a set of requirements with MatchRequirements, +// having a RequireMode requirement of the same feature and mode will cause +// conflicting results. +func RequireModeIsNot(feature Feature, mode string) Requirement { + return Requirement{ + Feature: feature, + requireModeIsNot: true, + mode: mode, + } +} + // ExtractFromVersionedConfigMap extracts features based on Cilium version and cilium-config // ConfigMap. func (fs Set) ExtractFromVersionedConfigMap(ciliumVersion semver.Version, cm *v1.ConfigMap) { diff --git a/vendor/github.com/cilium/cilium/pkg/bgpv1/agent/controller.go b/vendor/github.com/cilium/cilium/pkg/bgpv1/agent/controller.go index 3754e88aed..dfa9c9102d 100644 --- a/vendor/github.com/cilium/cilium/pkg/bgpv1/agent/controller.go +++ b/vendor/github.com/cilium/cilium/pkg/bgpv1/agent/controller.go @@ -270,6 +270,9 @@ func (c *Controller) Reconcile(ctx context.Context) error { log.WithError(err).Error("failed to get BGPNodeConfig") return err } + if bgpncExists { + bgpnc = bgpnc.DeepCopy() // reconcilers can mutate the NodeConfig, make a copy to not mutate the version in store + } switch c.ConfigMode.Get() { case mode.Disabled: diff --git a/vendor/github.com/cilium/cilium/pkg/bgpv1/types/bgp.go b/vendor/github.com/cilium/cilium/pkg/bgpv1/types/bgp.go index a0ff4cd6b8..1541ccd930 100644 --- a/vendor/github.com/cilium/cilium/pkg/bgpv1/types/bgp.go +++ b/vendor/github.com/cilium/cilium/pkg/bgpv1/types/bgp.go @@ -6,6 +6,7 @@ package types import ( "context" "net/netip" + "strings" "github.com/osrg/gobgp/v3/pkg/packet/bgp" @@ -13,6 +14,18 @@ import ( v2alpha1api "github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1" ) +// BGP metric labels +const ( + LabelClusterConfig = "bgp_cluster_config" + LabelVRouter = "vrouter" + LabelNeighbor = "neighbor" + LabelNeighborAsn = "neighbor_asn" + LabelAfi = "afi" + LabelSafi = "safi" + + MetricsSubsystem = "bgp_control_plane" +) + // BGPGlobal contains high level BGP configuration for given instance. type BGPGlobal struct { ASN uint32 @@ -114,6 +127,19 @@ type RoutePolicyConditions struct { MatchFamilies []Family } +// String() constructs a string identifier +func (r RoutePolicyConditions) String() string { + values := []string{} + values = append(values, r.MatchNeighbors...) + for _, family := range r.MatchFamilies { + values = append(values, family.String()) + } + for _, prefix := range r.MatchPrefixes { + values = append(values, prefix.CIDR.String()) + } + return strings.Join(values, "-") +} + // RoutePolicyAction defines the action taken on a route matched by a routing policy. type RoutePolicyAction int diff --git a/vendor/github.com/cilium/cilium/pkg/bgpv1/types/fake_router.go b/vendor/github.com/cilium/cilium/pkg/bgpv1/types/fake_router.go index f1bf0dc4ef..3c67c35606 100644 --- a/vendor/github.com/cilium/cilium/pkg/bgpv1/types/fake_router.go +++ b/vendor/github.com/cilium/cilium/pkg/bgpv1/types/fake_router.go @@ -6,12 +6,14 @@ package types import "context" type FakeRouter struct { - paths map[string]*Path + paths map[string]*Path + policies map[string]*RoutePolicy } func NewFakeRouter() Router { return &FakeRouter{ - paths: make(map[string]*Path), + paths: make(map[string]*Path), + policies: make(map[string]*RoutePolicy), } } @@ -46,10 +48,12 @@ func (f *FakeRouter) WithdrawPath(ctx context.Context, p PathRequest) error { } func (f *FakeRouter) AddRoutePolicy(ctx context.Context, p RoutePolicyRequest) error { + f.policies[p.Policy.Name] = p.Policy return nil } func (f *FakeRouter) RemoveRoutePolicy(ctx context.Context, p RoutePolicyRequest) error { + delete(f.policies, p.Policy.Name) return nil } @@ -69,7 +73,11 @@ func (f *FakeRouter) GetRoutes(ctx context.Context, r *GetRoutesRequest) (*GetRo } func (f *FakeRouter) GetRoutePolicies(ctx context.Context) (*GetRoutePoliciesResponse, error) { - return nil, nil + var policies []*RoutePolicy + for _, policy := range f.policies { + policies = append(policies, policy) + } + return &GetRoutePoliciesResponse{Policies: policies}, nil } func (f *FakeRouter) GetBGP(ctx context.Context) (GetBGPResponse, error) { diff --git a/vendor/github.com/cilium/cilium/pkg/datapath/linux/probes/probes.go b/vendor/github.com/cilium/cilium/pkg/datapath/linux/probes/probes.go index dcf0950dcd..05d91502dd 100644 --- a/vendor/github.com/cilium/cilium/pkg/datapath/linux/probes/probes.go +++ b/vendor/github.com/cilium/cilium/pkg/datapath/linux/probes/probes.go @@ -745,7 +745,6 @@ func ExecuteHeaderProbes() *FeatureProbes { // common probes {ebpf.CGroupSock, asm.FnGetNetnsCookie}, {ebpf.CGroupSockAddr, asm.FnGetNetnsCookie}, - {ebpf.CGroupSockAddr, asm.FnGetSocketCookie}, {ebpf.CGroupSock, asm.FnJiffies64}, {ebpf.CGroupSockAddr, asm.FnJiffies64}, {ebpf.SchedCLS, asm.FnJiffies64}, @@ -778,7 +777,6 @@ func writeCommonHeader(writer io.Writer, probes *FeatureProbes) error { features := map[string]bool{ "HAVE_NETNS_COOKIE": probes.ProgramHelpers[ProgramHelper{ebpf.CGroupSock, asm.FnGetNetnsCookie}] && probes.ProgramHelpers[ProgramHelper{ebpf.CGroupSockAddr, asm.FnGetNetnsCookie}], - "HAVE_SOCKET_COOKIE": probes.ProgramHelpers[ProgramHelper{ebpf.CGroupSockAddr, asm.FnGetSocketCookie}], "HAVE_JIFFIES": probes.ProgramHelpers[ProgramHelper{ebpf.CGroupSock, asm.FnJiffies64}] && probes.ProgramHelpers[ProgramHelper{ebpf.CGroupSockAddr, asm.FnJiffies64}] && probes.ProgramHelpers[ProgramHelper{ebpf.SchedCLS, asm.FnJiffies64}] && diff --git a/vendor/github.com/cilium/cilium/pkg/defaults/defaults.go b/vendor/github.com/cilium/cilium/pkg/defaults/defaults.go index e8032c231f..06b0fab602 100644 --- a/vendor/github.com/cilium/cilium/pkg/defaults/defaults.go +++ b/vendor/github.com/cilium/cilium/pkg/defaults/defaults.go @@ -370,10 +370,6 @@ const ( // kvstore consecutive quorum errors before the agent assumes permanent failure KVstoreMaxConsecutiveQuorumErrors = 2 - // KVstoreKeepAliveIntervalFactor is the factor to calculate the interval - // from KVstoreLeaseTTL in which KVstore lease is being renewed. - KVstoreKeepAliveIntervalFactor = 3 - // LockLeaseTTL is the time-to-live of the lease dedicated for locks of Kvstore. LockLeaseTTL = 25 * time.Second @@ -585,6 +581,9 @@ const ( // EnableSourceIPVerification is the default value for source ip validation EnableSourceIPVerification = true + + // BGPRouterIDAllocationMode is default BGP router-id allocation mode + BGPRouterIDAllocationMode = "default" ) var ( diff --git a/vendor/github.com/cilium/cilium/pkg/envoy/resource/envoy.go b/vendor/github.com/cilium/cilium/pkg/envoy/resource/envoy.go index 25b1eaefe8..1a1c1ed275 100644 --- a/vendor/github.com/cilium/cilium/pkg/envoy/resource/envoy.go +++ b/vendor/github.com/cilium/cilium/pkg/envoy/resource/envoy.go @@ -106,6 +106,7 @@ import ( _ "github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/http/on_demand/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/http/original_src/v3" + _ "github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_logging/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/http/rate_limit_quota/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/http/ratelimit/v3" @@ -130,6 +131,12 @@ import ( _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/dubbo_proxy/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/echo/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/ext_authz/v3" + _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3" + _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3" + _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3" + _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3" + _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3" + _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/local_ratelimit/v3" _ "github.com/cilium/proxy/go/envoy/extensions/filters/network/mongo_proxy/v3" @@ -192,6 +199,7 @@ import ( _ "github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/ssl/v3" _ "github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/consistent_hashing/v3" _ "github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/ip/v3" + _ "github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3" _ "github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/runtime_fraction/v3" _ "github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/apple/v3" _ "github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/cares/v3" @@ -211,6 +219,7 @@ import ( _ "github.com/cilium/proxy/go/envoy/extensions/rbac/matchers/upstream_ip_port/v3" _ "github.com/cilium/proxy/go/envoy/extensions/regex_engines/v3" _ "github.com/cilium/proxy/go/envoy/extensions/request_id/uuid/v3" + _ "github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3" _ "github.com/cilium/proxy/go/envoy/extensions/resource_monitors/downstream_connections/v3" _ "github.com/cilium/proxy/go/envoy/extensions/resource_monitors/fixed_heap/v3" _ "github.com/cilium/proxy/go/envoy/extensions/resource_monitors/injected_resource/v3" @@ -260,6 +269,7 @@ import ( _ "github.com/cilium/proxy/go/envoy/service/metrics/v3" _ "github.com/cilium/proxy/go/envoy/service/rate_limit_quota/v3" _ "github.com/cilium/proxy/go/envoy/service/ratelimit/v3" + _ "github.com/cilium/proxy/go/envoy/service/redis_auth/v3" _ "github.com/cilium/proxy/go/envoy/service/route/v3" _ "github.com/cilium/proxy/go/envoy/service/runtime/v3" _ "github.com/cilium/proxy/go/envoy/service/secret/v3" diff --git a/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/register.go b/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/register.go index d339efce42..963cab1e9c 100644 --- a/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/register.go +++ b/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/register.go @@ -15,5 +15,5 @@ const ( // // Maintainers: Run ./Documentation/check-crd-compat-table.sh for each release // Developers: Bump patch for each change in the CRD schema. - CustomResourceDefinitionSchemaVersion = "1.30.6" + CustomResourceDefinitionSchemaVersion = "1.31.0" ) diff --git a/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/bgp_node_override_types.go b/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/bgp_node_override_types.go index f14bdb419e..72f714df08 100644 --- a/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/bgp_node_override_types.go +++ b/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/bgp_node_override_types.go @@ -77,6 +77,13 @@ type CiliumBGPNodeConfigInstanceOverride struct { // +listType=map // +listMapKey=name Peers []CiliumBGPNodeConfigPeerOverride `json:"peers,omitempty"` + + // LocalASN is the ASN to use for this BGP instance. + // + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Minimum=1 + // +kubebuilder:validation:Maximum=4294967295 + LocalASN *int64 `json:"localASN,omitempty"` } // CiliumBGPNodeConfigPeerOverride defines configuration options which can be overridden for a specific peer. diff --git a/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/zz_generated.deepcopy.go b/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/zz_generated.deepcopy.go index ad712afe26..6a0a23bd17 100644 --- a/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/zz_generated.deepcopy.go @@ -545,6 +545,11 @@ func (in *CiliumBGPNodeConfigInstanceOverride) DeepCopyInto(out *CiliumBGPNodeCo (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.LocalASN != nil { + in, out := &in.LocalASN, &out.LocalASN + *out = new(int64) + **out = **in + } return } diff --git a/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/zz_generated.deepequal.go b/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/zz_generated.deepequal.go index cca99d9aea..5e5d0bee96 100644 --- a/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/zz_generated.deepequal.go +++ b/vendor/github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2alpha1/zz_generated.deepequal.go @@ -560,6 +560,14 @@ func (in *CiliumBGPNodeConfigInstanceOverride) DeepEqual(other *CiliumBGPNodeCon } } + if (in.LocalASN == nil) != (other.LocalASN == nil) { + return false + } else if in.LocalASN != nil { + if *in.LocalASN != *other.LocalASN { + return false + } + } + return true } diff --git a/vendor/github.com/cilium/cilium/pkg/k8s/service_cache.go b/vendor/github.com/cilium/cilium/pkg/k8s/service_cache.go index b8236fb69a..3c19338a8c 100644 --- a/vendor/github.com/cilium/cilium/pkg/k8s/service_cache.go +++ b/vendor/github.com/cilium/cilium/pkg/k8s/service_cache.go @@ -413,11 +413,11 @@ func (s *ServiceCache) DeleteService(k8sSvc *slim_corev1.Service, swg *lock.Stop if serviceOK { s.metrics.DelService(oldService) s.emitEvent(ServiceEvent{ - Action: DeleteService, - ID: svcID, - Service: oldService, - Endpoints: endpoints, - SWGDone: swg.Add(), + Action: DeleteService, + ID: svcID, + OldService: oldService, + OldEndpoints: endpoints, + SWGDone: swg.Add(), }) } } @@ -808,6 +808,7 @@ func (s *ServiceCache) mergeExternalServiceDeleteLocked(service *serviceStore.Cl Action: UpdateService, ID: id, Service: svc, + OldService: svc, Endpoints: endpoints, OldEndpoints: oldEPs, SWGDone: swg.Add(), @@ -816,6 +817,8 @@ func (s *ServiceCache) mergeExternalServiceDeleteLocked(service *serviceStore.Cl if !serviceReady { delete(s.services, id) event.Action = DeleteService + event.Service = nil + event.Endpoints = nil } s.emitEvent(event) @@ -871,11 +874,11 @@ func (s *ServiceCache) MergeClusterServiceDelete(service *serviceStore.ClusterSe if ok { s.emitEvent(ServiceEvent{ - Action: DeleteService, - ID: id, - Service: svc, - Endpoints: endpoints, - SWGDone: swg.Add(), + Action: DeleteService, + ID: id, + OldService: svc, + OldEndpoints: endpoints, + SWGDone: swg.Add(), }) } } diff --git a/vendor/github.com/cilium/cilium/pkg/metrics/metrics.go b/vendor/github.com/cilium/cilium/pkg/metrics/metrics.go index ac6a77f132..08ea50f93d 100644 --- a/vendor/github.com/cilium/cilium/pkg/metrics/metrics.go +++ b/vendor/github.com/cilium/cilium/pkg/metrics/metrics.go @@ -353,6 +353,11 @@ var ( // time taken to fully deploy an endpoint. PolicyImplementationDelay = NoOpObserverVec + // PolicyIncrementalUpdateDuration is the time it takes to apply an incremental update + // to the policy engine. An incremental update is a newly-learned identity that can be + // directly added to policy maps without a full policy recalculation. + PolicyIncrementalUpdateDuration = NoOpObserverVec + // CIDRGroup // CIDRGroupsReferenced is the number of CNPs and CCNPs referencing at least one CiliumCIDRGroup. @@ -669,6 +674,7 @@ type LegacyMetrics struct { PolicyChangeTotal metric.Vec[metric.Counter] PolicyEndpointStatus metric.Vec[metric.Gauge] PolicyImplementationDelay metric.Vec[metric.Observer] + PolicyIncrementalUpdateDuration metric.Vec[metric.Observer] CIDRGroupsReferenced metric.Gauge Identity metric.Vec[metric.Gauge] IdentityLabelSources metric.Vec[metric.Gauge] @@ -842,6 +848,15 @@ func NewLegacyMetrics() *LegacyMetrics { }, }), + PolicyIncrementalUpdateDuration: metric.NewHistogramVec(metric.HistogramOpts{ + ConfigName: Namespace + "_policy_incremental_update_duration", + + Namespace: Namespace, + Name: "policy_incremental_update_duration", + Help: "Time between learning about a new identity and it being fully added to all policies.", + Buckets: prometheus.ExponentialBuckets(10e-6, 10, 8), + }, []string{"scope"}), + CIDRGroupsReferenced: metric.NewGauge(metric.GaugeOpts{ ConfigName: Namespace + "cidrgroups_referenced", @@ -1381,6 +1396,7 @@ func NewLegacyMetrics() *LegacyMetrics { PolicyChangeTotal = lm.PolicyChangeTotal PolicyEndpointStatus = lm.PolicyEndpointStatus PolicyImplementationDelay = lm.PolicyImplementationDelay + PolicyIncrementalUpdateDuration = lm.PolicyIncrementalUpdateDuration CIDRGroupsReferenced = lm.CIDRGroupsReferenced Identity = lm.Identity IdentityLabelSources = lm.IdentityLabelSources diff --git a/vendor/github.com/cilium/cilium/pkg/monitor/api/types.go b/vendor/github.com/cilium/cilium/pkg/monitor/api/types.go index ed76ce2b73..fc15a962a2 100644 --- a/vendor/github.com/cilium/cilium/pkg/monitor/api/types.go +++ b/vendor/github.com/cilium/cilium/pkg/monitor/api/types.go @@ -455,8 +455,9 @@ type ServiceUpsertNotificationAddr struct { type ServiceUpsertNotification struct { ID uint32 `json:"id"` - Frontend ServiceUpsertNotificationAddr `json:"frontend-address"` - Backends []ServiceUpsertNotificationAddr `json:"backend-addresses"` + Frontend ServiceUpsertNotificationAddr `json:"frontend-address"` + Backends []ServiceUpsertNotificationAddr `json:"backend-addresses"` + NumBackendsOmitted int `json:"num-backends-omitted,omitempty"` Type string `json:"type,omitempty"` ExtTrafficPolicy string `json:"ext-traffic-policy,omitempty"` @@ -471,17 +472,19 @@ func ServiceUpsertMessage( id uint32, frontend ServiceUpsertNotificationAddr, backends []ServiceUpsertNotificationAddr, + numBackendsOmitted int, svcType, svcExtTrafficPolicy, svcIntTrafficPolicy, svcName, svcNamespace string, ) AgentNotifyMessage { notification := ServiceUpsertNotification{ - ID: id, - Frontend: frontend, - Backends: backends, - Type: svcType, - ExtTrafficPolicy: svcExtTrafficPolicy, - IntTrafficPolicy: svcIntTrafficPolicy, - Name: svcName, - Namespace: svcNamespace, + ID: id, + Frontend: frontend, + Backends: backends, + NumBackendsOmitted: numBackendsOmitted, + Type: svcType, + ExtTrafficPolicy: svcExtTrafficPolicy, + IntTrafficPolicy: svcIntTrafficPolicy, + Name: svcName, + Namespace: svcNamespace, } return AgentNotifyMessage{ diff --git a/vendor/github.com/cilium/cilium/pkg/node/bootid.go b/vendor/github.com/cilium/cilium/pkg/node/bootid.go index 7345749991..e341fc7c74 100644 --- a/vendor/github.com/cilium/cilium/pkg/node/bootid.go +++ b/vendor/github.com/cilium/cilium/pkg/node/bootid.go @@ -11,8 +11,6 @@ var ( ) func GetBootID() string { - logOnce.Do(func() { - log.Infof("Local boot ID is %q", localBootID) - }) + logOnce.Do(initLocalBootID) return localBootID } diff --git a/vendor/github.com/cilium/cilium/pkg/node/bootid_linux.go b/vendor/github.com/cilium/cilium/pkg/node/bootid_linux.go index a47ab5f17f..d7daac2305 100644 --- a/vendor/github.com/cilium/cilium/pkg/node/bootid_linux.go +++ b/vendor/github.com/cilium/cilium/pkg/node/bootid_linux.go @@ -1,20 +1,23 @@ // SPDX-License-Identifier: Apache-2.0 // Copyright Authors of Cilium +//go:build linux + package node import ( "os" "strings" -) -var bootIDFilePath = "/proc/sys/kernel/random/boot_id" + "github.com/cilium/cilium/pkg/option" +) -func init() { - bootID, err := os.ReadFile(bootIDFilePath) +func initLocalBootID() { + bootID, err := os.ReadFile(option.Config.BootIDFile) if err != nil { - log.WithError(err).Warnf("Could not read boot id from %s", bootIDFilePath) + log.WithError(err).Warnf("Could not read boot id from %s", option.Config.BootIDFile) return } localBootID = strings.TrimSpace(string(bootID)) + log.Infof("Local boot ID is %q", localBootID) } diff --git a/vendor/github.com/cilium/cilium/pkg/node/bootid_other.go b/vendor/github.com/cilium/cilium/pkg/node/bootid_other.go new file mode 100644 index 0000000000..5bdafe9b6b --- /dev/null +++ b/vendor/github.com/cilium/cilium/pkg/node/bootid_other.go @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Authors of Cilium + +//go:build !linux + +package node + +func initLocalBootID() { +} diff --git a/vendor/github.com/cilium/cilium/pkg/option/config.go b/vendor/github.com/cilium/cilium/pkg/option/config.go index 9ef2c30655..9215cd7566 100644 --- a/vendor/github.com/cilium/cilium/pkg/option/config.go +++ b/vendor/github.com/cilium/cilium/pkg/option/config.go @@ -206,6 +206,13 @@ const ( // K8sServiceCacheSize is service cache size for cilium k8s package. K8sServiceCacheSize = "k8s-service-cache-size" + // K8sServiceDebounceBufferSize is the maximum number of service events to buffer. + K8sServiceDebounceBufferSize = "k8s-service-debounce-buffer-size" + + // K8sServiceDebounceBufferWaitTime is the amount of time to wait before emitting + // the service event buffer. + K8sServiceDebounceWaitTime = "k8s-service-debounce-wait-time" + // K8sSyncTimeout is the timeout since last event was received to synchronize all resources with k8s. K8sSyncTimeoutName = "k8s-sync-timeout" @@ -769,6 +776,11 @@ const ( // This feature will encrypt overlay traffic before it leaves the cluster. EnableIPSecEncryptedOverlay = "enable-ipsec-encrypted-overlay" + // BootIDFilename is a hidden flag that allows users to specify a + // filename other than /proc/sys/kernel/random/boot_id. This can be + // useful for testing purposes in local containerized cluster. + BootIDFilename = "boot-id-file" + // EnableWireguard is the name of the option to enable WireGuard EnableWireguard = "enable-wireguard" @@ -1085,6 +1097,9 @@ const ( // EnableBGPControlPlaneStatusReport enables BGP Control Plane CRD status reporting EnableBGPControlPlaneStatusReport = "enable-bgp-control-plane-status-report" + // BGP router-id allocation mode in ipv6 standalone environment + BGPRouterIDAllocationMode = "bgp-router-id-allocation-mode" + // EnableRuntimeDeviceDetection is the name of the option to enable detection // of new and removed datapath devices during the agent runtime. EnableRuntimeDeviceDetection = "enable-runtime-device-detection" @@ -1398,6 +1413,13 @@ type DaemonConfig struct { // K8sServiceCacheSize is the service cache size for cilium k8s package. K8sServiceCacheSize uint + // Number of distinct services to buffer at most. + K8sServiceDebounceBufferSize int + + // The amount of time to wait to debounce service events before + // emitting the buffer. + K8sServiceDebounceWaitTime time.Duration + // MTU is the maximum transmission unit of the underlying network MTU int @@ -1559,6 +1581,9 @@ type DaemonConfig struct { // EnableIPSecEncryptedOverlay enables IPSec encryption for overlay traffic. EnableIPSecEncryptedOverlay bool + // BootIDFile is the file containing the boot ID of the node + BootIDFile string + // EnableWireguard enables Wireguard encryption EnableWireguard bool @@ -1768,11 +1793,6 @@ type DaemonConfig struct { // is marked as healthy. HealthCheckICMPFailureThreshold int - // KVstoreKeepAliveInterval is the interval in which the lease is being - // renewed. This must be set to a value lesser than the LeaseTTL ideally - // by a factor of 3. - KVstoreKeepAliveInterval time.Duration - // KVstoreLeaseTTL is the time-to-live for kvstore lease. KVstoreLeaseTTL time.Duration @@ -2168,6 +2188,9 @@ type DaemonConfig struct { // Enables BGP control plane status reporting. EnableBGPControlPlaneStatusReport bool + // BGPRouterIDAllocationMode is the mode to allocate the BGP router-id in ipv6 standalone environment. + BGPRouterIDAllocationMode string + // BPFMapEventBuffers has configuration on what BPF map event buffers to enabled // and configuration options for those. BPFMapEventBuffers map[string]string @@ -2824,9 +2847,7 @@ func (c *DaemonConfig) Populate(vp *viper.Viper) { c.EnableXDPPrefilter = vp.GetBool(EnableXDPPrefilter) c.EnableTCX = vp.GetBool(EnableTCX) c.DisableCiliumEndpointCRD = vp.GetBool(DisableCiliumEndpointCRDName) - if masqInfs := vp.GetString(MasqueradeInterfaces); masqInfs != "" { - c.MasqueradeInterfaces = strings.Split(masqInfs, ",") - } + c.MasqueradeInterfaces = vp.GetStringSlice(MasqueradeInterfaces) c.BPFSocketLBHostnsOnly = vp.GetBool(BPFSocketLBHostnsOnly) c.EnableSocketLB = vp.GetBool(EnableSocketLB) c.EnableSocketLBTracing = vp.GetBool(EnableSocketLBTracing) @@ -2877,13 +2898,14 @@ func (c *DaemonConfig) Populate(vp *viper.Viper) { c.K8sRequireIPv4PodCIDR = vp.GetBool(K8sRequireIPv4PodCIDRName) c.K8sRequireIPv6PodCIDR = vp.GetBool(K8sRequireIPv6PodCIDRName) c.K8sServiceCacheSize = uint(vp.GetInt(K8sServiceCacheSize)) + c.K8sServiceDebounceBufferSize = vp.GetInt(K8sServiceDebounceBufferSize) + c.K8sServiceDebounceWaitTime = vp.GetDuration(K8sServiceDebounceWaitTime) c.K8sSyncTimeout = vp.GetDuration(K8sSyncTimeoutName) c.AllocatorListTimeout = vp.GetDuration(AllocatorListTimeoutName) c.K8sWatcherEndpointSelector = vp.GetString(K8sWatcherEndpointSelector) c.KeepConfig = vp.GetBool(KeepConfig) c.KVStore = vp.GetString(KVStore) c.KVstoreLeaseTTL = vp.GetDuration(KVstoreLeaseTTL) - c.KVstoreKeepAliveInterval = c.KVstoreLeaseTTL / defaults.KVstoreKeepAliveIntervalFactor c.KVstorePeriodicSync = vp.GetDuration(KVstorePeriodicSync) c.KVstoreConnectivityTimeout = vp.GetDuration(KVstoreConnectivityTimeout) c.KVstorePodNetworkSupport = vp.GetBool(KVstorePodNetworkSupport) @@ -2953,6 +2975,7 @@ func (c *DaemonConfig) Populate(vp *viper.Viper) { c.BPFConntrackAccounting = vp.GetBool(BPFConntrackAccounting) c.EnableIPSecEncryptedOverlay = vp.GetBool(EnableIPSecEncryptedOverlay) c.LBSourceRangeAllTypes = vp.GetBool(LBSourceRangeAllTypes) + c.BootIDFile = vp.GetString(BootIDFilename) c.ServiceNoBackendResponse = vp.GetString(ServiceNoBackendResponse) switch c.ServiceNoBackendResponse { @@ -3277,6 +3300,9 @@ func (c *DaemonConfig) Populate(vp *viper.Viper) { // Enable BGP control plane status reporting c.EnableBGPControlPlaneStatusReport = vp.GetBool(EnableBGPControlPlaneStatusReport) + // BGP router-id allocation mode in IPv6 standalone environment + c.BGPRouterIDAllocationMode = vp.GetString(BGPRouterIDAllocationMode) + // Support failure-mode for policy map overflow c.EnableEndpointLockdownOnPolicyOverflow = vp.GetBool(EnableEndpointLockdownOnPolicyOverflow) diff --git a/vendor/github.com/cilium/cilium/pkg/policy/api/rule_validation.go b/vendor/github.com/cilium/cilium/pkg/policy/api/rule_validation.go index 1e627c3f51..126fd1c98d 100644 --- a/vendor/github.com/cilium/cilium/pkg/policy/api/rule_validation.go +++ b/vendor/github.com/cilium/cilium/pkg/policy/api/rule_validation.go @@ -23,6 +23,9 @@ const ( var ( ErrFromToNodesRequiresNodeSelectorOption = fmt.Errorf("FromNodes/ToNodes rules can only be applied when the %q flag is set", option.EnableNodeSelectorLabels) + errUnsupportedICMPWithToPorts = errors.New("the ICMPs block may only be present without ToPorts. Define a separate rule to use ToPorts") + errEmptyServerName = errors.New("empty server name is not allowed") + enableDefaultDenyDefault = true ) @@ -54,10 +57,10 @@ func (r *Rule) Sanitize() error { } if r.EndpointSelector.LabelSelector == nil && r.NodeSelector.LabelSelector == nil { - return fmt.Errorf("rule must have one of EndpointSelector or NodeSelector") + return errors.New("rule must have one of EndpointSelector or NodeSelector") } if r.EndpointSelector.LabelSelector != nil && r.NodeSelector.LabelSelector != nil { - return fmt.Errorf("rule cannot have both EndpointSelector and NodeSelector") + return errors.New("rule cannot have both EndpointSelector and NodeSelector") } if r.EndpointSelector.LabelSelector != nil { @@ -80,12 +83,24 @@ func (r *Rule) Sanitize() error { } } + for i := range r.IngressDeny { + if err := r.IngressDeny[i].sanitize(); err != nil { + return err + } + } + for i := range r.Egress { if err := r.Egress[i].sanitize(hostPolicy); err != nil { return err } } + for i := range r.EgressDeny { + if err := r.EgressDeny[i].sanitize(); err != nil { + return err + } + } + return nil } @@ -102,32 +117,19 @@ func countL7Rules(ports []PortRule) map[string]int { } func (i *IngressRule) sanitize(hostPolicy bool) error { - var retErr error - - l3Members := map[string]int{ - "FromEndpoints": len(i.FromEndpoints), - "FromCIDR": len(i.FromCIDR), - "FromCIDRSet": len(i.FromCIDRSet), - "FromEntities": len(i.FromEntities), - "FromNodes": len(i.FromNodes), - "FromGroups": len(i.FromGroups), - } l7Members := countL7Rules(i.ToPorts) l7IngressSupport := map[string]bool{ "DNS": false, "Kafka": true, "HTTP": true, } - if hostPolicy && len(l7Members) > 0 { - return fmt.Errorf("L7 policy is not supported on host ingress yet") + + if err := i.IngressCommonRule.sanitize(); err != nil { + return err } - for m1 := range l3Members { - for m2 := range l3Members { - if m2 != m1 && l3Members[m1] > 0 && l3Members[m2] > 0 { - return fmt.Errorf("Combining %s and %s is not supported yet", m1, m2) - } - } + if hostPolicy && len(l7Members) > 0 { + return errors.New("L7 policy is not supported on host ingress yet") } if len(l7Members) > 0 && !option.Config.EnableL7Proxy { @@ -144,27 +146,41 @@ func (i *IngressRule) sanitize(hostPolicy bool) error { } if len(i.ICMPs) > 0 && len(i.ToPorts) > 0 { - return fmt.Errorf("The ICMPs block may only be present without ToPorts. Define a separate rule to use ToPorts.") + return errUnsupportedICMPWithToPorts } - if len(i.FromNodes) > 0 && !option.Config.EnableNodeSelectorLabels { - retErr = ErrFromToNodesRequiresNodeSelectorOption - } - - for _, es := range i.FromEndpoints { - if err := es.sanitize(); err != nil { + for n := range i.ToPorts { + if err := i.ToPorts[n].sanitize(true); err != nil { return err } } - for _, es := range i.FromRequires { - if err := es.sanitize(); err != nil { + for n := range i.ICMPs { + if err := i.ICMPs[n].verify(); err != nil { return err } } + i.SetAggregatedSelectors() + + return nil +} + +func (i *IngressDenyRule) sanitize() error { + if err := i.IngressCommonRule.sanitize(); err != nil { + return err + } + + if len(i.ICMPs) > 0 && !option.Config.EnableICMPRules { + return fmt.Errorf("ICMP rules can only be applied when the %q flag is set", option.EnableICMPRules) + } + + if len(i.ICMPs) > 0 && len(i.ToPorts) > 0 { + return errUnsupportedICMPWithToPorts + } + for n := range i.ToPorts { - if err := i.ToPorts[n].sanitize(true); err != nil { + if err := i.ToPorts[n].sanitize(); err != nil { return err } } @@ -175,33 +191,72 @@ func (i *IngressRule) sanitize(hostPolicy bool) error { } } + i.SetAggregatedSelectors() + + return nil +} + +func (i *IngressCommonRule) sanitize() error { + l3Members := map[string]int{ + "FromEndpoints": len(i.FromEndpoints), + "FromCIDR": len(i.FromCIDR), + "FromCIDRSet": len(i.FromCIDRSet), + "FromEntities": len(i.FromEntities), + "FromNodes": len(i.FromNodes), + "FromGroups": len(i.FromGroups), + } + + for m1 := range l3Members { + for m2 := range l3Members { + if m2 != m1 && l3Members[m1] > 0 && l3Members[m2] > 0 { + return fmt.Errorf("combining %s and %s is not supported yet", m1, m2) + } + } + } + + var retErr error + + if len(i.FromNodes) > 0 && !option.Config.EnableNodeSelectorLabels { + retErr = ErrFromToNodesRequiresNodeSelectorOption + } + + for _, es := range i.FromEndpoints { + if err := es.sanitize(); err != nil { + return errors.Join(err, retErr) + } + } + + for _, es := range i.FromRequires { + if err := es.sanitize(); err != nil { + return errors.Join(err, retErr) + } + } + for _, ns := range i.FromNodes { if err := ns.sanitize(); err != nil { - return err + return errors.Join(err, retErr) } } for n := range i.FromCIDR { if err := i.FromCIDR[n].sanitize(); err != nil { - return err + return errors.Join(err, retErr) } } for n := range i.FromCIDRSet { if err := i.FromCIDRSet[n].sanitize(); err != nil { - return err + return errors.Join(err, retErr) } } for _, fromEntity := range i.FromEntities { _, ok := EntitySelectorMapping[fromEntity] if !ok { - return fmt.Errorf("unsupported entity: %s", fromEntity) + return errors.Join(fmt.Errorf("unsupported entity: %s", fromEntity), retErr) } } - i.SetAggregatedSelectors() - return retErr } @@ -240,28 +295,8 @@ func countNonGeneratedEndpoints(s []EndpointSelector) int { } func (e *EgressRule) sanitize(hostPolicy bool) error { - var retErr error - - l3Members := map[string]int{ - "ToCIDR": len(e.ToCIDR), - "ToCIDRSet": countNonGeneratedCIDRRules(e.ToCIDRSet), - "ToEndpoints": countNonGeneratedEndpoints(e.ToEndpoints), - "ToEntities": len(e.ToEntities), - "ToServices": len(e.ToServices), - "ToFQDNs": len(e.ToFQDNs), - "ToGroups": len(e.ToGroups), - "ToNodes": len(e.ToNodes), - } - l3DependentL4Support := map[interface{}]bool{ - "ToCIDR": true, - "ToCIDRSet": true, - "ToEndpoints": true, - "ToEntities": true, - "ToServices": true, - "ToFQDNs": true, - "ToGroups": true, - "ToNodes": true, - } + l3Members := e.l3Members() + l3DependentL4Support := e.l3DependentL4Support() l7Members := countL7Rules(e.ToPorts) l7EgressSupport := map[string]bool{ "DNS": true, @@ -269,16 +304,13 @@ func (e *EgressRule) sanitize(hostPolicy bool) error { "HTTP": !hostPolicy, } - for m1 := range l3Members { - for m2 := range l3Members { - if m2 != m1 && l3Members[m1] > 0 && l3Members[m2] > 0 { - return fmt.Errorf("Combining %s and %s is not supported yet", m1, m2) - } - } + if err := e.EgressCommonRule.sanitize(l3Members); err != nil { + return err } + for member := range l3Members { if l3Members[member] > 0 && len(e.ToPorts) > 0 && !l3DependentL4Support[member] { - return fmt.Errorf("Combining %s and ToPorts is not supported yet", member) + return fmt.Errorf("combining %s and ToPorts is not supported yet", member) } } @@ -300,27 +332,69 @@ func (e *EgressRule) sanitize(hostPolicy bool) error { } if len(e.ICMPs) > 0 && len(e.ToPorts) > 0 { - return fmt.Errorf("The ICMPs block may only be present without ToPorts. Define a separate rule to use ToPorts.") + return errUnsupportedICMPWithToPorts } - if len(e.ToNodes) > 0 && !option.Config.EnableNodeSelectorLabels { - retErr = ErrFromToNodesRequiresNodeSelectorOption + for i := range e.ToPorts { + if err := e.ToPorts[i].sanitize(false); err != nil { + return err + } } - for _, es := range e.ToEndpoints { - if err := es.sanitize(); err != nil { + for n := range e.ICMPs { + if err := e.ICMPs[n].verify(); err != nil { return err } } - for _, es := range e.ToRequires { - if err := es.sanitize(); err != nil { + for i := range e.ToFQDNs { + err := e.ToFQDNs[i].sanitize() + if err != nil { return err } } + e.SetAggregatedSelectors() + + return nil +} + +func (e *EgressRule) l3Members() map[string]int { + l3Members := e.EgressCommonRule.l3Members() + l3Members["ToFQDNs"] = len(e.ToFQDNs) + return l3Members +} + +func (e *EgressRule) l3DependentL4Support() map[string]bool { + l3DependentL4Support := e.EgressCommonRule.l3DependentL4Support() + l3DependentL4Support["ToFQDNs"] = true + return l3DependentL4Support +} + +func (e *EgressDenyRule) sanitize() error { + l3Members := e.l3Members() + l3DependentL4Support := e.l3DependentL4Support() + + if err := e.EgressCommonRule.sanitize(l3Members); err != nil { + return err + } + + for member := range l3Members { + if l3Members[member] > 0 && len(e.ToPorts) > 0 && !l3DependentL4Support[member] { + return fmt.Errorf("combining %s and ToPorts is not supported yet", member) + } + } + + if len(e.ICMPs) > 0 && !option.Config.EnableICMPRules { + return fmt.Errorf("ICMP rules can only be applied when the %q flag is set", option.EnableICMPRules) + } + + if len(e.ICMPs) > 0 && len(e.ToPorts) > 0 { + return errUnsupportedICMPWithToPorts + } + for i := range e.ToPorts { - if err := e.ToPorts[i].sanitize(false); err != nil { + if err := e.ToPorts[i].sanitize(); err != nil { return err } } @@ -331,40 +405,95 @@ func (e *EgressRule) sanitize(hostPolicy bool) error { } } + e.SetAggregatedSelectors() + + return nil +} + +func (e *EgressDenyRule) l3Members() map[string]int { + return e.EgressCommonRule.l3Members() +} + +func (e *EgressDenyRule) l3DependentL4Support() map[string]bool { + return e.EgressCommonRule.l3DependentL4Support() +} + +func (e *EgressCommonRule) sanitize(l3Members map[string]int) error { + for m1 := range l3Members { + for m2 := range l3Members { + if m2 != m1 && l3Members[m1] > 0 && l3Members[m2] > 0 { + return fmt.Errorf("combining %s and %s is not supported yet", m1, m2) + } + } + } + + var retErr error + + if len(e.ToNodes) > 0 && !option.Config.EnableNodeSelectorLabels { + retErr = ErrFromToNodesRequiresNodeSelectorOption + } + + for _, es := range e.ToEndpoints { + if err := es.sanitize(); err != nil { + return errors.Join(err, retErr) + } + } + + for _, es := range e.ToRequires { + if err := es.sanitize(); err != nil { + return errors.Join(err, retErr) + } + } + for _, ns := range e.ToNodes { if err := ns.sanitize(); err != nil { - return err + return errors.Join(err, retErr) } } for i := range e.ToCIDR { if err := e.ToCIDR[i].sanitize(); err != nil { - return err + return errors.Join(err, retErr) } } for i := range e.ToCIDRSet { if err := e.ToCIDRSet[i].sanitize(); err != nil { - return err + return errors.Join(err, retErr) } } for _, toEntity := range e.ToEntities { _, ok := EntitySelectorMapping[toEntity] if !ok { - return fmt.Errorf("unsupported entity: %s", toEntity) + return errors.Join(fmt.Errorf("unsupported entity: %s", toEntity), retErr) } } - for i := range e.ToFQDNs { - err := e.ToFQDNs[i].sanitize() - if err != nil { - return err - } - } + return retErr +} - e.SetAggregatedSelectors() +func (e *EgressCommonRule) l3Members() map[string]int { + return map[string]int{ + "ToCIDR": len(e.ToCIDR), + "ToCIDRSet": countNonGeneratedCIDRRules(e.ToCIDRSet), + "ToEndpoints": countNonGeneratedEndpoints(e.ToEndpoints), + "ToEntities": len(e.ToEntities), + "ToServices": len(e.ToServices), + "ToGroups": len(e.ToGroups), + "ToNodes": len(e.ToNodes), + } +} - return retErr +func (e *EgressCommonRule) l3DependentL4Support() map[string]bool { + return map[string]bool{ + "ToCIDR": true, + "ToCIDRSet": true, + "ToEndpoints": true, + "ToEntities": true, + "ToServices": true, + "ToGroups": true, + "ToNodes": true, + } } func (pr *L7Rules) sanitize(ports []PortProtocol) error { @@ -392,7 +521,7 @@ func (pr *L7Rules) sanitize(ports []PortProtocol) error { // Forthcoming TPROXY redirection restricts DNS proxy to the standard DNS port (53). // Require the port 53 be explicitly configured, and disallow other port numbers. if len(ports) == 0 { - return fmt.Errorf("Port 53 must be specified for DNS rules") + return errors.New("port 53 must be specified for DNS rules") } nTypes++ @@ -436,7 +565,7 @@ func (pr *PortRule) sanitize(ingress bool) error { } for _, sn := range pr.ServerNames { if sn == "" { - return fmt.Errorf("Empty server name is not allowed") + return errEmptyServerName } } @@ -482,7 +611,7 @@ func (pr *PortRule) sanitize(ingress bool) error { // Sanitize L7 rules if !pr.Rules.IsEmpty() { if haveZeroPort { - return fmt.Errorf("L7 rules can not be used when a port is 0") + return errors.New("L7 rules can not be used when a port is 0") } if err := pr.Rules.sanitize(pr.Ports); err != nil { @@ -492,9 +621,22 @@ func (pr *PortRule) sanitize(ingress bool) error { return nil } +func (pr *PortDenyRule) sanitize() error { + if len(pr.Ports) > maxPorts { + return fmt.Errorf("too many ports, the max is %d", maxPorts) + } + for i := range pr.Ports { + if _, err := pr.Ports[i].sanitize(false); err != nil { + return err + } + } + + return nil +} + func (pp *PortProtocol) sanitize(hasDNSRules bool) (isZero bool, err error) { if pp.Port == "" { - return isZero, fmt.Errorf("Port must be specified") + return isZero, errors.New("Port must be specified") } // Port names are formatted as IANA Service Names. This means that @@ -505,7 +647,7 @@ func (pp *PortProtocol) sanitize(hasDNSRules bool) (isZero bool, err error) { } else { p, err := strconv.ParseUint(pp.Port, 0, 16) if err != nil { - return isZero, fmt.Errorf("Unable to parse port: %w", err) + return isZero, fmt.Errorf("unable to parse port: %w", err) } isZero = p == 0 if hasDNSRules && pp.EndPort > int32(p) { @@ -588,7 +730,7 @@ func (c *CIDRRule) sanitize() error { // the logic in api.CIDR.Sanitize(). prefix, err := netip.ParsePrefix(string(c.Cidr)) if err != nil { - return fmt.Errorf("Unable to parse CIDRRule %q: %w", c.Cidr, err) + return fmt.Errorf("unable to parse CIDRRule %q: %w", c.Cidr, err) } prefixLength := prefix.Bits() diff --git a/vendor/github.com/cilium/cilium/pkg/policy/mapstate.go b/vendor/github.com/cilium/cilium/pkg/policy/mapstate.go index a2abbb0630..a2283a4b1e 100644 --- a/vendor/github.com/cilium/cilium/pkg/policy/mapstate.go +++ b/vendor/github.com/cilium/cilium/pkg/policy/mapstate.go @@ -303,26 +303,26 @@ func (ms *mapState) LPMAncestors(key Key) iter.Seq2[Key, mapStateEntry] { } } -// Lookup finds the policy verdict applicable to the given 'key' using the same precedence logic +// lookup finds the policy verdict applicable to the given 'key' using the same precedence logic // between L3 and L4-only policies as the bpf datapath when both match the given 'key'. // To be used in testing in place of the bpf datapath when full integration testing is not desired. // Returns the closest matching covering policy entry and 'true' if found. // 'key' must not have a wildcard identity or port. -func (ms *mapState) Lookup(key Key) (MapStateEntry, bool) { +func (ms *mapState) lookup(key Key) (mapStateEntry, bool) { // Validate that the search key has no wildcards if key.Identity == 0 || key.Nexthdr == 0 || key.DestPort == 0 || key.EndPort() != key.DestPort { panic("invalid key for Lookup") } var l3key, l4key Key - var l3entry, l4entry MapStateEntry + var l3entry, l4entry mapStateEntry var haveL3, haveL4 bool for k, v := range ms.LPMAncestors(key) { if !haveL3 && k.Identity != 0 { - l3key, l3entry = k, v.MapStateEntry + l3key, l3entry = k, v haveL3 = true } if !haveL4 && k.Identity == 0 { - l4key, l4entry = k, v.MapStateEntry + l4key, l4entry = k, v haveL4 = true } if haveL3 && haveL4 { @@ -330,7 +330,7 @@ func (ms *mapState) Lookup(key Key) (MapStateEntry, bool) { } } - authOverride := func(entry, other MapStateEntry) MapStateEntry { + authOverride := func(entry, other mapStateEntry) mapStateEntry { // This logic needs to be the same as in authPreferredInsert() where the newEntry's // auth type may be overridden by a covering key. // This also needs to reflect the logic in bpf/lib/policy.h __account_and_check(). @@ -391,7 +391,7 @@ func (ms *mapState) Lookup(key Key) (MapStateEntry, bool) { } // Deny by default if no matches are found - return types.DenyEntry(), false + return mapStateEntry{MapStateEntry: types.DenyEntry()}, false } func (ms *mapState) Len() int { diff --git a/vendor/github.com/cilium/cilium/pkg/policy/repository.go b/vendor/github.com/cilium/cilium/pkg/policy/repository.go index 5f867c91f4..eca9a31c25 100644 --- a/vendor/github.com/cilium/cilium/pkg/policy/repository.go +++ b/vendor/github.com/cilium/cilium/pkg/policy/repository.go @@ -119,7 +119,7 @@ type PolicyRepository interface { // This is used to skip policy calculation when a certain revision delta is // known to not affect the given identity. Pass a skipRevision of 0 to force // calculation. - GetSelectorPolicy(id *identity.Identity, skipRevision uint64, stats GetPolicyStatistics) (SelectorPolicy, uint64, error) + GetSelectorPolicy(id *identity.Identity, skipRevision uint64, stats GetPolicyStatistics) (SelectorPolicy, uint64) GetRevision() uint64 GetRulesList() *models.Policy @@ -133,7 +133,7 @@ type PolicyRepository interface { type GetPolicyStatistics interface { WaitingForPolicyRepository() *spanstat.SpanStat - PolicyCalculation() *spanstat.SpanStat + SelectorPolicyCalculation() *spanstat.SpanStat } // Repository is a list of policy rules which in combination form the security @@ -826,7 +826,7 @@ func wildcardRule(lbls labels.LabelArray, ingress bool) *rule { // This is used to skip policy calculation when a certain revision delta is // known to not affect the given identity. Pass a skipRevision of 0 to force // calculation. -func (r *Repository) GetSelectorPolicy(id *identity.Identity, skipRevision uint64, stats GetPolicyStatistics) (SelectorPolicy, uint64, error) { +func (r *Repository) GetSelectorPolicy(id *identity.Identity, skipRevision uint64, stats GetPolicyStatistics) (SelectorPolicy, uint64) { stats.WaitingForPolicyRepository().Start() r.RLock() defer r.RUnlock() @@ -837,21 +837,21 @@ func (r *Repository) GetSelectorPolicy(id *identity.Identity, skipRevision uint6 // Do we already have a given revision? // If so, skip calculation. if skipRevision >= rev { - return nil, rev, nil + return nil, rev } - stats.PolicyCalculation().Start() + stats.SelectorPolicyCalculation().Start() // This may call back in to the (locked) repository to generate the // selector policy sp, updated, err := r.policyCache.updateSelectorPolicy(id) - stats.PolicyCalculation().EndError(err) + stats.SelectorPolicyCalculation().EndError(err) // If we hit cache, reset the statistics. if !updated { - stats.PolicyCalculation().Reset() + stats.SelectorPolicyCalculation().Reset() } - return sp, rev, nil + return sp, rev } // ReplaceByResource replaces all rules by resource, returning the complete set of affected endpoints. diff --git a/vendor/github.com/cilium/cilium/pkg/policy/resolve.go b/vendor/github.com/cilium/cilium/pkg/policy/resolve.go index aff093cd53..f6ad13059c 100644 --- a/vendor/github.com/cilium/cilium/pkg/policy/resolve.go +++ b/vendor/github.com/cilium/cilium/pkg/policy/resolve.go @@ -103,6 +103,18 @@ func (p *EndpointPolicy) LookupRedirectPort(ingress bool, protocol string, port return 0, fmt.Errorf("Proxy port for redirect %q not found", proxyID) } +// Lookup finds the policy verdict applicable to the given 'key' using the same precedence logic +// between L3 and L4-only policies like the bpf datapath when both match the given 'key'. +// To be used in testing in place of the bpf datapath when full integration testing is not desired. +// Returns the closest matching covering policy entry, the labels of the rules that contributed to +// that verdict, and 'true' if found. +// Returns a deny entry when a match is not found, mirroring the datapath default deny behavior. +// 'key' must not have a wildcard identity or port. +func (p *EndpointPolicy) Lookup(key Key) (MapStateEntry, labels.LabelArrayList, bool) { + entry, found := p.policyMapState.lookup(key) + return entry.MapStateEntry, entry.derivedFromRules, found +} + // PolicyOwner is anything which consumes a EndpointPolicy. type PolicyOwner interface { GetID() uint64 diff --git a/vendor/github.com/cilium/ebpf/Makefile b/vendor/github.com/cilium/ebpf/Makefile index 13fff832dd..e0fe974920 100644 --- a/vendor/github.com/cilium/ebpf/Makefile +++ b/vendor/github.com/cilium/ebpf/Makefile @@ -39,7 +39,6 @@ TARGETS := \ testdata/subprog_reloc \ testdata/fwd_decl \ testdata/kconfig \ - testdata/kconfig_config \ testdata/ksym \ testdata/kfunc \ testdata/invalid-kfunc \ diff --git a/vendor/github.com/cilium/ebpf/README.md b/vendor/github.com/cilium/ebpf/README.md index 85871db1ae..8238256c8e 100644 --- a/vendor/github.com/cilium/ebpf/README.md +++ b/vendor/github.com/cilium/ebpf/README.md @@ -53,6 +53,7 @@ This library includes the following packages: * [rlimit](https://pkg.go.dev/github.com/cilium/ebpf/rlimit) provides a convenient API to lift the `RLIMIT_MEMLOCK` constraint on kernels before 5.11. * [btf](https://pkg.go.dev/github.com/cilium/ebpf/btf) allows reading the BPF Type Format. +* [pin](https://pkg.go.dev/github.com/cilium/ebpf/pin) provides APIs for working with pinned objects on bpffs. ## Requirements diff --git a/vendor/github.com/cilium/ebpf/btf/format.go b/vendor/github.com/cilium/ebpf/btf/format.go index 5e581b4a85..3e0dedaa2b 100644 --- a/vendor/github.com/cilium/ebpf/btf/format.go +++ b/vendor/github.com/cilium/ebpf/btf/format.go @@ -161,6 +161,9 @@ func (gf *GoFormatter) writeTypeLit(typ Type, depth int) error { case *Datasec: err = gf.writeDatasecLit(v, depth) + case *Var: + err = gf.writeTypeLit(v.Type, depth) + default: return fmt.Errorf("type %T: %w", v, ErrNotSupported) } diff --git a/vendor/github.com/cilium/ebpf/btf/types.go b/vendor/github.com/cilium/ebpf/btf/types.go index 44d393067f..dbcdf9dd7a 100644 --- a/vendor/github.com/cilium/ebpf/btf/types.go +++ b/vendor/github.com/cilium/ebpf/btf/types.go @@ -1291,6 +1291,20 @@ func UnderlyingType(typ Type) Type { return &cycle{typ} } +// QualifiedType returns the type with all qualifiers removed. +func QualifiedType(typ Type) Type { + result := typ + for depth := 0; depth <= maxResolveDepth; depth++ { + switch v := (result).(type) { + case qualifier: + result = v.qualify() + default: + return result + } + } + return &cycle{typ} +} + // As returns typ if is of type T. Otherwise it peels qualifiers and Typedefs // until it finds a T. // diff --git a/vendor/github.com/cilium/ebpf/collection.go b/vendor/github.com/cilium/ebpf/collection.go index 459ea90d8f..1bda110a40 100644 --- a/vendor/github.com/cilium/ebpf/collection.go +++ b/vendor/github.com/cilium/ebpf/collection.go @@ -701,6 +701,7 @@ func resolveKconfig(m *MapSpec) error { type configInfo struct { offset uint32 + size uint32 typ btf.Type } @@ -742,6 +743,7 @@ func resolveKconfig(m *MapSpec) error { default: // Catch CONFIG_*. configs[n] = configInfo{ offset: vsi.Offset, + size: vsi.Size, typ: v.Type, } } @@ -768,10 +770,10 @@ func resolveKconfig(m *MapSpec) error { for n, info := range configs { value, ok := kernelConfig[n] if !ok { - return fmt.Errorf("config option %q does not exists for this kernel", n) + return fmt.Errorf("config option %q does not exist on this kernel", n) } - err := kconfig.PutValue(data[info.offset:], info.typ, value) + err := kconfig.PutValue(data[info.offset:info.offset+info.size], info.typ, value) if err != nil { return fmt.Errorf("problem adding value for %s: %w", n, err) } diff --git a/vendor/github.com/cilium/ebpf/elf_reader.go b/vendor/github.com/cilium/ebpf/elf_reader.go index 4765638079..9e8dbc7ae5 100644 --- a/vendor/github.com/cilium/ebpf/elf_reader.go +++ b/vendor/github.com/cilium/ebpf/elf_reader.go @@ -1013,6 +1013,13 @@ func mapSpecFromBTF(es *elfSection, vs *btf.VarSecinfo, def *btf.Struct, spec *b } } + // Some maps don't support value sizes, but annotating their map definitions + // with __type macros can still be useful, especially to let bpf2go generate + // type definitions for them. + if value != nil && !mapType.canHaveValueSize() { + valueSize = 0 + } + return &MapSpec{ Name: SanitizeName(name, -1), Type: MapType(mapType), diff --git a/vendor/github.com/cilium/ebpf/features/misc.go b/vendor/github.com/cilium/ebpf/features/misc.go index 0c4e1a2619..c039020a95 100644 --- a/vendor/github.com/cilium/ebpf/features/misc.go +++ b/vendor/github.com/cilium/ebpf/features/misc.go @@ -1,9 +1,12 @@ package features import ( + "errors" + "github.com/cilium/ebpf" "github.com/cilium/ebpf/asm" "github.com/cilium/ebpf/internal" + "github.com/cilium/ebpf/internal/sys" ) // HaveLargeInstructions probes the running kernel if more than 4096 instructions @@ -62,7 +65,7 @@ func HaveV2ISA() error { } var haveV2ISA = internal.NewFeatureTest("v2 ISA", func() error { - return probeProgram(&ebpf.ProgramSpec{ + err := probeProgram(&ebpf.ProgramSpec{ Type: ebpf.SocketFilter, Instructions: asm.Instructions{ asm.Mov.Imm(asm.R0, 0), @@ -71,6 +74,11 @@ var haveV2ISA = internal.NewFeatureTest("v2 ISA", func() error { asm.Return().WithSymbol("exit"), }, }) + // This sometimes bubbles up from the JIT on aarch64. + if errors.Is(err, sys.ENOTSUPP) { + return ebpf.ErrNotSupported + } + return err }, "4.14") // HaveV3ISA probes the running kernel if instructions of the v3 ISA are supported. @@ -83,7 +91,7 @@ func HaveV3ISA() error { } var haveV3ISA = internal.NewFeatureTest("v3 ISA", func() error { - return probeProgram(&ebpf.ProgramSpec{ + err := probeProgram(&ebpf.ProgramSpec{ Type: ebpf.SocketFilter, Instructions: asm.Instructions{ asm.Mov.Imm(asm.R0, 0), @@ -92,4 +100,36 @@ var haveV3ISA = internal.NewFeatureTest("v3 ISA", func() error { asm.Return().WithSymbol("exit"), }, }) + // This sometimes bubbles up from the JIT on aarch64. + if errors.Is(err, sys.ENOTSUPP) { + return ebpf.ErrNotSupported + } + return err }, "5.1") + +// HaveV4ISA probes the running kernel if instructions of the v4 ISA are supported. +// +// Upstream commit 1f9a1ea821ff ("bpf: Support new sign-extension load insns"). +// +// See the package documentation for the meaning of the error return value. +func HaveV4ISA() error { + return haveV4ISA() +} + +var haveV4ISA = internal.NewFeatureTest("v4 ISA", func() error { + err := probeProgram(&ebpf.ProgramSpec{ + Type: ebpf.SocketFilter, + Instructions: asm.Instructions{ + asm.Mov.Imm(asm.R0, 0), + asm.JEq.Imm(asm.R0, 1, "error"), + asm.LongJump("exit"), + asm.Mov.Imm(asm.R0, 1).WithSymbol("error"), + asm.Return().WithSymbol("exit"), + }, + }) + // This sometimes bubbles up from the JIT on aarch64. + if errors.Is(err, sys.ENOTSUPP) { + return ebpf.ErrNotSupported + } + return err +}, "6.6") diff --git a/vendor/github.com/cilium/ebpf/internal/kconfig/kconfig.go b/vendor/github.com/cilium/ebpf/internal/kconfig/kconfig.go index c32c066eb0..29c62b6266 100644 --- a/vendor/github.com/cilium/ebpf/internal/kconfig/kconfig.go +++ b/vendor/github.com/cilium/ebpf/internal/kconfig/kconfig.go @@ -103,12 +103,13 @@ func PutValue(data []byte, typ btf.Type, value string) error { switch value { case "y", "n", "m": return putValueTri(data, typ, value) - default: - if strings.HasPrefix(value, `"`) { - return putValueString(data, typ, value) - } - return putValueNumber(data, typ, value) } + + if strings.HasPrefix(value, `"`) { + return putValueString(data, typ, value) + } + + return putValueNumber(data, typ, value) } // Golang translation of libbpf_tristate enum: @@ -145,6 +146,10 @@ func putValueTri(data []byte, typ btf.Type, value string) error { return fmt.Errorf("cannot use enum %q, only libbpf_tristate is supported", v.Name) } + if len(data) != 4 { + return fmt.Errorf("expected enum value to occupy 4 bytes in datasec, got: %d", len(data)) + } + var tri triState switch value { case "y": @@ -154,10 +159,10 @@ func putValueTri(data []byte, typ btf.Type, value string) error { case "n": tri = TriNo default: - return fmt.Errorf("value %q is not support for libbpf_tristate", value) + return fmt.Errorf("value %q is not supported for libbpf_tristate", value) } - internal.NativeEndian.PutUint64(data, uint64(tri)) + internal.NativeEndian.PutUint32(data, uint32(tri)) default: return fmt.Errorf("cannot add number value, expected btf.Int or btf.Enum, got: %T", v) } diff --git a/vendor/github.com/cilium/ebpf/internal/math.go b/vendor/github.com/cilium/ebpf/internal/math.go index 93a1670728..10cde66860 100644 --- a/vendor/github.com/cilium/ebpf/internal/math.go +++ b/vendor/github.com/cilium/ebpf/internal/math.go @@ -10,6 +10,17 @@ func IsPow[I Integer](n I) bool { return n != 0 && (n&(n-1)) == 0 } +// Between returns the value clamped between a and b. +func Between[I Integer](val, a, b I) I { + lower, upper := a, b + if lower > upper { + upper, lower = a, b + } + + val = min(val, upper) + return max(val, lower) +} + // Integer represents all possible integer types. // Remove when x/exp/constraints is moved to the standard library. type Integer interface { diff --git a/vendor/github.com/cilium/ebpf/internal/sys/fd.go b/vendor/github.com/cilium/ebpf/internal/sys/fd.go index 028be00455..e2ba43fd3b 100644 --- a/vendor/github.com/cilium/ebpf/internal/sys/fd.go +++ b/vendor/github.com/cilium/ebpf/internal/sys/fd.go @@ -4,8 +4,10 @@ import ( "fmt" "math" "os" + "path/filepath" "runtime" "strconv" + "strings" "github.com/cilium/ebpf/internal/testutils/fdtrace" "github.com/cilium/ebpf/internal/unix" @@ -79,10 +81,13 @@ func (fd *FD) Close() error { return nil } - return unix.Close(fd.disown()) + return unix.Close(fd.Disown()) } -func (fd *FD) disown() int { +// Disown destroys the FD and returns its raw file descriptor without closing +// it. After this call, the underlying fd is no longer tied to the FD's +// lifecycle. +func (fd *FD) Disown() int { value := fd.raw fdtrace.ForgetFD(value) fd.raw = -1 @@ -116,5 +121,45 @@ func (fd *FD) File(name string) *os.File { return nil } - return os.NewFile(uintptr(fd.disown()), name) + return os.NewFile(uintptr(fd.Disown()), name) +} + +// ObjGetTyped wraps [ObjGet] with a readlink call to extract the type of the +// underlying bpf object. +func ObjGetTyped(attr *ObjGetAttr) (*FD, ObjType, error) { + fd, err := ObjGet(attr) + if err != nil { + return nil, 0, err + } + + typ, err := readType(fd) + if err != nil { + _ = fd.Close() + return nil, 0, fmt.Errorf("reading fd type: %w", err) + } + + return fd, typ, nil +} + +// readType returns the bpf object type of the file descriptor by calling +// readlink(3). Returns an error if the file descriptor does not represent a bpf +// object. +func readType(fd *FD) (ObjType, error) { + s, err := os.Readlink(filepath.Join("/proc/self/fd/", fd.String())) + if err != nil { + return 0, fmt.Errorf("readlink fd %d: %w", fd.Int(), err) + } + + s = strings.TrimPrefix(s, "anon_inode:") + + switch s { + case "bpf-map": + return BPF_TYPE_MAP, nil + case "bpf-prog": + return BPF_TYPE_PROG, nil + case "bpf-link": + return BPF_TYPE_LINK, nil + } + + return 0, fmt.Errorf("unknown type %s of fd %d", s, fd.Int()) } diff --git a/vendor/github.com/cilium/ebpf/internal/sys/types.go b/vendor/github.com/cilium/ebpf/internal/sys/types.go index f8792da052..88001c319e 100644 --- a/vendor/github.com/cilium/ebpf/internal/sys/types.go +++ b/vendor/github.com/cilium/ebpf/internal/sys/types.go @@ -566,6 +566,15 @@ const ( BPF_MAP_TYPE_CGRP_STORAGE MapType = 32 ) +type ObjType uint32 + +const ( + BPF_TYPE_UNSPEC ObjType = 0 + BPF_TYPE_PROG ObjType = 1 + BPF_TYPE_MAP ObjType = 2 + BPF_TYPE_LINK ObjType = 3 +) + type PerfEventType uint32 const ( diff --git a/vendor/github.com/cilium/ebpf/link/link.go b/vendor/github.com/cilium/ebpf/link/link.go index eef834a812..796769f8ea 100644 --- a/vendor/github.com/cilium/ebpf/link/link.go +++ b/vendor/github.com/cilium/ebpf/link/link.go @@ -78,7 +78,9 @@ func NewFromID(id ID) (Link, error) { return wrapRawLink(&RawLink{fd, ""}) } -// LoadPinnedLink loads a link that was persisted into a bpffs. +// LoadPinnedLink loads a Link from a pin (file) on the BPF virtual filesystem. +// +// Requires at least Linux 5.7. func LoadPinnedLink(fileName string, opts *ebpf.LoadPinOptions) (Link, error) { raw, err := loadPinnedRawLink(fileName, opts) if err != nil { @@ -350,7 +352,7 @@ func AttachRawLink(opts RawLinkOptions) (*RawLink, error) { } func loadPinnedRawLink(fileName string, opts *ebpf.LoadPinOptions) (*RawLink, error) { - fd, err := sys.ObjGet(&sys.ObjGetAttr{ + fd, typ, err := sys.ObjGetTyped(&sys.ObjGetAttr{ Pathname: sys.NewStringPointer(fileName), FileFlags: opts.Marshal(), }) @@ -358,6 +360,11 @@ func loadPinnedRawLink(fileName string, opts *ebpf.LoadPinOptions) (*RawLink, er return nil, fmt.Errorf("load pinned link: %w", err) } + if typ != sys.BPF_TYPE_LINK { + _ = fd.Close() + return nil, fmt.Errorf("%s is not a Link", fileName) + } + return &RawLink{fd, fileName}, nil } diff --git a/vendor/github.com/cilium/ebpf/map.go b/vendor/github.com/cilium/ebpf/map.go index c5010b4190..e5d8bd7809 100644 --- a/vendor/github.com/cilium/ebpf/map.go +++ b/vendor/github.com/cilium/ebpf/map.go @@ -158,6 +158,17 @@ func (spec *MapSpec) fixupMagicFields() (*MapSpec, error) { // behaviour in the past. spec.MaxEntries = n } + + case CPUMap: + n, err := PossibleCPU() + if err != nil { + return nil, fmt.Errorf("fixup cpu map: %w", err) + } + + if n := uint32(n); spec.MaxEntries == 0 || spec.MaxEntries > n { + // Perform clamping similar to PerfEventArray. + spec.MaxEntries = n + } } return spec, nil @@ -1560,9 +1571,11 @@ func (m *Map) unmarshalValue(value any, buf sysenc.Buffer) error { return buf.Unmarshal(value) } -// LoadPinnedMap loads a Map from a BPF file. +// LoadPinnedMap opens a Map from a pin (file) on the BPF virtual filesystem. +// +// Requires at least Linux 4.5. func LoadPinnedMap(fileName string, opts *LoadPinOptions) (*Map, error) { - fd, err := sys.ObjGet(&sys.ObjGetAttr{ + fd, typ, err := sys.ObjGetTyped(&sys.ObjGetAttr{ Pathname: sys.NewStringPointer(fileName), FileFlags: opts.Marshal(), }) @@ -1570,6 +1583,11 @@ func LoadPinnedMap(fileName string, opts *LoadPinOptions) (*Map, error) { return nil, err } + if typ != sys.BPF_TYPE_MAP { + _ = fd.Close() + return nil, fmt.Errorf("%s is not a Map", fileName) + } + m, err := newMapFromFD(fd) if err == nil { m.pinnedPath = fileName diff --git a/vendor/github.com/cilium/ebpf/prog.go b/vendor/github.com/cilium/ebpf/prog.go index bde48a56be..4f3ce43bfa 100644 --- a/vendor/github.com/cilium/ebpf/prog.go +++ b/vendor/github.com/cilium/ebpf/prog.go @@ -51,6 +51,11 @@ const ( // verifier log. const minVerifierLogSize = 64 * 1024 +// maxVerifierLogSize is the maximum size of verifier log buffer the kernel +// will accept before returning EINVAL. May be increased to MaxUint32 in the +// future, but avoid the unnecessary EINVAL for now. +const maxVerifierLogSize = math.MaxUint32 >> 2 + // ProgramOptions control loading a program into the kernel. type ProgramOptions struct { // Bitmap controlling the detail emitted by the kernel's eBPF verifier log. @@ -70,6 +75,11 @@ type ProgramOptions struct { // attempt at loading the program. LogLevel LogLevel + // Starting size of the verifier log buffer. If the verifier log is larger + // than this size, the buffer will be grown to fit the entire log. Leave at + // its default value unless troubleshooting. + LogSizeStart uint32 + // Disables the verifier log completely, regardless of other options. LogDisabled bool @@ -401,9 +411,10 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions) (*Program, er // The caller requested a specific verifier log level. Set up the log buffer // so that there is a chance of loading the program in a single shot. + logSize := internal.Between(opts.LogSizeStart, minVerifierLogSize, maxVerifierLogSize) var logBuf []byte if !opts.LogDisabled && opts.LogLevel != 0 { - logBuf = make([]byte, minVerifierLogSize) + logBuf = make([]byte, logSize) attr.LogLevel = opts.LogLevel attr.LogSize = uint32(len(logBuf)) attr.LogBuf = sys.NewSlicePointer(logBuf) @@ -437,12 +448,11 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions) (*Program, er attr.LogLevel = LogLevelBranch } - // Make an educated guess how large the buffer should be. Start - // at minVerifierLogSize and then double the size. - logSize := uint32(max(len(logBuf)*2, minVerifierLogSize)) - if int(logSize) < len(logBuf) { - return nil, errors.New("overflow while probing log buffer size") - } + // Make an educated guess how large the buffer should be by multiplying. + // Ensure the size doesn't overflow. + const factor = 2 + logSize = internal.Between(logSize, minVerifierLogSize, maxVerifierLogSize/factor) + logSize *= factor if attr.LogTrueSize != 0 { // The kernel has given us a hint how large the log buffer has to be. @@ -468,6 +478,12 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions) (*Program, er return nil, fmt.Errorf("load program: %w (MEMLOCK may be too low, consider rlimit.RemoveMemlock)", err) } + case errors.Is(err, unix.EFAULT): + // EFAULT is returned when the kernel hits a verifier bug, and always + // overrides ENOSPC, defeating the buffer growth strategy. Warn the user + // that they may need to increase the buffer size manually. + return nil, fmt.Errorf("load program: %w (hit verifier bug, increase LogSizeStart to fit the log and check dmesg)", err) + case errors.Is(err, unix.EINVAL): if bytes.Contains(tail, coreBadCall) { err = errBadRelocation @@ -906,11 +922,12 @@ func marshalProgram(p *Program, length int) ([]byte, error) { return buf, nil } -// LoadPinnedProgram loads a Program from a BPF file. +// LoadPinnedProgram loads a Program from a pin (file) on the BPF virtual +// filesystem. // // Requires at least Linux 4.11. func LoadPinnedProgram(fileName string, opts *LoadPinOptions) (*Program, error) { - fd, err := sys.ObjGet(&sys.ObjGetAttr{ + fd, typ, err := sys.ObjGetTyped(&sys.ObjGetAttr{ Pathname: sys.NewStringPointer(fileName), FileFlags: opts.Marshal(), }) @@ -918,6 +935,11 @@ func LoadPinnedProgram(fileName string, opts *LoadPinOptions) (*Program, error) return nil, err } + if typ != sys.BPF_TYPE_PROG { + _ = fd.Close() + return nil, fmt.Errorf("%s is not a Program", fileName) + } + info, err := newProgramInfoFromFd(fd) if err != nil { _ = fd.Close() diff --git a/vendor/github.com/cilium/ebpf/types.go b/vendor/github.com/cilium/ebpf/types.go index 02493f74cf..211b308bbc 100644 --- a/vendor/github.com/cilium/ebpf/types.go +++ b/vendor/github.com/cilium/ebpf/types.go @@ -127,6 +127,21 @@ func (mt MapType) canStoreProgram() bool { return mt == ProgramArray } +// canHaveValueSize returns true if the map type supports setting a value size. +func (mt MapType) canHaveValueSize() bool { + switch mt { + case RingBuf, Arena: + return false + + // Special-case perf events since they require a value size of either 0 or 4 + // for historical reasons. Let the library fix this up later. + case PerfEventArray: + return false + } + + return true +} + // ProgramType of the eBPF program type ProgramType uint32 diff --git a/vendor/github.com/cilium/hive/script/cmds.go b/vendor/github.com/cilium/hive/script/cmds.go index a72abb26ed..4182d1b8a5 100644 --- a/vendor/github.com/cilium/hive/script/cmds.go +++ b/vendor/github.com/cilium/hive/script/cmds.go @@ -19,6 +19,7 @@ import ( "time" "github.com/cilium/hive/script/internal/diff" + "github.com/spf13/pflag" "golang.org/x/term" ) @@ -44,6 +45,7 @@ func DefaultCmds() map[string]Cmd { "mv": Mv(), "rm": Rm(), "replace": Replace(), + "sed": Sed(), "sleep": Sleep(), "stderr": Stderr(), "stdout": Stdout(), @@ -175,14 +177,19 @@ func Chmod() Cmd { }) } +func compareFlags(fs *pflag.FlagSet) { + fs.BoolP("quiet", "q", false, "Suppress printing of diff") +} + // Cmp compares the contents of two files, or the contents of either the // "stdout" or "stderr" buffer and a file, returning a non-nil error if the // contents differ. func Cmp() Cmd { return Command( CmdUsage{ - Args: "[-q] file1 file2", + Args: "file1 file2", Summary: "compare files for differences", + Flags: compareFlags, Detail: []string{ "By convention, file1 is the actual data and file2 is the expected data.", "The command succeeds if the file contents are identical.", @@ -199,7 +206,8 @@ func Cmp() Cmd { func Cmpenv() Cmd { return Command( CmdUsage{ - Args: "[-q] file1 file2", + Args: "file1 file2", + Flags: compareFlags, Summary: "compare files for differences, with environment expansion", Detail: []string{ "By convention, file1 is the actual data and file2 is the expected data.", @@ -213,10 +221,9 @@ func Cmpenv() Cmd { } func doCompare(s *State, env bool, args ...string) error { - quiet := false - if len(args) > 0 && args[0] == "-q" { - quiet = true - args = args[1:] + quiet, err := s.Flags.GetBool("quiet") + if err != nil { + return err } if len(args) != 2 { return ErrUsage @@ -576,23 +583,22 @@ func Exists() Cmd { return Command( CmdUsage{ Summary: "check that files exist", - Args: "[-readonly] [-exec] file...", + Args: "file...", + Flags: func(fs *pflag.FlagSet) { + fs.Bool("readonly", false, "File must not be writable") + fs.Bool("exec", false, "File must not be executable") + }, }, func(s *State, args ...string) (WaitFunc, error) { - var readonly, exec bool - loop: - for len(args) > 0 { - switch args[0] { - case "-readonly": - readonly = true - args = args[1:] - case "-exec": - exec = true - args = args[1:] - default: - break loop - } + readonly, err := s.Flags.GetBool("readonly") + if err != nil { + return nil, err } + exec, err := s.Flags.GetBool("exec") + if err != nil { + return nil, err + } + if len(args) == 0 { return nil, ErrUsage } @@ -624,7 +630,8 @@ func Grep() Cmd { return Command( CmdUsage{ Summary: "find lines in a file that match a pattern", - Args: matchUsage + " file", + Args: "'pattern' file", + Flags: matchFlags, Detail: []string{ "The command succeeds if at least one match (or the exact count, if given) is found.", "The -q flag suppresses printing of matches.", @@ -636,26 +643,20 @@ func Grep() Cmd { }) } -const matchUsage = "[-count=N] [-q] 'pattern'" +func matchFlags(fs *pflag.FlagSet) { + fs.Int("count", 0, "Exact count of matches") + fs.BoolP("quiet", "q", false, "Suppress printing of matches") +} // match implements the Grep, Stdout, and Stderr commands. func match(s *State, args []string, text, name string) error { - n := 0 - if len(args) >= 1 && strings.HasPrefix(args[0], "-count=") { - var err error - n, err = strconv.Atoi(args[0][len("-count="):]) - if err != nil { - return fmt.Errorf("bad -count=: %v", err) - } - if n < 1 { - return fmt.Errorf("bad -count=: must be at least 1") - } - args = args[1:] + n, err := s.Flags.GetInt("count") + if err != nil { + return err } - quiet := false - if len(args) >= 1 && args[0] == "-q" { - quiet = true - args = args[1:] + quiet, err := s.Flags.GetBool("quiet") + if err != nil { + return err } isGrep := name == "grep" @@ -882,6 +883,45 @@ func Replace() Cmd { }) } +// Sed implements a simple regexp replacement of text in a file. +func Sed() Cmd { + return Command( + CmdUsage{ + Summary: "substitute strings in a file with a regexp", + Args: "regexp replacement file", + Detail: []string{ + "A simple sed-like command for replacing text matching regular expressions", + "in a file.", + "", + "Implemented using regexp.ReplaceAll, see its docs for what is supported:", + "https://pkg.go.dev/regexp#Regexp.ReplaceAll", + }, + RegexpArgs: firstNonFlag, + }, + func(s *State, args ...string) (WaitFunc, error) { + if len(args) != 3 { + return nil, ErrUsage + } + + re, err := regexp.Compile(args[0]) + if err != nil { + return nil, err + } + replacement := args[1] + file := s.Path(args[2]) + + data, err := os.ReadFile(file) + if err != nil { + return nil, err + } + lines := strings.Split(string(data), "\n") + for i, line := range lines { + lines[i] = re.ReplaceAllString(line, replacement) + } + return nil, os.WriteFile(file, []byte(strings.Join(lines, "\n")), 0666) + }) +} + // Rm removes a file or directory. // // If a directory, Rm also recursively removes that directory's @@ -968,7 +1008,8 @@ func Stderr() Cmd { return Command( CmdUsage{ Summary: "find lines in the stderr buffer that match a pattern", - Args: matchUsage + " file", + Args: "'pattern'", + Flags: matchFlags, Detail: []string{ "The command succeeds if at least one match (or the exact count, if given) is found.", "The -q flag suppresses printing of matches.", @@ -985,7 +1026,8 @@ func Stdout() Cmd { return Command( CmdUsage{ Summary: "find lines in the stdout buffer that match a pattern", - Args: matchUsage + " file", + Args: "'pattern'", + Flags: matchFlags, Detail: []string{ "The command succeeds if at least one match (or the exact count, if given) is found.", "The -q flag suppresses printing of matches.", diff --git a/vendor/github.com/cilium/hive/script/engine.go b/vendor/github.com/cilium/hive/script/engine.go index 15f5ba387a..84208aab19 100644 --- a/vendor/github.com/cilium/hive/script/engine.go +++ b/vendor/github.com/cilium/hive/script/engine.go @@ -62,6 +62,8 @@ import ( "sort" "strings" "time" + + "github.com/spf13/pflag" ) // An Engine stores the configuration for executing a set of scripts. @@ -116,9 +118,17 @@ type WaitFunc func(*State) (stdout, stderr string, err error) // A CmdUsage describes the usage of a Cmd, independent of its name // (which can change based on its registration). type CmdUsage struct { - Summary string // in the style of the Name section of a Unix 'man' page, omitting the name - Args string // a brief synopsis of the command's arguments (only) - Detail []string // zero or more sentences in the style of the Description section of a Unix 'man' page + Summary string // in the style of the Name section of a Unix 'man' page, omitting the name + + // synopsis of arguments, e.g. "files...". If [Flags] is provided then these will be prepended + // to [Args] in usage output. + Args string + + // flags for the command, optional. If provided, then args passed to the command will not include any + // of the flag arguments. The [plafg.FlagSet] is available to the command via [State.Flags]. + Flags func(fs *pflag.FlagSet) + + Detail []string // zero or more sentences in the style of the Description section of a Unix 'man' page // If Async is true, the Cmd is meaningful to run in the background, and its // Run method must return either a non-nil WaitFunc or a non-nil error. @@ -317,12 +327,16 @@ func (e *Engine) Execute(s *State, file string, script *bufio.Reader, log io.Wri if err != nil { if cmd.want == successRetryOnFailure || cmd.want == failureRetryOnSuccess { // Command wants retries. Retry the whole section + numRetries := 0 for err != nil { + s.FlushLog() select { case <-s.Context().Done(): return lineErr(s.Context().Err()) case <-time.After(retryInterval): } + s.Logf("(command %q failed, retrying...)\n", line) + numRetries++ for _, cmd := range sectionCmds { impl := e.Cmds[cmd.name] if err = e.runCommand(s, cmd, impl); err != nil { @@ -330,6 +344,7 @@ func (e *Engine) Execute(s *State, file string, script *bufio.Reader, log io.Wri } } } + s.Logf("(command %q succeeded after %d retries)\n", line, numRetries) } else { if stop := (stopError{}); errors.As(err, &stop) { // Since the 'stop' command halts execution of the entire script, @@ -665,11 +680,42 @@ func (e *Engine) runCommand(s *State, cmd *command, impl Cmd) error { return cmdError(cmd, errors.New("unknown command")) } - async := impl.Usage().Async + usage := impl.Usage() + + async := usage.Async if cmd.background && !async { return cmdError(cmd, errors.New("command cannot be run in background")) } + // Register and parse the flags. We do this regardless of whether [usage.Flags] + // is set in order to handle -h/--help. + fs := pflag.NewFlagSet(cmd.name, pflag.ContinueOnError) + fs.Usage = func() {} // Don't automatically handle error + fs.SetOutput(s.logOut) + if usage.Flags != nil { + usage.Flags(fs) + } + if err := fs.Parse(cmd.args); err != nil { + if errors.Is(err, pflag.ErrHelp) { + out := new(strings.Builder) + err = e.ListCmds(out, true, "^"+cmd.name+"$") + s.stdout = out.String() + if s.stdout != "" { + s.Logf("[stdout]\n%s", s.stdout) + } + return err + } + if usage.Flags != nil { + return cmdError(cmd, err) + } + + // [usage.Flags] wasn't given, so ignore the parsing errors as the + // command might do its own argument parsing. + } else { + cmd.args = fs.Args() + s.Flags = fs + } + wait, runErr := impl.Run(s, cmd.args...) if wait == nil { if async && runErr == nil { @@ -788,22 +834,64 @@ func (e *Engine) ListCmds(w io.Writer, verbose bool, regexMatch string) error { suffix = " [&]" } - _, err := fmt.Fprintf(w, "%s %s%s\n\t%s\n", name, usage.Args, suffix, usage.Summary) + flagArgs := "" + flagUsages := "" + if usage.Flags != nil { + fs := pflag.NewFlagSet(name, pflag.ContinueOnError) + fs.SetOutput(w) + usage.Flags(fs) + flagUsages = fs.FlagUsages() + shortArgs := []string{} + longArgs := []string{} + fs.VisitAll(func(flag *pflag.Flag) { + if flag.Shorthand != "" { + shortArgs = append(shortArgs, flag.Shorthand) + } + switch flag.Value.Type() { + case "bool": + longArgs = append(longArgs, fmt.Sprintf("[--%s]", flag.Name)) + default: + longArgs = append(longArgs, fmt.Sprintf("[--%s=%s]", flag.Name, flag.Value.Type())) + } + }) + if len(shortArgs) > 0 { + flagArgs = fmt.Sprintf("[-%s] ", strings.Join(shortArgs, "")) + } + flagArgs += strings.Join(longArgs, " ") + " " + } + + _, err := fmt.Fprintf(w, "%s %s%s\n\t%s\n", name, flagArgs+usage.Args, suffix, usage.Summary) if err != nil { return err } if verbose { - if _, err := io.WriteString(w, "\n"); err != nil { - return err - } - for _, line := range usage.Detail { - if err := wrapLine(w, line, 60, "\t"); err != nil { + if len(usage.Detail) > 0 { + if _, err := io.WriteString(w, "\n"); err != nil { return err } + + for _, line := range usage.Detail { + if err := wrapLine(w, line, 60, "\t"); err != nil { + return err + } + } } - if _, err := io.WriteString(w, "\n"); err != nil { - return err + if flagUsages != "" { + if _, err := io.WriteString(w, "\n"); err != nil { + return err + } + lines := strings.Split(flagUsages, "\n") + if len(lines) > 0 { + if _, err := fmt.Fprintf(w, "\tFlags:\n"); err != nil { + return err + } + for _, line := range lines { + if _, err := fmt.Fprintf(w, "\t%s\n", line); err != nil { + return err + } + } + } } } } diff --git a/vendor/github.com/cilium/hive/script/state.go b/vendor/github.com/cilium/hive/script/state.go index 9a3580becf..29c3287f95 100644 --- a/vendor/github.com/cilium/hive/script/state.go +++ b/vendor/github.com/cilium/hive/script/state.go @@ -16,6 +16,7 @@ import ( "regexp" "strings" + "github.com/spf13/pflag" "golang.org/x/tools/txtar" ) @@ -36,6 +37,7 @@ type State struct { stdout string // standard output from last 'go' command; for 'stdout' command stderr string // standard error from last 'go' command; for 'stderr' command + Flags *pflag.FlagSet DoUpdate bool FileUpdates map[string]string diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/cluster/v3/cluster.pb.go b/vendor/github.com/cilium/proxy/go/envoy/config/cluster/v3/cluster.pb.go index f80f2dd094..75e5dde7a4 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/config/cluster/v3/cluster.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/config/cluster/v3/cluster.pb.go @@ -677,7 +677,7 @@ func (x *ClusterCollection) GetEntries() *v3.CollectionEntry { } // Configuration for a single upstream cluster. -// [#next-free-field: 58] +// [#next-free-field: 59] type Cluster struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -864,6 +864,16 @@ type Cluster struct { // and :ref:`LOGICAL_DNS` // this setting is ignored. DnsRefreshRate *durationpb.Duration `protobuf:"bytes,16,opt,name=dns_refresh_rate,json=dnsRefreshRate,proto3" json:"dns_refresh_rate,omitempty"` + // DNS jitter can be optionally specified if the cluster type is either + // :ref:`STRICT_DNS`, + // or :ref:`LOGICAL_DNS`. + // DNS jitter causes the cluster to refresh DNS entries later by a random amount of time to avoid a + // stampede of DNS requests. This value sets the upper bound (exclusive) for the random amount. + // There will be no jitter if this value is omitted. For cluster types other than + // :ref:`STRICT_DNS` + // and :ref:`LOGICAL_DNS` + // this setting is ignored. + DnsJitter *durationpb.Duration `protobuf:"bytes,58,opt,name=dns_jitter,json=dnsJitter,proto3" json:"dns_jitter,omitempty"` // If the DNS failure refresh rate is specified and the cluster type is either // :ref:`STRICT_DNS`, // or :ref:`LOGICAL_DNS`, @@ -1033,12 +1043,13 @@ type Cluster struct { // maybe by allowing LRS to go on the ADS stream, or maybe by moving some of the negotiation // from the LRS stream here.] LrsServer *v32.ConfigSource `protobuf:"bytes,42,opt,name=lrs_server,json=lrsServer,proto3" json:"lrs_server,omitempty"` - // [#not-implemented-hide:] - // A list of metric names from ORCA load reports to propagate to LRS. + // A list of metric names from :ref:`ORCA load reports ` to propagate to LRS. + // + // If not specified, then ORCA load reports will not be propagated to LRS. // // For map fields in the ORCA proto, the string will be of the form “.“. // For example, the string “named_metrics.foo“ will mean to look for the key “foo“ in the ORCA - // “named_metrics“ field. + // :ref:`named_metrics ` field. // // The special map key “*“ means to report all entries in the map (e.g., “named_metrics.*“ means to // report all entries in the ORCA named_metrics field). Note that this should be used only with trusted @@ -1266,6 +1277,13 @@ func (x *Cluster) GetDnsRefreshRate() *durationpb.Duration { return nil } +func (x *Cluster) GetDnsJitter() *durationpb.Duration { + if x != nil { + return x.DnsJitter + } + return nil +} + func (x *Cluster) GetDnsFailureRefreshRate() *Cluster_RefreshRate { if x != nil { return x.DnsFailureRefreshRate @@ -3376,7 +3394,7 @@ var file_envoy_config_cluster_v3_cluster_proto_rawDesc = []byte{ 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x64, 0x73, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0xd6, 0x53, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x9a, 0x54, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x18, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x18, 0x2b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, @@ -3490,648 +3508,652 @@ var file_envoy_config_cluster_v3_cluster_proto_rawDesc = []byte{ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x2a, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x0e, 0x64, 0x6e, 0x73, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, - 0x12, 0x65, 0x0a, 0x18, 0x64, 0x6e, 0x73, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, - 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x2c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, - 0x52, 0x15, 0x64, 0x6e, 0x73, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x27, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x44, 0x6e, 0x73, 0x54, 0x74, 0x6c, 0x12, - 0x66, 0x0a, 0x11, 0x64, 0x6e, 0x73, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, 0x66, 0x61, - 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x44, 0x6e, 0x73, - 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x64, 0x6e, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x4f, 0x0a, 0x0d, 0x64, 0x6e, 0x73, 0x5f, 0x72, - 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x12, 0x42, 0x0a, 0x0a, 0x64, 0x6e, 0x73, 0x5f, 0x6a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x3a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x32, 0x00, 0x52, 0x09, 0x64, 0x6e, 0x73, 0x4a, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x12, 0x65, 0x0a, 0x18, 0x64, 0x6e, 0x73, 0x5f, 0x66, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x61, 0x74, 0x65, 0x52, 0x15, 0x64, 0x6e, 0x73, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x72, + 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x74, 0x74, 0x6c, 0x18, 0x27, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x44, 0x6e, 0x73, + 0x54, 0x74, 0x6c, 0x12, 0x66, 0x0a, 0x11, 0x64, 0x6e, 0x73, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x2e, 0x44, 0x6e, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x64, 0x6e, 0x73, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x4f, 0x0a, 0x0d, 0x64, + 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x73, 0x18, 0x12, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x0c, + 0x64, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x17, + 0x75, 0x73, 0x65, 0x5f, 0x74, 0x63, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x64, 0x6e, 0x73, 0x5f, + 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x0b, 0x18, + 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x13, 0x75, 0x73, 0x65, 0x54, + 0x63, 0x70, 0x46, 0x6f, 0x72, 0x44, 0x6e, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x12, + 0x6a, 0x0a, 0x15, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x0b, 0x18, - 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x0c, 0x64, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x5f, - 0x74, 0x63, 0x70, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x73, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x08, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, - 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x13, 0x75, 0x73, 0x65, 0x54, 0x63, 0x70, 0x46, 0x6f, - 0x72, 0x44, 0x6e, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x6a, 0x0a, 0x15, 0x64, - 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x33, 0x2e, 0x44, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, - 0x2e, 0x30, 0x52, 0x13, 0x64, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x65, 0x0a, 0x19, 0x74, 0x79, 0x70, 0x65, 0x64, - 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x16, 0x74, 0x79, 0x70, 0x65, 0x64, 0x44, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4c, - 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x77, 0x61, 0x72, 0x6d, 0x5f, - 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x77, 0x61, 0x69, 0x74, 0x46, - 0x6f, 0x72, 0x57, 0x61, 0x72, 0x6d, 0x4f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x12, 0x56, 0x0a, 0x11, - 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, - 0x33, 0x2e, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x10, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x5f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xaa, 0x01, - 0x02, 0x2a, 0x00, 0x52, 0x0f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x12, 0x52, 0x0a, 0x14, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x15, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x69, 0x6e, 0x64, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x12, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x69, - 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x10, 0x6c, 0x62, 0x5f, 0x73, - 0x75, 0x62, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x16, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x0e, 0x6c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x62, 0x0a, 0x13, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x31, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x4c, 0x62, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x10, 0x72, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x4c, - 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5b, 0x0a, 0x10, 0x6d, 0x61, 0x67, 0x6c, 0x65, - 0x76, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x34, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x48, 0x01, 0x52, 0x0e, 0x6d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x4c, 0x62, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x6b, 0x0a, 0x16, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, - 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x22, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, + 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x13, 0x64, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x65, 0x0a, 0x19, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x16, 0x74, 0x79, 0x70, 0x65, + 0x64, 0x44, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x4c, 0x0a, 0x15, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x77, + 0x61, 0x72, 0x6d, 0x5f, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x77, + 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x57, 0x61, 0x72, 0x6d, 0x4f, 0x6e, 0x49, 0x6e, 0x69, 0x74, + 0x12, 0x56, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x65, 0x72, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x10, 0x63, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0xaa, 0x01, 0x02, 0x2a, 0x00, 0x52, 0x0f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x52, 0x0a, 0x14, 0x75, 0x70, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x69, + 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x12, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x42, 0x69, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x10, + 0x6c, 0x62, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x6c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x62, 0x0a, 0x13, 0x72, 0x69, 0x6e, 0x67, 0x5f, + 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x17, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x44, - 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x13, 0x6f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x25, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x14, 0x6c, 0x65, 0x61, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x68, 0x0a, 0x15, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x72, 0x6f, 0x62, 0x69, 0x6e, - 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x4c, 0x62, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x12, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, - 0x62, 0x69, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x10, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x4c, + 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x10, 0x72, 0x69, 0x6e, 0x67, 0x48, + 0x61, 0x73, 0x68, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5b, 0x0a, 0x10, 0x6d, + 0x61, 0x67, 0x6c, 0x65, 0x76, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x50, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x75, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x18, 0x01, 0x92, - 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x72, 0x0a, 0x1b, 0x75, - 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x19, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x55, 0x0a, 0x28, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x23, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x4f, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x46, - 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x69, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4f, 0x6e, 0x48, 0x6f, 0x73, - 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x28, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x4c, 0x62, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x0e, 0x6d, 0x61, 0x67, 0x6c, 0x65, 0x76, + 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x6b, 0x0a, 0x16, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x44, 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, + 0x52, 0x13, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x73, 0x74, 0x4c, 0x62, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x6e, 0x0a, 0x17, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, + 0x14, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x62, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x68, 0x0a, 0x15, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x72, + 0x6f, 0x62, 0x69, 0x6e, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x38, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, + 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x12, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x59, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x2e, 0x76, 0x33, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x12, 0x60, 0x0a, 0x15, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x29, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x61, - 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x41, 0x0a, 0x0a, 0x6c, 0x72, 0x73, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x6c, - 0x72, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x1b, 0x6c, 0x72, 0x73, 0x5f, - 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x39, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x6c, - 0x72, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x3f, 0x0a, 0x15, 0x74, 0x72, 0x61, 0x63, 0x6b, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, - 0x18, 0x2f, 0x20, 0x01, 0x28, 0x08, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, - 0x33, 0x2e, 0x30, 0x52, 0x13, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x0f, 0x75, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x30, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x75, - 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5a, 0x0a, - 0x13, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x11, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x5e, 0x0a, 0x11, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x32, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x50, 0x0a, 0x10, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x75, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1a, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x10, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x58, 0x0a, 0x29, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x70, 0x65, 0x72, - 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x25, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x50, 0x65, 0x72, 0x44, - 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0xe6, 0x01, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x3a, 0x30, 0x9a, 0xc5, 0x88, 0x1e, - 0x2b, 0x0a, 0x29, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x1a, 0x98, 0x01, 0x0a, - 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x37, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0b, 0x74, 0x79, 0x70, - 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x2d, 0x9a, 0xc5, 0x88, 0x1e, 0x28, 0x0a, - 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x1a, 0xa6, 0x01, 0x0a, 0x10, 0x45, 0x64, 0x73, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0a, - 0x65, 0x64, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x65, 0x64, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x3a, 0x2c, 0x9a, 0xc5, 0x88, 0x1e, 0x27, 0x0a, 0x25, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x11, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x72, 0x0a, 0x1b, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x55, + 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x19, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x28, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, + 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x23, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x69, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, + 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x18, 0x20, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x19, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x4f, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x61, 0x6c, 0x12, 0x39, 0x0a, 0x07, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x28, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x60, 0x0a, 0x15, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, + 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x52, 0x13, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x41, 0x0a, 0x0a, 0x6c, 0x72, 0x73, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x09, 0x6c, 0x72, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x1b, + 0x6c, 0x72, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x39, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x18, 0x6c, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x3f, 0x0a, 0x15, 0x74, + 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x62, 0x75, 0x64, + 0x67, 0x65, 0x74, 0x73, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x08, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, + 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x13, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x0f, + 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, + 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x0e, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x5a, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x11, 0x74, 0x72, 0x61, 0x63, + 0x6b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x5e, 0x0a, + 0x11, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x10, 0x70, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x58, 0x0a, + 0x29, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x25, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, + 0x50, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xe6, 0x01, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2d, 0x0a, + 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x50, 0x0a, 0x10, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x3a, 0x30, + 0x9a, 0xc5, 0x88, 0x1e, 0x2b, 0x0a, 0x29, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x1a, 0x98, 0x01, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, + 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x2d, 0x9a, 0xc5, + 0x88, 0x1e, 0x28, 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x1a, 0xa6, 0x01, 0x0a, 0x10, 0x45, 0x64, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x1a, 0xa4, 0x0a, 0x0a, 0x0e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x0f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x46, 0x2e, 0x65, + 0x12, 0x41, 0x0a, 0x0a, 0x65, 0x64, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x65, 0x64, 0x73, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x2c, 0x9a, 0xc5, 0x88, 0x1e, 0x27, 0x0a, 0x25, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x45, 0x64, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa4, 0x0a, 0x0a, 0x0e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x0f, 0x66, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x46, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x0e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x3e, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x75, + 0x62, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x73, + 0x65, 0x74, 0x12, 0x6b, 0x0a, 0x10, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x62, - 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, - 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3e, - 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, - 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x6b, - 0x0a, 0x10, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0f, + 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x5f, 0x61, 0x77, 0x61, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x77, + 0x61, 0x72, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x13, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x61, 0x6e, 0x69, 0x63, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6e, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x79, 0x12, 0x1e, 0x0a, + 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x5f, 0x61, 0x6e, 0x79, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x41, 0x6e, 0x79, 0x12, 0x92, 0x01, + 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x4e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x1a, 0xda, 0x03, 0x0a, 0x10, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x73, + 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, + 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x69, 0x6e, + 0x67, 0x6c, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, + 0x12, 0x92, 0x01, 0x0a, 0x0f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5f, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, + 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x62, 0x53, 0x75, + 0x62, 0x73, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x62, 0x53, + 0x75, 0x62, 0x73, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x61, 0x6c, + 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, + 0x6b, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x12, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x4b, 0x65, 0x79, + 0x73, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x1e, 0x4c, 0x62, 0x53, 0x75, 0x62, + 0x73, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x54, + 0x5f, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, + 0x5f, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x41, + 0x4e, 0x59, 0x5f, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x12, 0x0a, + 0x0e, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x45, 0x54, 0x10, + 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x4b, 0x45, 0x59, 0x53, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x45, 0x54, + 0x10, 0x04, 0x3a, 0x3b, 0x9a, 0xc5, 0x88, 0x1e, 0x36, 0x0a, 0x34, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, + 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, + 0x4f, 0x0a, 0x16, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, + 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x4e, + 0x59, 0x5f, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, + 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x45, 0x54, 0x10, 0x02, + 0x22, 0x4d, 0x0a, 0x1e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4e, + 0x4f, 0x5f, 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, + 0x46, 0x41, 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x3a, + 0x2a, 0x9a, 0xc5, 0x88, 0x1e, 0x25, 0x0a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, + 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xe3, 0x01, 0x0a, 0x0f, + 0x53, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x45, 0x0a, 0x11, 0x73, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x67, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, + 0x0a, 0x61, 0x67, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x12, 0x6d, + 0x69, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, + 0x10, 0x6d, 0x69, 0x6e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x1a, 0x72, 0x0a, 0x12, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x4c, + 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5c, 0x0a, 0x11, 0x73, 0x6c, 0x6f, 0x77, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x73, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc5, 0x02, 0x0a, 0x14, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x48, + 0x0a, 0x0c, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x02, 0x52, 0x0b, 0x63, 0x68, 0x6f, + 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x11, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x69, 0x61, 0x73, 0x12, 0x5c, 0x0a, + 0x11, 0x73, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, - 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0f, 0x73, 0x75, 0x62, 0x73, - 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x61, - 0x77, 0x61, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x41, 0x77, 0x61, 0x72, 0x65, 0x12, - 0x32, 0x0a, 0x15, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x5f, 0x61, 0x6e, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x70, 0x61, 0x6e, - 0x69, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x41, 0x6e, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6c, 0x69, 0x73, - 0x74, 0x5f, 0x61, 0x73, 0x5f, 0x61, 0x6e, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x6c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x41, 0x6e, 0x79, 0x12, 0x92, 0x01, 0x0a, 0x18, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4e, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, - 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x62, - 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x61, - 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0xda, - 0x03, 0x0a, 0x10, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x73, 0x69, 0x6e, 0x67, 0x6c, - 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x48, - 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x12, 0x92, 0x01, 0x0a, - 0x0f, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, - 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, - 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, - 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x0e, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x12, 0x66, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x4b, 0x65, 0x79, 0x73, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x1e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x54, 0x5f, 0x44, 0x45, 0x46, - 0x49, 0x4e, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, 0x46, 0x41, 0x4c, - 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x4e, 0x59, 0x5f, 0x45, - 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x46, - 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x0f, 0x0a, - 0x0b, 0x4b, 0x45, 0x59, 0x53, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x45, 0x54, 0x10, 0x04, 0x3a, 0x3b, - 0x9a, 0xc5, 0x88, 0x1e, 0x36, 0x0a, 0x34, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, - 0x62, 0x73, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, - 0x73, 0x65, 0x74, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x4f, 0x0a, 0x16, 0x4c, - 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, 0x46, 0x41, 0x4c, 0x4c, - 0x42, 0x41, 0x43, 0x4b, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x4e, 0x59, 0x5f, 0x45, 0x4e, - 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x45, 0x54, 0x10, 0x02, 0x22, 0x4d, 0x0a, 0x1e, - 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x18, - 0x0a, 0x14, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x4e, 0x4f, 0x5f, 0x46, 0x41, - 0x4c, 0x4c, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x46, 0x41, 0x4c, 0x4c, - 0x42, 0x41, 0x43, 0x4b, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x3a, 0x2a, 0x9a, 0xc5, 0x88, - 0x1e, 0x25, 0x0a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x62, 0x53, 0x75, 0x62, 0x73, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xe3, 0x01, 0x0a, 0x0f, 0x53, 0x6c, 0x6f, 0x77, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x45, 0x0a, 0x11, 0x73, - 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0f, 0x73, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x67, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x0a, 0x61, 0x67, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x77, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x6d, 0x69, 0x6e, - 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x1a, 0x72, 0x0a, - 0x12, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x5c, 0x0a, 0x11, 0x73, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x2e, 0x53, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x0f, 0x73, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x1a, 0xc5, 0x02, 0x0a, 0x14, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x48, 0x0a, 0x0c, 0x63, 0x68, - 0x6f, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x02, 0x52, 0x0b, 0x63, 0x68, 0x6f, 0x69, 0x63, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x11, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x69, 0x61, 0x73, 0x12, 0x5c, 0x0a, 0x11, 0x73, 0x6c, 0x6f, - 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x73, 0x6c, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x30, 0x9a, 0xc5, 0x88, 0x1e, 0x2b, 0x0a, 0x29, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x91, 0x03, 0x0a, 0x10, 0x52, 0x69, - 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x54, - 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x32, 0x05, 0x18, 0x80, - 0x80, 0x80, 0x04, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x6d, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x69, - 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, - 0x61, 0x73, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, - 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0a, 0xfa, 0x42, - 0x07, 0x32, 0x05, 0x18, 0x80, 0x80, 0x80, 0x04, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x2e, 0x0a, 0x0c, 0x48, 0x61, 0x73, - 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x58, 0x58, 0x5f, - 0x48, 0x41, 0x53, 0x48, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, - 0x5f, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x32, 0x10, 0x01, 0x3a, 0x2c, 0x9a, 0xc5, 0x88, 0x1e, 0x27, - 0x0a, 0x25, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x4c, - 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0x59, 0x0a, - 0x0e, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x47, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x32, 0x05, 0x18, 0xcb, 0x96, 0xb1, 0x02, 0x52, 0x09, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0xbf, 0x02, 0x0a, 0x13, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x48, 0x74, - 0x74, 0x70, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x68, 0x74, 0x74, 0x70, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x68, 0x74, 0x74, 0x70, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, - 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x53, 0x6c, 0x6f, 0x77, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x73, 0x6c, 0x6f, 0x77, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x30, 0x9a, 0xc5, 0x88, + 0x1e, 0x2b, 0x0a, 0x29, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4c, 0x65, 0x61, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x91, 0x03, + 0x0a, 0x10, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x54, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0a, 0xfa, 0x42, 0x07, + 0x32, 0x05, 0x18, 0x80, 0x80, 0x80, 0x04, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x6d, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x68, + 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x3e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, 0x61, 0x73, 0x68, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x68, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x54, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x42, 0x09, 0xfa, 0x42, 0x06, 0x2a, 0x04, 0x18, 0xff, 0xff, 0x03, 0x52, 0x14, 0x75, 0x70, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 0x12, 0x46, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6b, 0x65, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x33, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x3a, 0x2f, 0x9a, 0xc5, 0x88, 0x1e, 0x2a, - 0x0a, 0x28, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x44, - 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xd5, 0x0b, 0x0a, 0x0e, 0x43, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, - 0x17, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x5f, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x15, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x50, - 0x61, 0x6e, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x74, 0x0a, - 0x14, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x61, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x62, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x5a, 0x6f, 0x6e, - 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, - 0x52, 0x11, 0x7a, 0x6f, 0x6e, 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x62, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x89, 0x01, 0x0a, 0x1b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x32, 0x05, 0x18, 0x80, 0x80, 0x80, 0x04, 0x52, 0x0f, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x69, 0x6e, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x2e, 0x0a, + 0x0c, 0x48, 0x61, 0x73, 0x68, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, + 0x07, 0x58, 0x58, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x55, + 0x52, 0x4d, 0x55, 0x52, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x32, 0x10, 0x01, 0x3a, 0x2c, 0x9a, + 0xc5, 0x88, 0x1e, 0x27, 0x0a, 0x25, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x6e, 0x67, 0x48, + 0x61, 0x73, 0x68, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x02, 0x10, + 0x03, 0x1a, 0x59, 0x0a, 0x0e, 0x4d, 0x61, 0x67, 0x6c, 0x65, 0x76, 0x4c, 0x62, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x47, 0x0a, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x32, 0x05, 0x18, 0xcb, 0x96, 0xb1, + 0x02, 0x52, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0xbf, 0x02, 0x0a, + 0x13, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x5f, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, + 0x73, 0x65, 0x48, 0x74, 0x74, 0x70, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, + 0x68, 0x74, 0x74, 0x70, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x68, 0x74, 0x74, 0x70, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5d, 0x0a, 0x16, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x2a, 0x04, 0x18, 0xff, 0xff, 0x03, 0x52, + 0x14, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x6f, 0x72, 0x74, 0x4f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x46, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, + 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4b, 0x65, 0x79, 0x3a, 0x2f, 0x9a, + 0xc5, 0x88, 0x1e, 0x2a, 0x0a, 0x28, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x61, 0x6c, 0x44, 0x73, 0x74, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xd5, + 0x0b, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x4e, 0x0a, 0x17, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x79, 0x5f, 0x70, 0x61, 0x6e, + 0x69, 0x63, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x15, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x50, 0x61, 0x6e, 0x69, 0x63, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x12, 0x74, 0x0a, 0x14, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x61, 0x77, 0x61, 0x72, 0x65, 0x5f, + 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x41, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x5a, 0x6f, 0x6e, 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x48, 0x00, 0x52, 0x11, 0x7a, 0x6f, 0x6e, 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, 0x4c, + 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x89, 0x01, 0x0a, 0x1b, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x62, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4c, + 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x18, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4c, 0x62, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x65, + 0x72, 0x67, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x43, + 0x0a, 0x1f, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x68, 0x6f, 0x73, + 0x74, 0x73, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x68, + 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4e, + 0x65, 0x77, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x48, 0x63, 0x12, 0x4d, 0x0a, 0x24, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x1f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x4f, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x8a, 0x01, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4c, 0x62, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x18, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x49, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, - 0x65, 0x72, 0x67, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x43, 0x0a, 0x1f, 0x69, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x5f, 0x75, - 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x68, 0x63, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x1a, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4e, 0x65, 0x77, 0x48, 0x6f, - 0x73, 0x74, 0x73, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x48, 0x63, 0x12, - 0x4d, 0x0a, 0x24, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x74, - 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x63, - 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4f, - 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x8a, - 0x01, 0x0a, 0x1c, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, - 0x69, 0x6e, 0x67, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x57, 0x0a, 0x14, 0x6f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, - 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x65, 0x74, - 0x52, 0x12, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x1a, 0x8d, 0x02, 0x0a, 0x11, 0x5a, 0x6f, 0x6e, 0x65, 0x41, 0x77, 0x61, - 0x72, 0x65, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x0f, 0x72, 0x6f, - 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x72, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x46, 0x0a, 0x10, 0x6d, - 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x6e, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x66, 0x61, 0x69, 0x6c, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x4f, - 0x6e, 0x50, 0x61, 0x6e, 0x69, 0x63, 0x3a, 0x3c, 0x9a, 0xc5, 0x88, 0x1e, 0x37, 0x0a, 0x35, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x5a, 0x6f, 0x6e, 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x62, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x5f, 0x0a, 0x18, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x3a, 0x43, 0x9a, 0xc5, 0x88, 0x1e, 0x3e, 0x0a, 0x3c, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4c, 0x62, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xf1, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x4c, 0x62, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x75, 0x73, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x46, 0x6f, 0x72, 0x48, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x12, 0x55, 0x0a, 0x13, - 0x68, 0x61, 0x73, 0x68, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x66, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x4c, 0x62, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, + 0x48, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x57, 0x0a, 0x14, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x53, 0x65, 0x74, 0x52, 0x12, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x48, 0x6f, + 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x8d, 0x02, 0x0a, 0x11, 0x5a, 0x6f, 0x6e, + 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, + 0x0a, 0x0f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, + 0x0e, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x46, 0x0a, 0x10, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x64, - 0x52, 0x11, 0x68, 0x61, 0x73, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x46, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x3a, 0x44, 0x9a, 0xc5, 0x88, 0x1e, 0x3f, 0x0a, 0x3d, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x69, 0x6e, - 0x67, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x2a, 0x9a, 0xc5, 0x88, 0x1e, 0x25, - 0x0a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x1b, 0x0a, 0x19, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x1a, 0xd2, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, - 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0xaa, 0x01, 0x08, 0x08, 0x01, 0x2a, 0x04, - 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x12, 0x4a, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x2a, 0x04, 0x10, 0xc0, 0x84, - 0x3d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x3a, 0x27, - 0x9a, 0xc5, 0x88, 0x1e, 0x22, 0x0a, 0x20, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x1a, 0x83, 0x02, 0x0a, 0x10, 0x50, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x78, 0x0a, 0x1d, - 0x70, 0x65, 0x72, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x12, 0x12, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x52, 0x1a, 0x70, 0x65, 0x72, 0x55, - 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x75, 0x0a, 0x1b, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, - 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x12, 0x12, - 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0x3f, 0x52, 0x19, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x1a, 0x66, 0x0a, - 0x22, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x0d, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, - 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, 0x5f, 0x44, 0x4e, 0x53, - 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x4f, 0x47, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x44, 0x4e, - 0x53, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x44, 0x53, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, - 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x41, 0x4c, 0x5f, 0x44, 0x53, 0x54, 0x10, 0x04, 0x22, 0xa4, - 0x01, 0x0a, 0x08, 0x4c, 0x62, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0f, 0x0a, 0x0b, 0x52, - 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x42, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, - 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x48, 0x41, 0x53, 0x48, 0x10, 0x02, 0x12, 0x0a, - 0x0a, 0x06, 0x52, 0x41, 0x4e, 0x44, 0x4f, 0x4d, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x41, - 0x47, 0x4c, 0x45, 0x56, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, - 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x10, 0x06, 0x12, 0x20, 0x0a, 0x1c, - 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x49, 0x4e, 0x47, 0x5f, 0x50, - 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x10, 0x07, 0x22, 0x04, - 0x08, 0x04, 0x10, 0x04, 0x2a, 0x0f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x41, 0x4c, 0x5f, 0x44, - 0x53, 0x54, 0x5f, 0x4c, 0x42, 0x22, 0x50, 0x0a, 0x0f, 0x44, 0x6e, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, 0x4f, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x56, 0x34, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x56, 0x36, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, - 0x56, 0x34, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x04, 0x22, 0x54, 0x0a, 0x18, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x53, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, - 0x47, 0x55, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x10, 0x00, - 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x53, 0x45, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x53, 0x54, 0x52, 0x45, - 0x41, 0x4d, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x10, 0x01, 0x3a, 0x1b, 0x9a, - 0xc5, 0x88, 0x1e, 0x16, 0x0a, 0x14, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x18, 0x0a, 0x16, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x62, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, 0x0f, 0x10, 0x10, 0x4a, 0x04, 0x08, - 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, 0x23, 0x10, 0x24, 0x52, - 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x0b, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x52, 0x1a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0xda, 0x02, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, - 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x4f, 0x0a, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, - 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x08, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x1a, 0xc8, 0x01, 0x0a, 0x06, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x60, 0x0a, 0x16, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x14, 0x74, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x2e, 0x9a, 0xc5, 0x88, 0x1e, 0x29, 0x0a, 0x27, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x01, 0x10, - 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x3a, 0x27, 0x9a, 0xc5, 0x88, 0x1e, 0x22, 0x0a, 0x20, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0xbb, 0x05, 0x0a, - 0x19, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x74, 0x63, - 0x70, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x63, 0x70, 0x4b, 0x65, 0x65, 0x70, - 0x61, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x0c, 0x74, 0x63, 0x70, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, - 0x69, 0x76, 0x65, 0x12, 0x64, 0x0a, 0x30, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x2a, 0x73, - 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x15, 0x68, 0x61, 0x70, - 0x70, 0x79, 0x5f, 0x65, 0x79, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x66, 0x61, 0x69, 0x6c, 0x5f, + 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x6e, 0x69, 0x63, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x66, 0x61, 0x69, 0x6c, 0x54, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x4f, 0x6e, 0x50, 0x61, 0x6e, 0x69, 0x63, 0x3a, 0x3c, 0x9a, 0xc5, 0x88, 0x1e, + 0x37, 0x0a, 0x35, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x5a, 0x6f, 0x6e, 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, + 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x5f, 0x0a, 0x18, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4c, 0x62, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x43, 0x9a, 0xc5, 0x88, 0x1e, 0x3e, 0x0a, 0x3c, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, + 0x64, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xf1, 0x01, 0x0a, 0x19, 0x43, 0x6f, + 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x4c, + 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x18, 0x75, 0x73, 0x65, 0x5f, 0x68, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x68, 0x61, 0x73, 0x68, + 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x75, 0x73, 0x65, 0x48, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x46, 0x6f, 0x72, 0x48, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, + 0x12, 0x55, 0x0a, 0x13, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x2a, 0x02, 0x28, 0x64, 0x52, 0x11, 0x68, 0x61, 0x73, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x44, 0x9a, 0xc5, 0x88, 0x1e, 0x3f, 0x0a, 0x3d, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x48, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x2a, 0x9a, + 0xc5, 0x88, 0x1e, 0x25, 0x0a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x4c, 0x62, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x1b, 0x0a, 0x19, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x1a, 0xd2, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0xaa, 0x01, 0x08, + 0x08, 0x01, 0x2a, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x4a, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x2a, + 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x3a, 0x27, 0x9a, 0xc5, 0x88, 0x1e, 0x22, 0x0a, 0x20, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x61, 0x74, 0x65, 0x1a, 0x83, 0x02, 0x0a, 0x10, + 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x78, 0x0a, 0x1d, 0x70, 0x65, 0x72, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x5f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x12, 0x12, 0x19, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x52, 0x1a, + 0x70, 0x65, 0x72, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x75, 0x0a, 0x1b, 0x70, 0x72, + 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x17, 0xfa, + 0x42, 0x14, 0x12, 0x12, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x52, 0x19, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x50, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x61, 0x74, 0x69, + 0x6f, 0x1a, 0x66, 0x0a, 0x22, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x0d, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, + 0x41, 0x54, 0x49, 0x43, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, + 0x5f, 0x44, 0x4e, 0x53, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x4f, 0x47, 0x49, 0x43, 0x41, + 0x4c, 0x5f, 0x44, 0x4e, 0x53, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x44, 0x53, 0x10, 0x03, + 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x41, 0x4c, 0x5f, 0x44, 0x53, 0x54, + 0x10, 0x04, 0x22, 0xa4, 0x01, 0x0a, 0x08, 0x4c, 0x62, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x0f, 0x0a, 0x0b, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x5f, 0x52, 0x4f, 0x42, 0x49, 0x4e, 0x10, 0x00, + 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x45, 0x41, 0x53, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, + 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x48, 0x41, 0x53, 0x48, + 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x41, 0x4e, 0x44, 0x4f, 0x4d, 0x10, 0x03, 0x12, 0x0a, + 0x0a, 0x06, 0x4d, 0x41, 0x47, 0x4c, 0x45, 0x56, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4c, + 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x10, 0x06, + 0x12, 0x20, 0x0a, 0x1c, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x49, + 0x4e, 0x47, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, + 0x10, 0x07, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x2a, 0x0f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, + 0x41, 0x4c, 0x5f, 0x44, 0x53, 0x54, 0x5f, 0x4c, 0x42, 0x22, 0x50, 0x0a, 0x0f, 0x44, 0x6e, 0x73, + 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x08, 0x0a, 0x04, + 0x41, 0x55, 0x54, 0x4f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x56, 0x34, 0x5f, 0x4f, 0x4e, 0x4c, + 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x56, 0x36, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, + 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x34, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x44, + 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4c, 0x4c, 0x10, 0x04, 0x22, 0x54, 0x0a, 0x18, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x53, 0x45, 0x5f, 0x43, + 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, + 0x4f, 0x4c, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x53, 0x45, 0x5f, 0x44, 0x4f, 0x57, 0x4e, + 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x10, + 0x01, 0x3a, 0x1b, 0x9a, 0xc5, 0x88, 0x1e, 0x16, 0x0a, 0x14, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x18, + 0x0a, 0x16, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x6c, 0x62, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, 0x0f, 0x10, + 0x10, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, + 0x23, 0x10, 0x24, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x0b, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x1a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xda, 0x02, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x4f, 0x0a, 0x08, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x52, 0x08, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x1a, 0xc8, 0x01, 0x0a, + 0x06, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x60, 0x0a, 0x16, 0x74, 0x79, 0x70, 0x65, 0x64, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x14, 0x74, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x2e, 0x9a, 0xc5, 0x88, 0x1e, 0x29, + 0x0a, 0x27, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, + 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x52, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x27, 0x9a, 0xc5, 0x88, 0x1e, 0x22, 0x0a, 0x20, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x22, 0xbb, 0x05, 0x0a, 0x19, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, + 0x0a, 0x0d, 0x74, 0x63, 0x70, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x63, 0x70, + 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x52, 0x0c, 0x74, 0x63, 0x70, 0x4b, 0x65, + 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x64, 0x0a, 0x30, 0x73, 0x65, 0x74, 0x5f, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x2a, 0x73, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x66, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x4f, 0x6e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, + 0x15, 0x68, 0x61, 0x70, 0x70, 0x79, 0x5f, 0x65, 0x79, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x48, 0x61, 0x70, 0x70, 0x79, 0x45, 0x79, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x13, 0x68, 0x61, 0x70, 0x70, 0x79, 0x45, 0x79, 0x65, 0x62, 0x61, + 0x6c, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x89, 0x02, 0x0a, 0x13, 0x48, 0x61, + 0x70, 0x70, 0x79, 0x45, 0x79, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x8d, 0x01, 0x0a, 0x1c, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x61, 0x70, - 0x70, 0x79, 0x45, 0x79, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x13, 0x68, 0x61, 0x70, 0x70, 0x79, 0x45, 0x79, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x89, 0x02, 0x0a, 0x13, 0x48, 0x61, 0x70, 0x70, 0x79, 0x45, - 0x79, 0x65, 0x62, 0x61, 0x6c, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x8d, 0x01, - 0x0a, 0x1c, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, - 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x55, - 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x41, 0x64, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x19, 0x66, 0x69, 0x72, 0x73, 0x74, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x62, 0x0a, 0x1a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, 0x17, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x19, 0x46, 0x69, 0x72, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x19, 0x66, 0x69, 0x72, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, - 0x1a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x66, - 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, 0x17, 0x66, 0x69, 0x72, 0x73, 0x74, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x38, 0x0a, 0x19, 0x46, 0x69, 0x72, 0x73, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0b, - 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x56, - 0x34, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x56, 0x36, 0x10, 0x02, 0x3a, 0x2d, 0x9a, 0xc5, 0x88, - 0x1e, 0x28, 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x11, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x62, 0x75, 0x64, 0x67, - 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x12, - 0x2c, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x70, 0x65, 0x72, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x89, 0x01, - 0x0a, 0x25, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x42, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, - 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x3b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x76, - 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, + 0x06, 0x0a, 0x02, 0x56, 0x34, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x56, 0x36, 0x10, 0x02, 0x3a, + 0x2d, 0x9a, 0xc5, 0x88, 0x1e, 0x28, 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa0, + 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, + 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x73, 0x12, 0x34, 0x0a, + 0x16, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x70, 0x65, 0x72, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x42, 0x89, 0x01, 0x0a, 0x25, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x42, 0x0c, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x48, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x3b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4232,79 +4254,80 @@ var file_envoy_config_cluster_v3_cluster_proto_depIdxs = []int32{ 43, // 15: envoy.config.cluster.v3.Cluster.http2_protocol_options:type_name -> envoy.config.core.v3.Http2ProtocolOptions 27, // 16: envoy.config.cluster.v3.Cluster.typed_extension_protocol_options:type_name -> envoy.config.cluster.v3.Cluster.TypedExtensionProtocolOptionsEntry 35, // 17: envoy.config.cluster.v3.Cluster.dns_refresh_rate:type_name -> google.protobuf.Duration - 25, // 18: envoy.config.cluster.v3.Cluster.dns_failure_refresh_rate:type_name -> envoy.config.cluster.v3.Cluster.RefreshRate - 2, // 19: envoy.config.cluster.v3.Cluster.dns_lookup_family:type_name -> envoy.config.cluster.v3.Cluster.DnsLookupFamily - 44, // 20: envoy.config.cluster.v3.Cluster.dns_resolvers:type_name -> envoy.config.core.v3.Address - 45, // 21: envoy.config.cluster.v3.Cluster.dns_resolution_config:type_name -> envoy.config.core.v3.DnsResolutionConfig - 46, // 22: envoy.config.cluster.v3.Cluster.typed_dns_resolver_config:type_name -> envoy.config.core.v3.TypedExtensionConfig - 47, // 23: envoy.config.cluster.v3.Cluster.wait_for_warm_on_init:type_name -> google.protobuf.BoolValue - 48, // 24: envoy.config.cluster.v3.Cluster.outlier_detection:type_name -> envoy.config.cluster.v3.OutlierDetection - 35, // 25: envoy.config.cluster.v3.Cluster.cleanup_interval:type_name -> google.protobuf.Duration - 49, // 26: envoy.config.cluster.v3.Cluster.upstream_bind_config:type_name -> envoy.config.core.v3.BindConfig - 17, // 27: envoy.config.cluster.v3.Cluster.lb_subset_config:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig - 21, // 28: envoy.config.cluster.v3.Cluster.ring_hash_lb_config:type_name -> envoy.config.cluster.v3.Cluster.RingHashLbConfig - 22, // 29: envoy.config.cluster.v3.Cluster.maglev_lb_config:type_name -> envoy.config.cluster.v3.Cluster.MaglevLbConfig - 23, // 30: envoy.config.cluster.v3.Cluster.original_dst_lb_config:type_name -> envoy.config.cluster.v3.Cluster.OriginalDstLbConfig - 20, // 31: envoy.config.cluster.v3.Cluster.least_request_lb_config:type_name -> envoy.config.cluster.v3.Cluster.LeastRequestLbConfig - 19, // 32: envoy.config.cluster.v3.Cluster.round_robin_lb_config:type_name -> envoy.config.cluster.v3.Cluster.RoundRobinLbConfig - 24, // 33: envoy.config.cluster.v3.Cluster.common_lb_config:type_name -> envoy.config.cluster.v3.Cluster.CommonLbConfig - 50, // 34: envoy.config.cluster.v3.Cluster.transport_socket:type_name -> envoy.config.core.v3.TransportSocket - 51, // 35: envoy.config.cluster.v3.Cluster.metadata:type_name -> envoy.config.core.v3.Metadata - 3, // 36: envoy.config.cluster.v3.Cluster.protocol_selection:type_name -> envoy.config.cluster.v3.Cluster.ClusterProtocolSelection - 12, // 37: envoy.config.cluster.v3.Cluster.upstream_connection_options:type_name -> envoy.config.cluster.v3.UpstreamConnectionOptions - 52, // 38: envoy.config.cluster.v3.Cluster.filters:type_name -> envoy.config.cluster.v3.Filter - 11, // 39: envoy.config.cluster.v3.Cluster.load_balancing_policy:type_name -> envoy.config.cluster.v3.LoadBalancingPolicy - 53, // 40: envoy.config.cluster.v3.Cluster.lrs_server:type_name -> envoy.config.core.v3.ConfigSource - 46, // 41: envoy.config.cluster.v3.Cluster.upstream_config:type_name -> envoy.config.core.v3.TypedExtensionConfig - 13, // 42: envoy.config.cluster.v3.Cluster.track_cluster_stats:type_name -> envoy.config.cluster.v3.TrackClusterStats - 26, // 43: envoy.config.cluster.v3.Cluster.preconnect_policy:type_name -> envoy.config.cluster.v3.Cluster.PreconnectPolicy - 32, // 44: envoy.config.cluster.v3.LoadBalancingPolicy.policies:type_name -> envoy.config.cluster.v3.LoadBalancingPolicy.Policy - 54, // 45: envoy.config.cluster.v3.UpstreamConnectionOptions.tcp_keepalive:type_name -> envoy.config.core.v3.TcpKeepalive - 33, // 46: envoy.config.cluster.v3.UpstreamConnectionOptions.happy_eyeballs_config:type_name -> envoy.config.cluster.v3.UpstreamConnectionOptions.HappyEyeballsConfig - 55, // 47: envoy.config.cluster.v3.Cluster.TransportSocketMatch.match:type_name -> google.protobuf.Struct - 50, // 48: envoy.config.cluster.v3.Cluster.TransportSocketMatch.transport_socket:type_name -> envoy.config.core.v3.TransportSocket - 56, // 49: envoy.config.cluster.v3.Cluster.CustomClusterType.typed_config:type_name -> google.protobuf.Any - 53, // 50: envoy.config.cluster.v3.Cluster.EdsClusterConfig.eds_config:type_name -> envoy.config.core.v3.ConfigSource - 4, // 51: envoy.config.cluster.v3.Cluster.LbSubsetConfig.fallback_policy:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetFallbackPolicy - 55, // 52: envoy.config.cluster.v3.Cluster.LbSubsetConfig.default_subset:type_name -> google.protobuf.Struct - 28, // 53: envoy.config.cluster.v3.Cluster.LbSubsetConfig.subset_selectors:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector - 5, // 54: envoy.config.cluster.v3.Cluster.LbSubsetConfig.metadata_fallback_policy:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetMetadataFallbackPolicy - 35, // 55: envoy.config.cluster.v3.Cluster.SlowStartConfig.slow_start_window:type_name -> google.protobuf.Duration - 57, // 56: envoy.config.cluster.v3.Cluster.SlowStartConfig.aggression:type_name -> envoy.config.core.v3.RuntimeDouble - 58, // 57: envoy.config.cluster.v3.Cluster.SlowStartConfig.min_weight_percent:type_name -> envoy.type.v3.Percent - 18, // 58: envoy.config.cluster.v3.Cluster.RoundRobinLbConfig.slow_start_config:type_name -> envoy.config.cluster.v3.Cluster.SlowStartConfig - 36, // 59: envoy.config.cluster.v3.Cluster.LeastRequestLbConfig.choice_count:type_name -> google.protobuf.UInt32Value - 57, // 60: envoy.config.cluster.v3.Cluster.LeastRequestLbConfig.active_request_bias:type_name -> envoy.config.core.v3.RuntimeDouble - 18, // 61: envoy.config.cluster.v3.Cluster.LeastRequestLbConfig.slow_start_config:type_name -> envoy.config.cluster.v3.Cluster.SlowStartConfig - 59, // 62: envoy.config.cluster.v3.Cluster.RingHashLbConfig.minimum_ring_size:type_name -> google.protobuf.UInt64Value - 7, // 63: envoy.config.cluster.v3.Cluster.RingHashLbConfig.hash_function:type_name -> envoy.config.cluster.v3.Cluster.RingHashLbConfig.HashFunction - 59, // 64: envoy.config.cluster.v3.Cluster.RingHashLbConfig.maximum_ring_size:type_name -> google.protobuf.UInt64Value - 59, // 65: envoy.config.cluster.v3.Cluster.MaglevLbConfig.table_size:type_name -> google.protobuf.UInt64Value - 36, // 66: envoy.config.cluster.v3.Cluster.OriginalDstLbConfig.upstream_port_override:type_name -> google.protobuf.UInt32Value - 60, // 67: envoy.config.cluster.v3.Cluster.OriginalDstLbConfig.metadata_key:type_name -> envoy.type.metadata.v3.MetadataKey - 58, // 68: envoy.config.cluster.v3.Cluster.CommonLbConfig.healthy_panic_threshold:type_name -> envoy.type.v3.Percent - 29, // 69: envoy.config.cluster.v3.Cluster.CommonLbConfig.zone_aware_lb_config:type_name -> envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfig - 30, // 70: envoy.config.cluster.v3.Cluster.CommonLbConfig.locality_weighted_lb_config:type_name -> envoy.config.cluster.v3.Cluster.CommonLbConfig.LocalityWeightedLbConfig - 35, // 71: envoy.config.cluster.v3.Cluster.CommonLbConfig.update_merge_window:type_name -> google.protobuf.Duration - 31, // 72: envoy.config.cluster.v3.Cluster.CommonLbConfig.consistent_hashing_lb_config:type_name -> envoy.config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig - 61, // 73: envoy.config.cluster.v3.Cluster.CommonLbConfig.override_host_status:type_name -> envoy.config.core.v3.HealthStatusSet - 35, // 74: envoy.config.cluster.v3.Cluster.RefreshRate.base_interval:type_name -> google.protobuf.Duration - 35, // 75: envoy.config.cluster.v3.Cluster.RefreshRate.max_interval:type_name -> google.protobuf.Duration - 62, // 76: envoy.config.cluster.v3.Cluster.PreconnectPolicy.per_upstream_preconnect_ratio:type_name -> google.protobuf.DoubleValue - 62, // 77: envoy.config.cluster.v3.Cluster.PreconnectPolicy.predictive_preconnect_ratio:type_name -> google.protobuf.DoubleValue - 56, // 78: envoy.config.cluster.v3.Cluster.TypedExtensionProtocolOptionsEntry.value:type_name -> google.protobuf.Any - 6, // 79: envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.fallback_policy:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.LbSubsetSelectorFallbackPolicy - 58, // 80: envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfig.routing_enabled:type_name -> envoy.type.v3.Percent - 59, // 81: envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfig.min_cluster_size:type_name -> google.protobuf.UInt64Value - 36, // 82: envoy.config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig.hash_balance_factor:type_name -> google.protobuf.UInt32Value - 46, // 83: envoy.config.cluster.v3.LoadBalancingPolicy.Policy.typed_extension_config:type_name -> envoy.config.core.v3.TypedExtensionConfig - 8, // 84: envoy.config.cluster.v3.UpstreamConnectionOptions.HappyEyeballsConfig.first_address_family_version:type_name -> envoy.config.cluster.v3.UpstreamConnectionOptions.FirstAddressFamilyVersion - 36, // 85: envoy.config.cluster.v3.UpstreamConnectionOptions.HappyEyeballsConfig.first_address_family_count:type_name -> google.protobuf.UInt32Value - 86, // [86:86] is the sub-list for method output_type - 86, // [86:86] is the sub-list for method input_type - 86, // [86:86] is the sub-list for extension type_name - 86, // [86:86] is the sub-list for extension extendee - 0, // [0:86] is the sub-list for field type_name + 35, // 18: envoy.config.cluster.v3.Cluster.dns_jitter:type_name -> google.protobuf.Duration + 25, // 19: envoy.config.cluster.v3.Cluster.dns_failure_refresh_rate:type_name -> envoy.config.cluster.v3.Cluster.RefreshRate + 2, // 20: envoy.config.cluster.v3.Cluster.dns_lookup_family:type_name -> envoy.config.cluster.v3.Cluster.DnsLookupFamily + 44, // 21: envoy.config.cluster.v3.Cluster.dns_resolvers:type_name -> envoy.config.core.v3.Address + 45, // 22: envoy.config.cluster.v3.Cluster.dns_resolution_config:type_name -> envoy.config.core.v3.DnsResolutionConfig + 46, // 23: envoy.config.cluster.v3.Cluster.typed_dns_resolver_config:type_name -> envoy.config.core.v3.TypedExtensionConfig + 47, // 24: envoy.config.cluster.v3.Cluster.wait_for_warm_on_init:type_name -> google.protobuf.BoolValue + 48, // 25: envoy.config.cluster.v3.Cluster.outlier_detection:type_name -> envoy.config.cluster.v3.OutlierDetection + 35, // 26: envoy.config.cluster.v3.Cluster.cleanup_interval:type_name -> google.protobuf.Duration + 49, // 27: envoy.config.cluster.v3.Cluster.upstream_bind_config:type_name -> envoy.config.core.v3.BindConfig + 17, // 28: envoy.config.cluster.v3.Cluster.lb_subset_config:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig + 21, // 29: envoy.config.cluster.v3.Cluster.ring_hash_lb_config:type_name -> envoy.config.cluster.v3.Cluster.RingHashLbConfig + 22, // 30: envoy.config.cluster.v3.Cluster.maglev_lb_config:type_name -> envoy.config.cluster.v3.Cluster.MaglevLbConfig + 23, // 31: envoy.config.cluster.v3.Cluster.original_dst_lb_config:type_name -> envoy.config.cluster.v3.Cluster.OriginalDstLbConfig + 20, // 32: envoy.config.cluster.v3.Cluster.least_request_lb_config:type_name -> envoy.config.cluster.v3.Cluster.LeastRequestLbConfig + 19, // 33: envoy.config.cluster.v3.Cluster.round_robin_lb_config:type_name -> envoy.config.cluster.v3.Cluster.RoundRobinLbConfig + 24, // 34: envoy.config.cluster.v3.Cluster.common_lb_config:type_name -> envoy.config.cluster.v3.Cluster.CommonLbConfig + 50, // 35: envoy.config.cluster.v3.Cluster.transport_socket:type_name -> envoy.config.core.v3.TransportSocket + 51, // 36: envoy.config.cluster.v3.Cluster.metadata:type_name -> envoy.config.core.v3.Metadata + 3, // 37: envoy.config.cluster.v3.Cluster.protocol_selection:type_name -> envoy.config.cluster.v3.Cluster.ClusterProtocolSelection + 12, // 38: envoy.config.cluster.v3.Cluster.upstream_connection_options:type_name -> envoy.config.cluster.v3.UpstreamConnectionOptions + 52, // 39: envoy.config.cluster.v3.Cluster.filters:type_name -> envoy.config.cluster.v3.Filter + 11, // 40: envoy.config.cluster.v3.Cluster.load_balancing_policy:type_name -> envoy.config.cluster.v3.LoadBalancingPolicy + 53, // 41: envoy.config.cluster.v3.Cluster.lrs_server:type_name -> envoy.config.core.v3.ConfigSource + 46, // 42: envoy.config.cluster.v3.Cluster.upstream_config:type_name -> envoy.config.core.v3.TypedExtensionConfig + 13, // 43: envoy.config.cluster.v3.Cluster.track_cluster_stats:type_name -> envoy.config.cluster.v3.TrackClusterStats + 26, // 44: envoy.config.cluster.v3.Cluster.preconnect_policy:type_name -> envoy.config.cluster.v3.Cluster.PreconnectPolicy + 32, // 45: envoy.config.cluster.v3.LoadBalancingPolicy.policies:type_name -> envoy.config.cluster.v3.LoadBalancingPolicy.Policy + 54, // 46: envoy.config.cluster.v3.UpstreamConnectionOptions.tcp_keepalive:type_name -> envoy.config.core.v3.TcpKeepalive + 33, // 47: envoy.config.cluster.v3.UpstreamConnectionOptions.happy_eyeballs_config:type_name -> envoy.config.cluster.v3.UpstreamConnectionOptions.HappyEyeballsConfig + 55, // 48: envoy.config.cluster.v3.Cluster.TransportSocketMatch.match:type_name -> google.protobuf.Struct + 50, // 49: envoy.config.cluster.v3.Cluster.TransportSocketMatch.transport_socket:type_name -> envoy.config.core.v3.TransportSocket + 56, // 50: envoy.config.cluster.v3.Cluster.CustomClusterType.typed_config:type_name -> google.protobuf.Any + 53, // 51: envoy.config.cluster.v3.Cluster.EdsClusterConfig.eds_config:type_name -> envoy.config.core.v3.ConfigSource + 4, // 52: envoy.config.cluster.v3.Cluster.LbSubsetConfig.fallback_policy:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetFallbackPolicy + 55, // 53: envoy.config.cluster.v3.Cluster.LbSubsetConfig.default_subset:type_name -> google.protobuf.Struct + 28, // 54: envoy.config.cluster.v3.Cluster.LbSubsetConfig.subset_selectors:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector + 5, // 55: envoy.config.cluster.v3.Cluster.LbSubsetConfig.metadata_fallback_policy:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetMetadataFallbackPolicy + 35, // 56: envoy.config.cluster.v3.Cluster.SlowStartConfig.slow_start_window:type_name -> google.protobuf.Duration + 57, // 57: envoy.config.cluster.v3.Cluster.SlowStartConfig.aggression:type_name -> envoy.config.core.v3.RuntimeDouble + 58, // 58: envoy.config.cluster.v3.Cluster.SlowStartConfig.min_weight_percent:type_name -> envoy.type.v3.Percent + 18, // 59: envoy.config.cluster.v3.Cluster.RoundRobinLbConfig.slow_start_config:type_name -> envoy.config.cluster.v3.Cluster.SlowStartConfig + 36, // 60: envoy.config.cluster.v3.Cluster.LeastRequestLbConfig.choice_count:type_name -> google.protobuf.UInt32Value + 57, // 61: envoy.config.cluster.v3.Cluster.LeastRequestLbConfig.active_request_bias:type_name -> envoy.config.core.v3.RuntimeDouble + 18, // 62: envoy.config.cluster.v3.Cluster.LeastRequestLbConfig.slow_start_config:type_name -> envoy.config.cluster.v3.Cluster.SlowStartConfig + 59, // 63: envoy.config.cluster.v3.Cluster.RingHashLbConfig.minimum_ring_size:type_name -> google.protobuf.UInt64Value + 7, // 64: envoy.config.cluster.v3.Cluster.RingHashLbConfig.hash_function:type_name -> envoy.config.cluster.v3.Cluster.RingHashLbConfig.HashFunction + 59, // 65: envoy.config.cluster.v3.Cluster.RingHashLbConfig.maximum_ring_size:type_name -> google.protobuf.UInt64Value + 59, // 66: envoy.config.cluster.v3.Cluster.MaglevLbConfig.table_size:type_name -> google.protobuf.UInt64Value + 36, // 67: envoy.config.cluster.v3.Cluster.OriginalDstLbConfig.upstream_port_override:type_name -> google.protobuf.UInt32Value + 60, // 68: envoy.config.cluster.v3.Cluster.OriginalDstLbConfig.metadata_key:type_name -> envoy.type.metadata.v3.MetadataKey + 58, // 69: envoy.config.cluster.v3.Cluster.CommonLbConfig.healthy_panic_threshold:type_name -> envoy.type.v3.Percent + 29, // 70: envoy.config.cluster.v3.Cluster.CommonLbConfig.zone_aware_lb_config:type_name -> envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfig + 30, // 71: envoy.config.cluster.v3.Cluster.CommonLbConfig.locality_weighted_lb_config:type_name -> envoy.config.cluster.v3.Cluster.CommonLbConfig.LocalityWeightedLbConfig + 35, // 72: envoy.config.cluster.v3.Cluster.CommonLbConfig.update_merge_window:type_name -> google.protobuf.Duration + 31, // 73: envoy.config.cluster.v3.Cluster.CommonLbConfig.consistent_hashing_lb_config:type_name -> envoy.config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig + 61, // 74: envoy.config.cluster.v3.Cluster.CommonLbConfig.override_host_status:type_name -> envoy.config.core.v3.HealthStatusSet + 35, // 75: envoy.config.cluster.v3.Cluster.RefreshRate.base_interval:type_name -> google.protobuf.Duration + 35, // 76: envoy.config.cluster.v3.Cluster.RefreshRate.max_interval:type_name -> google.protobuf.Duration + 62, // 77: envoy.config.cluster.v3.Cluster.PreconnectPolicy.per_upstream_preconnect_ratio:type_name -> google.protobuf.DoubleValue + 62, // 78: envoy.config.cluster.v3.Cluster.PreconnectPolicy.predictive_preconnect_ratio:type_name -> google.protobuf.DoubleValue + 56, // 79: envoy.config.cluster.v3.Cluster.TypedExtensionProtocolOptionsEntry.value:type_name -> google.protobuf.Any + 6, // 80: envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.fallback_policy:type_name -> envoy.config.cluster.v3.Cluster.LbSubsetConfig.LbSubsetSelector.LbSubsetSelectorFallbackPolicy + 58, // 81: envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfig.routing_enabled:type_name -> envoy.type.v3.Percent + 59, // 82: envoy.config.cluster.v3.Cluster.CommonLbConfig.ZoneAwareLbConfig.min_cluster_size:type_name -> google.protobuf.UInt64Value + 36, // 83: envoy.config.cluster.v3.Cluster.CommonLbConfig.ConsistentHashingLbConfig.hash_balance_factor:type_name -> google.protobuf.UInt32Value + 46, // 84: envoy.config.cluster.v3.LoadBalancingPolicy.Policy.typed_extension_config:type_name -> envoy.config.core.v3.TypedExtensionConfig + 8, // 85: envoy.config.cluster.v3.UpstreamConnectionOptions.HappyEyeballsConfig.first_address_family_version:type_name -> envoy.config.cluster.v3.UpstreamConnectionOptions.FirstAddressFamilyVersion + 36, // 86: envoy.config.cluster.v3.UpstreamConnectionOptions.HappyEyeballsConfig.first_address_family_count:type_name -> google.protobuf.UInt32Value + 87, // [87:87] is the sub-list for method output_type + 87, // [87:87] is the sub-list for method input_type + 87, // [87:87] is the sub-list for extension type_name + 87, // [87:87] is the sub-list for extension extendee + 0, // [0:87] is the sub-list for field type_name } func init() { file_envoy_config_cluster_v3_cluster_proto_init() } diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/cluster/v3/cluster.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/config/cluster/v3/cluster.pb.validate.go index d167bdd461..e2ce72fa21 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/config/cluster/v3/cluster.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/config/cluster/v3/cluster.pb.validate.go @@ -646,6 +646,36 @@ func (m *Cluster) validate(all bool) error { } } + if d := m.GetDnsJitter(); d != nil { + dur, err := d.AsDuration(), d.CheckValid() + if err != nil { + err = ClusterValidationError{ + field: "DnsJitter", + reason: "value is not a valid duration", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + gte := time.Duration(0*time.Second + 0*time.Nanosecond) + + if dur < gte { + err := ClusterValidationError{ + field: "DnsJitter", + reason: "value must be greater than or equal to 0s", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + if all { switch v := interface{}(m.GetDnsFailureRefreshRate()).(type) { case interface{ ValidateAll() error }: diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/protocol.pb.go b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/protocol.pb.go index 13061b011f..22854dc9d9 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/protocol.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/protocol.pb.go @@ -202,7 +202,7 @@ func (x *QuicKeepAliveSettings) GetInitialInterval() *durationpb.Duration { } // QUIC protocol options which apply to both downstream and upstream connections. -// [#next-free-field: 9] +// [#next-free-field: 10] type QuicProtocolOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -248,6 +248,9 @@ type QuicProtocolOptions struct { // For internal corporate network, a long timeout is often fine. // But for client facing network, 30s is usually a good choice. IdleNetworkTimeout *durationpb.Duration `protobuf:"bytes,8,opt,name=idle_network_timeout,json=idleNetworkTimeout,proto3" json:"idle_network_timeout,omitempty"` + // Maximum packet length for QUIC connections. It refers to the largest size of a QUIC packet that can be transmitted over the connection. + // If not specified, one of the `default values in QUICHE `_ is used. + MaxPacketLength *wrapperspb.UInt64Value `protobuf:"bytes,9,opt,name=max_packet_length,json=maxPacketLength,proto3" json:"max_packet_length,omitempty"` } func (x *QuicProtocolOptions) Reset() { @@ -338,6 +341,13 @@ func (x *QuicProtocolOptions) GetIdleNetworkTimeout() *durationpb.Duration { return nil } +func (x *QuicProtocolOptions) GetMaxPacketLength() *wrapperspb.UInt64Value { + if x != nil { + return x.MaxPacketLength + } + return nil +} + type UpstreamHttpProtocolOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -530,7 +540,7 @@ func (x *AlternateProtocolsCacheOptions) GetCanonicalSuffixes() []string { return nil } -// [#next-free-field: 7] +// [#next-free-field: 8] type HttpProtocolOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -560,10 +570,29 @@ type HttpProtocolOptions struct { // if there are no active streams. See :ref:`drain_timeout // `. MaxConnectionDuration *durationpb.Duration `protobuf:"bytes,3,opt,name=max_connection_duration,json=maxConnectionDuration,proto3" json:"max_connection_duration,omitempty"` - // The maximum number of headers. If unconfigured, the default - // maximum number of request headers allowed is 100. Requests that exceed this limit will receive - // a 431 response for HTTP/1.x and cause a stream reset for HTTP/2. + // The maximum number of headers (request headers if configured on HttpConnectionManager, + // response headers when configured on a cluster). + // If unconfigured, the default maximum number of headers allowed is 100. + // The default value for requests can be overridden by setting runtime key “envoy.reloadable_features.max_request_headers_count“. + // The default value for responses can be overridden by setting runtime key “envoy.reloadable_features.max_response_headers_count“. + // Downstream requests that exceed this limit will receive a 431 response for HTTP/1.x and cause a stream + // reset for HTTP/2. + // Upstream responses that exceed this limit will result in a 503 response. MaxHeadersCount *wrapperspb.UInt32Value `protobuf:"bytes,2,opt,name=max_headers_count,json=maxHeadersCount,proto3" json:"max_headers_count,omitempty"` + // The maximum size of response headers. + // If unconfigured, the default is 60 KiB, except for HTTP/1 response headers which have a default + // of 80KiB. + // The default value can be overridden by setting runtime key “envoy.reloadable_features.max_response_headers_size_kb“. + // Responses that exceed this limit will result in a 503 response. + // In Envoy, this setting is only valid when configured on an upstream cluster, not on the + // :ref:`HTTP Connection Manager + // `. + // + // Note: currently some protocol codecs impose limits on the maximum size of a single header: + // + // HTTP/2 (when using nghttp2) limits a single header to around 100kb. + // HTTP/3 limits a single header to around 1024kb. + MaxResponseHeadersKb *wrapperspb.UInt32Value `protobuf:"bytes,7,opt,name=max_response_headers_kb,json=maxResponseHeadersKb,proto3" json:"max_response_headers_kb,omitempty"` // Total duration to keep alive an HTTP request/response stream. If the time limit is reached the stream will be // reset independent of any other timeouts. If not specified, this value is not set. MaxStreamDuration *durationpb.Duration `protobuf:"bytes,4,opt,name=max_stream_duration,json=maxStreamDuration,proto3" json:"max_stream_duration,omitempty"` @@ -633,6 +662,13 @@ func (x *HttpProtocolOptions) GetMaxHeadersCount() *wrapperspb.UInt32Value { return nil } +func (x *HttpProtocolOptions) GetMaxResponseHeadersKb() *wrapperspb.UInt32Value { + if x != nil { + return x.MaxResponseHeadersKb + } + return nil +} + func (x *HttpProtocolOptions) GetMaxStreamDuration() *durationpb.Duration { if x != nil { return x.MaxStreamDuration @@ -1736,7 +1772,7 @@ var file_envoy_config_core_v3_protocol_proto_rawDesc = []byte{ 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x22, 0x00, 0x32, 0x02, 0x08, 0x01, 0x52, 0x0f, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xf1, 0x05, 0x0a, + 0x74, 0x69, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xbb, 0x06, 0x0a, 0x13, 0x51, 0x75, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5b, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, @@ -1784,358 +1820,369 @@ var file_envoy_config_core_v3_protocol_proto_rawDesc = []byte{ 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0xfa, 0x42, 0x0c, 0xaa, 0x01, 0x09, 0x22, 0x03, 0x08, 0xd8, 0x04, 0x32, 0x02, 0x08, 0x01, 0x52, 0x12, 0x69, 0x64, 0x6c, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x22, 0xe4, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, 0x74, - 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x6e, 0x69, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x6e, 0x69, 0x12, 0x2e, 0x0a, 0x13, 0x61, - 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x61, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x61, - 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x18, 0x6f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x6e, 0x69, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, - 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, 0x15, 0x6f, 0x76, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x6e, 0x69, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x3a, 0x34, 0x9a, 0xc5, 0x88, 0x1e, 0x2f, 0x0a, 0x2d, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x04, 0x0a, 0x1e, 0x41, 0x6c, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x65, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, - 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, - 0x02, 0x20, 0x00, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x5f, 0x0a, 0x16, 0x6b, 0x65, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x13, 0x6b, 0x65, 0x79, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x84, 0x01, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x51, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x13, 0x70, 0x72, 0x65, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x61, 0x6e, 0x6f, 0x6e, - 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x11, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, - 0x66, 0x66, 0x69, 0x78, 0x65, 0x73, 0x1a, 0x68, 0x0a, 0x1c, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, - 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1f, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, - 0x42, 0x08, 0x2a, 0x06, 0x10, 0xff, 0xff, 0x03, 0x20, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x22, 0xaf, 0x05, 0x0a, 0x13, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x69, 0x64, 0x6c, 0x65, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x12, 0x48, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0xe4, 0x01, 0x0a, 0x1b, 0x55, + 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x75, + 0x74, 0x6f, 0x5f, 0x73, 0x6e, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x75, + 0x74, 0x6f, 0x53, 0x6e, 0x69, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x61, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x61, 0x75, 0x74, 0x6f, 0x53, 0x61, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x18, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, + 0x65, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x6e, 0x69, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, + 0x01, 0xd0, 0x01, 0x01, 0x52, 0x15, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x41, 0x75, + 0x74, 0x6f, 0x53, 0x6e, 0x69, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x3a, 0x34, 0x9a, 0xc5, 0x88, + 0x1e, 0x2f, 0x0a, 0x2d, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, + 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x86, 0x04, 0x0a, 0x1e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x20, 0x00, 0x52, 0x0a, 0x6d, + 0x61, 0x78, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x5f, 0x0a, 0x16, 0x6b, 0x65, 0x79, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x13, 0x6b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x84, 0x01, 0x0a, 0x14, 0x70, + 0x72, 0x65, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x51, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x70, 0x72, + 0x65, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, + 0x75, 0x66, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x63, + 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x65, 0x73, + 0x1a, 0x68, 0x0a, 0x1c, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x27, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x2a, 0x06, 0x10, 0xff, + 0xff, 0x03, 0x20, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x90, 0x06, 0x0a, 0x13, 0x48, + 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x51, 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x15, 0x6d, 0x61, + 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x64, 0x6c, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x51, 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x11, 0x6d, 0x61, 0x78, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, 0x0f, 0x6d, 0x61, 0x78, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x49, 0x0a, 0x13, - 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8d, 0x01, 0x0a, 0x1f, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x46, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1c, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, - 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x1c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x57, + 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x5f, 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x6b, + 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0x80, 0x40, 0x20, + 0x00, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x4b, 0x62, 0x12, 0x49, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x11, 0x6d, 0x61, 0x78, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x8d, 0x01, 0x0a, 0x1f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x77, + 0x69, 0x74, 0x68, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x46, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x00, 0x12, - 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, - 0x54, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x48, 0x45, 0x41, 0x44, - 0x45, 0x52, 0x10, 0x02, 0x3a, 0x2c, 0x9a, 0xc5, 0x88, 0x1e, 0x27, 0x0a, 0x25, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x48, - 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x93, 0x09, 0x0a, 0x14, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 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, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, - 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x31, 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, - 0x63, 0x63, 0x65, 0x70, 0x74, 0x48, 0x74, 0x74, 0x70, 0x31, 0x30, 0x12, 0x36, 0x0a, 0x18, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x31, 0x30, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, - 0x70, 0x31, 0x30, 0x12, 0x66, 0x0a, 0x11, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6b, 0x65, - 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0f, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x69, - 0x6c, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x68, - 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, - 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x7a, 0x0a, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, - 0x64, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, - 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 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, - 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x27, 0x6f, 0x76, 0x65, 0x72, 0x72, - 0x69, 0x64, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4f, 0x6e, - 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x79, - 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x73, 0x65, 0x6e, 0x64, 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x51, - 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x4e, 0x0a, 0x10, 0x75, - 0x73, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x73, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x42, 0x08, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x52, 0x0e, 0x75, 0x73, 0x65, - 0x42, 0x61, 0x6c, 0x73, 0x61, 0x50, 0x61, 0x72, 0x73, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x14, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x42, 0x08, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, - 0x02, 0x08, 0x01, 0x52, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x1a, 0x9f, 0x03, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x78, 0x0a, 0x11, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, - 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x57, 0x6f, 0x72, - 0x64, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, - 0x57, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x5b, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, - 0x6c, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x11, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x1a, 0x60, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, - 0x57, 0x6f, 0x72, 0x64, 0x73, 0x3a, 0x4d, 0x9a, 0xc5, 0x88, 0x1e, 0x48, 0x0a, 0x46, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x57, - 0x6f, 0x72, 0x64, 0x73, 0x3a, 0x3d, 0x9a, 0xc5, 0x88, 0x1e, 0x38, 0x0a, 0x36, 0x65, 0x6e, 0x76, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x55, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x5b, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x1c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x57, 0x69, 0x74, 0x68, 0x55, 0x6e, + 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, + 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0f, + 0x0a, 0x0b, 0x44, 0x52, 0x4f, 0x50, 0x5f, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x02, 0x3a, + 0x2c, 0x9a, 0xc5, 0x88, 0x1e, 0x27, 0x0a, 0x25, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x09, + 0x0a, 0x14, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 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, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x55, 0x72, 0x6c, + 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, + 0x31, 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, + 0x48, 0x74, 0x74, 0x70, 0x31, 0x30, 0x12, 0x36, 0x0a, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, + 0x31, 0x30, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x48, 0x6f, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x31, 0x30, 0x12, 0x66, + 0x0a, 0x11, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, + 0x30, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, + 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x12, 0x7a, 0x0a, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 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, 0x42, 0x6f, 0x6f, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x27, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4f, 0x6e, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, + 0x18, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x71, 0x75, 0x61, 0x6c, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x73, 0x65, 0x6e, 0x64, 0x46, 0x75, 0x6c, 0x6c, 0x79, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x4e, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x5f, 0x62, 0x61, + 0x6c, 0x73, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, 0xd2, 0xc6, + 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x52, 0x0e, 0x75, 0x73, 0x65, 0x42, 0x61, 0x6c, 0x73, 0x61, + 0x50, 0x61, 0x72, 0x73, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x42, 0x08, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x52, 0x12, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x73, 0x1a, 0x9f, 0x03, 0x0a, 0x0f, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x78, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x5f, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x4a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x48, 0x00, 0x52, + 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x64, 0x73, + 0x12, 0x5b, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x74, 0x65, 0x66, 0x75, 0x6c, 0x5f, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x11, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x66, 0x75, 0x6c, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x1a, 0x60, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x64, 0x73, + 0x3a, 0x4d, 0x9a, 0xc5, 0x88, 0x1e, 0x48, 0x0a, 0x46, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x31, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x43, 0x61, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x64, 0x73, 0x3a, + 0x3d, 0x9a, 0xc5, 0x88, 0x1e, 0x38, 0x0a, 0x36, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x14, + 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, + 0x03, 0xf8, 0x42, 0x01, 0x3a, 0x2d, 0x9a, 0xc5, 0x88, 0x1e, 0x28, 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x42, 0x14, 0x0a, 0x0d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x3a, 0x2d, 0x9a, 0xc5, 0x88, 0x1e, 0x28, - 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc1, 0x02, 0x0a, 0x11, 0x4b, 0x65, 0x65, - 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, - 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, - 0xaa, 0x01, 0x06, 0x32, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x12, 0x43, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x0e, 0xfa, 0x42, 0x0b, 0xaa, 0x01, 0x08, 0x08, 0x01, 0x32, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, - 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x0f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x5f, 0x6a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, - 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x61, 0x0a, 0x18, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, + 0x6f, 0x6e, 0x73, 0x22, 0xc1, 0x02, 0x0a, 0x11, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x08, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x32, 0x04, - 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x16, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xd0, 0x0e, 0x0a, - 0x14, 0x48, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x10, 0x68, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x43, + 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0xaa, + 0x01, 0x08, 0x08, 0x01, 0x32, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x3f, 0x0a, 0x0f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x5f, + 0x6a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, + 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x4a, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x12, 0x61, 0x0a, 0x18, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x32, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, + 0x16, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x6c, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xd0, 0x0e, 0x0a, 0x14, 0x48, 0x74, 0x74, 0x70, + 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x46, 0x0a, 0x10, 0x68, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x68, 0x70, 0x61, 0x63, 0x6b, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0d, 0xfa, 0x42, 0x0a, 0x2a, 0x08, 0x18, 0xff, 0xff, + 0xff, 0xff, 0x07, 0x28, 0x01, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x6a, 0x0a, 0x1a, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x68, - 0x70, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x61, 0x0a, - 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0d, 0xfa, 0x42, 0x0a, - 0x2a, 0x08, 0x18, 0xff, 0xff, 0xff, 0xff, 0x07, 0x28, 0x01, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x43, - 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, - 0x12, 0x6a, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x42, 0x0f, 0xfa, 0x42, 0x0c, 0x2a, 0x0a, 0x18, 0xff, 0xff, 0xff, 0xff, 0x07, 0x28, - 0xff, 0xff, 0x03, 0x52, 0x17, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x72, 0x0a, 0x1e, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, + 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0f, 0xfa, + 0x42, 0x0c, 0x2a, 0x0a, 0x18, 0xff, 0xff, 0xff, 0xff, 0x07, 0x28, 0xff, 0xff, 0x03, 0x52, 0x17, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x72, 0x0a, 0x1e, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0f, 0xfa, + 0x42, 0x0c, 0x2a, 0x0a, 0x18, 0xff, 0xff, 0xff, 0xff, 0x07, 0x28, 0xff, 0xff, 0x03, 0x52, 0x1b, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x55, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x42, 0x0f, 0xfa, 0x42, 0x0c, 0x2a, 0x0a, 0x18, 0xff, 0xff, 0xff, 0xff, 0x07, 0x28, - 0xff, 0xff, 0x03, 0x52, 0x1b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x55, 0x0a, 0x13, - 0x6d, 0x61, 0x78, 0x5f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, - 0x52, 0x11, 0x6d, 0x61, 0x78, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x73, 0x12, 0x64, 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x6f, 0x75, 0x74, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, - 0x18, 0x6d, 0x61, 0x78, 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x31, 0x6d, 0x61, - 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x77, 0x69, 0x74, - 0x68, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x2b, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x76, 0x65, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x57, 0x69, 0x74, 0x68, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x6f, 0x0a, 0x26, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, 0x11, 0x6d, 0x61, 0x78, + 0x4f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x64, + 0x0a, 0x1b, 0x6d, 0x61, 0x78, 0x5f, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x4f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x31, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, + 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x21, - 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x91, 0x01, 0x0a, 0x34, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x66, 0x72, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x2b, + 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x6f, 0x0a, 0x26, 0x6d, + 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x21, 0x6d, 0x61, 0x78, 0x49, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x91, 0x01, 0x0a, + 0x34, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, + 0x28, 0x01, 0x52, 0x2c, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x57, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, + 0x50, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x6e, 0x74, + 0x12, 0x5e, 0x0a, 0x26, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x5f, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x21, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4f, 0x6e, 0x49, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, + 0x12, 0x7a, 0x0a, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x27, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4f, 0x6e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x7a, 0x0a, 0x1a, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x18, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5a, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x4b, 0x65, + 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x65, 0x70, 0x61, + 0x6c, 0x69, 0x76, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x5f, 0x6f, 0x67, 0x68, 0x74, + 0x74, 0x70, 0x32, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, 0xd2, 0xc6, 0xa4, + 0xe1, 0x06, 0x02, 0x08, 0x01, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x4f, 0x67, 0x68, 0x74, 0x74, 0x70, + 0x32, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x1a, 0xe2, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x0a, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, 0x2c, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x53, 0x65, 0x6e, 0x74, 0x12, 0x5e, 0x0a, 0x26, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x08, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, - 0x2e, 0x30, 0x52, 0x21, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4f, - 0x6e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x7a, 0x0a, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6f, - 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, - 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x27, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, - 0x64, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4f, 0x6e, 0x49, - 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x7a, 0x0a, 0x1a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, - 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x52, 0x18, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5a, 0x0a, - 0x14, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x65, 0x70, - 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x6e, + 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x10, + 0xfa, 0x42, 0x0d, 0x2a, 0x06, 0x18, 0xff, 0xff, 0x03, 0x28, 0x00, 0x8a, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x3f, 0x9a, 0xc5, 0x88, 0x1e, + 0x3a, 0x0a, 0x38, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x3a, 0x2d, 0x9a, 0xc5, 0x88, + 0x1e, 0x28, 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x13, 0x47, + 0x72, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x60, 0x0a, 0x16, 0x68, 0x74, 0x74, 0x70, 0x32, 0x5f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x14, + 0x68, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x2c, 0x9a, 0xc5, 0x88, 0x1e, 0x27, 0x0a, 0x25, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x47, + 0x72, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0xd8, 0x02, 0x0a, 0x14, 0x48, 0x74, 0x74, 0x70, 0x33, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5d, 0x0a, 0x15, 0x71, + 0x75, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x33, 0x2e, 0x51, 0x75, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x71, 0x75, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7a, 0x0a, 0x2d, 0x6f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x5f, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, + 0x74, 0x74, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 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, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x27, 0x6f, + 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x4f, 0x6e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x48, 0x74, 0x74, 0x70, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x08, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, + 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x9b, 0x01, + 0x0a, 0x1a, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x13, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0xfa, 0x42, 0x0f, 0x72, 0x0d, + 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x52, 0x05, 0x68, 0x74, 0x74, 0x70, 0x73, 0x48, 0x00, 0x52, + 0x11, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x54, 0x6f, 0x4f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x75, 0x70, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x10, 0x0a, 0x0e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x81, 0x01, 0x0a, 0x22, + 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x33, 0x2e, 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4b, 0x65, 0x65, 0x70, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x75, 0x73, 0x65, - 0x5f, 0x6f, 0x67, 0x68, 0x74, 0x74, 0x70, 0x32, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x42, 0x08, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x4f, - 0x67, 0x68, 0x74, 0x74, 0x70, 0x32, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x1a, 0xe2, 0x01, 0x0a, 0x11, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x12, 0x4e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x42, 0x10, 0xfa, 0x42, 0x0d, 0x2a, 0x06, 0x18, 0xff, 0xff, 0x03, 0x28, 0x00, - 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x12, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x3f, 0x9a, 0xc5, 0x88, 0x1e, 0x3a, 0x0a, 0x38, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x3a, 0x2d, 0x9a, 0xc5, 0x88, 0x1e, 0x28, 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0xa5, 0x01, 0x0a, 0x13, 0x47, 0x72, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x60, 0x0a, 0x16, 0x68, 0x74, 0x74, 0x70, 0x32, - 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, - 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x14, 0x68, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x2c, 0x9a, 0xc5, 0x88, 0x1e, 0x27, - 0x0a, 0x25, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd8, 0x02, 0x0a, 0x14, 0x48, 0x74, 0x74, 0x70, - 0x33, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x5d, 0x0a, 0x15, 0x71, 0x75, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x51, 0x75, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x71, 0x75, 0x69, 0x63, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x7a, 0x0a, 0x2d, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 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, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x27, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4f, 0x6e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x16, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x08, 0xd2, 0xc6, 0xa4, - 0xe1, 0x06, 0x02, 0x08, 0x01, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x9b, 0x01, 0x0a, 0x1a, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x44, 0x0a, 0x13, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, - 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, - 0xfa, 0x42, 0x0f, 0x72, 0x0d, 0x52, 0x04, 0x68, 0x74, 0x74, 0x70, 0x52, 0x05, 0x68, 0x74, 0x74, - 0x70, 0x73, 0x48, 0x00, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x54, 0x6f, 0x4f, 0x76, - 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x42, 0x10, - 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x81, 0x01, 0x0a, 0x22, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x42, 0x0d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, - 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x76, 0x33, 0x3b, 0x63, 0x6f, 0x72, 0x65, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, - 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x33, 0x42, 0x0d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, + 0x3b, 0x63, 0x6f, 0x72, 0x65, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2172,9 +2219,10 @@ var file_envoy_config_core_v3_protocol_proto_goTypes = []interface{}{ (*Http2ProtocolOptions_SettingsParameter)(nil), // 16: envoy.config.core.v3.Http2ProtocolOptions.SettingsParameter (*durationpb.Duration)(nil), // 17: google.protobuf.Duration (*wrapperspb.UInt32Value)(nil), // 18: google.protobuf.UInt32Value - (*TypedExtensionConfig)(nil), // 19: envoy.config.core.v3.TypedExtensionConfig - (*wrapperspb.BoolValue)(nil), // 20: google.protobuf.BoolValue - (*v3.Percent)(nil), // 21: envoy.type.v3.Percent + (*wrapperspb.UInt64Value)(nil), // 19: google.protobuf.UInt64Value + (*TypedExtensionConfig)(nil), // 20: envoy.config.core.v3.TypedExtensionConfig + (*wrapperspb.BoolValue)(nil), // 21: google.protobuf.BoolValue + (*v3.Percent)(nil), // 22: envoy.type.v3.Percent } var file_envoy_config_core_v3_protocol_proto_depIdxs = []int32{ 17, // 0: envoy.config.core.v3.QuicKeepAliveSettings.max_interval:type_name -> google.protobuf.Duration @@ -2185,48 +2233,50 @@ var file_envoy_config_core_v3_protocol_proto_depIdxs = []int32{ 18, // 5: envoy.config.core.v3.QuicProtocolOptions.num_timeouts_to_trigger_port_migration:type_name -> google.protobuf.UInt32Value 2, // 6: envoy.config.core.v3.QuicProtocolOptions.connection_keepalive:type_name -> envoy.config.core.v3.QuicKeepAliveSettings 17, // 7: envoy.config.core.v3.QuicProtocolOptions.idle_network_timeout:type_name -> google.protobuf.Duration - 18, // 8: envoy.config.core.v3.AlternateProtocolsCacheOptions.max_entries:type_name -> google.protobuf.UInt32Value - 19, // 9: envoy.config.core.v3.AlternateProtocolsCacheOptions.key_value_store_config:type_name -> envoy.config.core.v3.TypedExtensionConfig - 13, // 10: envoy.config.core.v3.AlternateProtocolsCacheOptions.prepopulated_entries:type_name -> envoy.config.core.v3.AlternateProtocolsCacheOptions.AlternateProtocolsCacheEntry - 17, // 11: envoy.config.core.v3.HttpProtocolOptions.idle_timeout:type_name -> google.protobuf.Duration - 17, // 12: envoy.config.core.v3.HttpProtocolOptions.max_connection_duration:type_name -> google.protobuf.Duration - 18, // 13: envoy.config.core.v3.HttpProtocolOptions.max_headers_count:type_name -> google.protobuf.UInt32Value - 17, // 14: envoy.config.core.v3.HttpProtocolOptions.max_stream_duration:type_name -> google.protobuf.Duration - 0, // 15: envoy.config.core.v3.HttpProtocolOptions.headers_with_underscores_action:type_name -> envoy.config.core.v3.HttpProtocolOptions.HeadersWithUnderscoresAction - 18, // 16: envoy.config.core.v3.HttpProtocolOptions.max_requests_per_connection:type_name -> google.protobuf.UInt32Value - 20, // 17: envoy.config.core.v3.Http1ProtocolOptions.allow_absolute_url:type_name -> google.protobuf.BoolValue - 14, // 18: envoy.config.core.v3.Http1ProtocolOptions.header_key_format:type_name -> envoy.config.core.v3.Http1ProtocolOptions.HeaderKeyFormat - 20, // 19: envoy.config.core.v3.Http1ProtocolOptions.override_stream_error_on_invalid_http_message:type_name -> google.protobuf.BoolValue - 20, // 20: envoy.config.core.v3.Http1ProtocolOptions.use_balsa_parser:type_name -> google.protobuf.BoolValue - 17, // 21: envoy.config.core.v3.KeepaliveSettings.interval:type_name -> google.protobuf.Duration - 17, // 22: envoy.config.core.v3.KeepaliveSettings.timeout:type_name -> google.protobuf.Duration - 21, // 23: envoy.config.core.v3.KeepaliveSettings.interval_jitter:type_name -> envoy.type.v3.Percent - 17, // 24: envoy.config.core.v3.KeepaliveSettings.connection_idle_interval:type_name -> google.protobuf.Duration - 18, // 25: envoy.config.core.v3.Http2ProtocolOptions.hpack_table_size:type_name -> google.protobuf.UInt32Value - 18, // 26: envoy.config.core.v3.Http2ProtocolOptions.max_concurrent_streams:type_name -> google.protobuf.UInt32Value - 18, // 27: envoy.config.core.v3.Http2ProtocolOptions.initial_stream_window_size:type_name -> google.protobuf.UInt32Value - 18, // 28: envoy.config.core.v3.Http2ProtocolOptions.initial_connection_window_size:type_name -> google.protobuf.UInt32Value - 18, // 29: envoy.config.core.v3.Http2ProtocolOptions.max_outbound_frames:type_name -> google.protobuf.UInt32Value - 18, // 30: envoy.config.core.v3.Http2ProtocolOptions.max_outbound_control_frames:type_name -> google.protobuf.UInt32Value - 18, // 31: envoy.config.core.v3.Http2ProtocolOptions.max_consecutive_inbound_frames_with_empty_payload:type_name -> google.protobuf.UInt32Value - 18, // 32: envoy.config.core.v3.Http2ProtocolOptions.max_inbound_priority_frames_per_stream:type_name -> google.protobuf.UInt32Value - 18, // 33: envoy.config.core.v3.Http2ProtocolOptions.max_inbound_window_update_frames_per_data_frame_sent:type_name -> google.protobuf.UInt32Value - 20, // 34: envoy.config.core.v3.Http2ProtocolOptions.override_stream_error_on_invalid_http_message:type_name -> google.protobuf.BoolValue - 16, // 35: envoy.config.core.v3.Http2ProtocolOptions.custom_settings_parameters:type_name -> envoy.config.core.v3.Http2ProtocolOptions.SettingsParameter - 8, // 36: envoy.config.core.v3.Http2ProtocolOptions.connection_keepalive:type_name -> envoy.config.core.v3.KeepaliveSettings - 20, // 37: envoy.config.core.v3.Http2ProtocolOptions.use_oghttp2_codec:type_name -> google.protobuf.BoolValue - 9, // 38: envoy.config.core.v3.GrpcProtocolOptions.http2_protocol_options:type_name -> envoy.config.core.v3.Http2ProtocolOptions - 3, // 39: envoy.config.core.v3.Http3ProtocolOptions.quic_protocol_options:type_name -> envoy.config.core.v3.QuicProtocolOptions - 20, // 40: envoy.config.core.v3.Http3ProtocolOptions.override_stream_error_on_invalid_http_message:type_name -> google.protobuf.BoolValue - 15, // 41: envoy.config.core.v3.Http1ProtocolOptions.HeaderKeyFormat.proper_case_words:type_name -> envoy.config.core.v3.Http1ProtocolOptions.HeaderKeyFormat.ProperCaseWords - 19, // 42: envoy.config.core.v3.Http1ProtocolOptions.HeaderKeyFormat.stateful_formatter:type_name -> envoy.config.core.v3.TypedExtensionConfig - 18, // 43: envoy.config.core.v3.Http2ProtocolOptions.SettingsParameter.identifier:type_name -> google.protobuf.UInt32Value - 18, // 44: envoy.config.core.v3.Http2ProtocolOptions.SettingsParameter.value:type_name -> google.protobuf.UInt32Value - 45, // [45:45] is the sub-list for method output_type - 45, // [45:45] is the sub-list for method input_type - 45, // [45:45] is the sub-list for extension type_name - 45, // [45:45] is the sub-list for extension extendee - 0, // [0:45] is the sub-list for field type_name + 19, // 8: envoy.config.core.v3.QuicProtocolOptions.max_packet_length:type_name -> google.protobuf.UInt64Value + 18, // 9: envoy.config.core.v3.AlternateProtocolsCacheOptions.max_entries:type_name -> google.protobuf.UInt32Value + 20, // 10: envoy.config.core.v3.AlternateProtocolsCacheOptions.key_value_store_config:type_name -> envoy.config.core.v3.TypedExtensionConfig + 13, // 11: envoy.config.core.v3.AlternateProtocolsCacheOptions.prepopulated_entries:type_name -> envoy.config.core.v3.AlternateProtocolsCacheOptions.AlternateProtocolsCacheEntry + 17, // 12: envoy.config.core.v3.HttpProtocolOptions.idle_timeout:type_name -> google.protobuf.Duration + 17, // 13: envoy.config.core.v3.HttpProtocolOptions.max_connection_duration:type_name -> google.protobuf.Duration + 18, // 14: envoy.config.core.v3.HttpProtocolOptions.max_headers_count:type_name -> google.protobuf.UInt32Value + 18, // 15: envoy.config.core.v3.HttpProtocolOptions.max_response_headers_kb:type_name -> google.protobuf.UInt32Value + 17, // 16: envoy.config.core.v3.HttpProtocolOptions.max_stream_duration:type_name -> google.protobuf.Duration + 0, // 17: envoy.config.core.v3.HttpProtocolOptions.headers_with_underscores_action:type_name -> envoy.config.core.v3.HttpProtocolOptions.HeadersWithUnderscoresAction + 18, // 18: envoy.config.core.v3.HttpProtocolOptions.max_requests_per_connection:type_name -> google.protobuf.UInt32Value + 21, // 19: envoy.config.core.v3.Http1ProtocolOptions.allow_absolute_url:type_name -> google.protobuf.BoolValue + 14, // 20: envoy.config.core.v3.Http1ProtocolOptions.header_key_format:type_name -> envoy.config.core.v3.Http1ProtocolOptions.HeaderKeyFormat + 21, // 21: envoy.config.core.v3.Http1ProtocolOptions.override_stream_error_on_invalid_http_message:type_name -> google.protobuf.BoolValue + 21, // 22: envoy.config.core.v3.Http1ProtocolOptions.use_balsa_parser:type_name -> google.protobuf.BoolValue + 17, // 23: envoy.config.core.v3.KeepaliveSettings.interval:type_name -> google.protobuf.Duration + 17, // 24: envoy.config.core.v3.KeepaliveSettings.timeout:type_name -> google.protobuf.Duration + 22, // 25: envoy.config.core.v3.KeepaliveSettings.interval_jitter:type_name -> envoy.type.v3.Percent + 17, // 26: envoy.config.core.v3.KeepaliveSettings.connection_idle_interval:type_name -> google.protobuf.Duration + 18, // 27: envoy.config.core.v3.Http2ProtocolOptions.hpack_table_size:type_name -> google.protobuf.UInt32Value + 18, // 28: envoy.config.core.v3.Http2ProtocolOptions.max_concurrent_streams:type_name -> google.protobuf.UInt32Value + 18, // 29: envoy.config.core.v3.Http2ProtocolOptions.initial_stream_window_size:type_name -> google.protobuf.UInt32Value + 18, // 30: envoy.config.core.v3.Http2ProtocolOptions.initial_connection_window_size:type_name -> google.protobuf.UInt32Value + 18, // 31: envoy.config.core.v3.Http2ProtocolOptions.max_outbound_frames:type_name -> google.protobuf.UInt32Value + 18, // 32: envoy.config.core.v3.Http2ProtocolOptions.max_outbound_control_frames:type_name -> google.protobuf.UInt32Value + 18, // 33: envoy.config.core.v3.Http2ProtocolOptions.max_consecutive_inbound_frames_with_empty_payload:type_name -> google.protobuf.UInt32Value + 18, // 34: envoy.config.core.v3.Http2ProtocolOptions.max_inbound_priority_frames_per_stream:type_name -> google.protobuf.UInt32Value + 18, // 35: envoy.config.core.v3.Http2ProtocolOptions.max_inbound_window_update_frames_per_data_frame_sent:type_name -> google.protobuf.UInt32Value + 21, // 36: envoy.config.core.v3.Http2ProtocolOptions.override_stream_error_on_invalid_http_message:type_name -> google.protobuf.BoolValue + 16, // 37: envoy.config.core.v3.Http2ProtocolOptions.custom_settings_parameters:type_name -> envoy.config.core.v3.Http2ProtocolOptions.SettingsParameter + 8, // 38: envoy.config.core.v3.Http2ProtocolOptions.connection_keepalive:type_name -> envoy.config.core.v3.KeepaliveSettings + 21, // 39: envoy.config.core.v3.Http2ProtocolOptions.use_oghttp2_codec:type_name -> google.protobuf.BoolValue + 9, // 40: envoy.config.core.v3.GrpcProtocolOptions.http2_protocol_options:type_name -> envoy.config.core.v3.Http2ProtocolOptions + 3, // 41: envoy.config.core.v3.Http3ProtocolOptions.quic_protocol_options:type_name -> envoy.config.core.v3.QuicProtocolOptions + 21, // 42: envoy.config.core.v3.Http3ProtocolOptions.override_stream_error_on_invalid_http_message:type_name -> google.protobuf.BoolValue + 15, // 43: envoy.config.core.v3.Http1ProtocolOptions.HeaderKeyFormat.proper_case_words:type_name -> envoy.config.core.v3.Http1ProtocolOptions.HeaderKeyFormat.ProperCaseWords + 20, // 44: envoy.config.core.v3.Http1ProtocolOptions.HeaderKeyFormat.stateful_formatter:type_name -> envoy.config.core.v3.TypedExtensionConfig + 18, // 45: envoy.config.core.v3.Http2ProtocolOptions.SettingsParameter.identifier:type_name -> google.protobuf.UInt32Value + 18, // 46: envoy.config.core.v3.Http2ProtocolOptions.SettingsParameter.value:type_name -> google.protobuf.UInt32Value + 47, // [47:47] is the sub-list for method output_type + 47, // [47:47] is the sub-list for method input_type + 47, // [47:47] is the sub-list for extension type_name + 47, // [47:47] is the sub-list for extension extendee + 0, // [0:47] is the sub-list for field type_name } func init() { file_envoy_config_core_v3_protocol_proto_init() } diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/protocol.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/protocol.pb.validate.go index 1a5df5b8d2..0db8d00b42 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/protocol.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/protocol.pb.validate.go @@ -447,6 +447,35 @@ func (m *QuicProtocolOptions) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetMaxPacketLength()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, QuicProtocolOptionsValidationError{ + field: "MaxPacketLength", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, QuicProtocolOptionsValidationError{ + field: "MaxPacketLength", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMaxPacketLength()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return QuicProtocolOptionsValidationError{ + field: "MaxPacketLength", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return QuicProtocolOptionsMultiError(errors) } @@ -938,6 +967,21 @@ func (m *HttpProtocolOptions) validate(all bool) error { } + if wrapper := m.GetMaxResponseHeadersKb(); wrapper != nil { + + if val := wrapper.GetValue(); val <= 0 || val > 8192 { + err := HttpProtocolOptionsValidationError{ + field: "MaxResponseHeadersKb", + reason: "value must be inside range (0, 8192]", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + if all { switch v := interface{}(m.GetMaxStreamDuration()).(type) { case interface{ ValidateAll() error }: diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_cmsg_headers.pb.go b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_cmsg_headers.pb.go new file mode 100644 index 0000000000..29baf907a7 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_cmsg_headers.pb.go @@ -0,0 +1,195 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/config/core/v3/socket_cmsg_headers.proto + +package corev3 + +import ( + _ "github.com/cncf/xds/go/udpa/annotations" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Configuration for socket cmsg headers. +// See `:ref:CMSG `_ for further information. +type SocketCmsgHeaders struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // cmsg level. Default is unset. + Level *wrapperspb.UInt32Value `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"` + // cmsg type. Default is unset. + Type *wrapperspb.UInt32Value `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + // Expected size of cmsg value. Default is zero. + ExpectedSize uint32 `protobuf:"varint,3,opt,name=expected_size,json=expectedSize,proto3" json:"expected_size,omitempty"` +} + +func (x *SocketCmsgHeaders) Reset() { + *x = SocketCmsgHeaders{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_config_core_v3_socket_cmsg_headers_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SocketCmsgHeaders) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SocketCmsgHeaders) ProtoMessage() {} + +func (x *SocketCmsgHeaders) ProtoReflect() protoreflect.Message { + mi := &file_envoy_config_core_v3_socket_cmsg_headers_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SocketCmsgHeaders.ProtoReflect.Descriptor instead. +func (*SocketCmsgHeaders) Descriptor() ([]byte, []int) { + return file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDescGZIP(), []int{0} +} + +func (x *SocketCmsgHeaders) GetLevel() *wrapperspb.UInt32Value { + if x != nil { + return x.Level + } + return nil +} + +func (x *SocketCmsgHeaders) GetType() *wrapperspb.UInt32Value { + if x != nil { + return x.Type + } + return nil +} + +func (x *SocketCmsgHeaders) GetExpectedSize() uint32 { + if x != nil { + return x.ExpectedSize + } + return 0 +} + +var File_envoy_config_core_v3_socket_cmsg_headers_proto protoreflect.FileDescriptor + +var file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6d, + 0x73, 0x67, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x14, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x01, 0x0a, 0x11, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x43, 0x6d, 0x73, 0x67, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, + 0x30, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x8a, 0x01, 0x0a, 0x22, 0x69, 0x6f, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x42, 0x16, 0x53, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6d, 0x73, 0x67, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, + 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x76, 0x33, 0x3b, 0x63, 0x6f, 0x72, 0x65, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, + 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDescOnce sync.Once + file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDescData = file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDesc +) + +func file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDescGZIP() []byte { + file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDescOnce.Do(func() { + file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDescData) + }) + return file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDescData +} + +var file_envoy_config_core_v3_socket_cmsg_headers_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_envoy_config_core_v3_socket_cmsg_headers_proto_goTypes = []interface{}{ + (*SocketCmsgHeaders)(nil), // 0: envoy.config.core.v3.SocketCmsgHeaders + (*wrapperspb.UInt32Value)(nil), // 1: google.protobuf.UInt32Value +} +var file_envoy_config_core_v3_socket_cmsg_headers_proto_depIdxs = []int32{ + 1, // 0: envoy.config.core.v3.SocketCmsgHeaders.level:type_name -> google.protobuf.UInt32Value + 1, // 1: envoy.config.core.v3.SocketCmsgHeaders.type:type_name -> google.protobuf.UInt32Value + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_envoy_config_core_v3_socket_cmsg_headers_proto_init() } +func file_envoy_config_core_v3_socket_cmsg_headers_proto_init() { + if File_envoy_config_core_v3_socket_cmsg_headers_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_config_core_v3_socket_cmsg_headers_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SocketCmsgHeaders); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_config_core_v3_socket_cmsg_headers_proto_goTypes, + DependencyIndexes: file_envoy_config_core_v3_socket_cmsg_headers_proto_depIdxs, + MessageInfos: file_envoy_config_core_v3_socket_cmsg_headers_proto_msgTypes, + }.Build() + File_envoy_config_core_v3_socket_cmsg_headers_proto = out.File + file_envoy_config_core_v3_socket_cmsg_headers_proto_rawDesc = nil + file_envoy_config_core_v3_socket_cmsg_headers_proto_goTypes = nil + file_envoy_config_core_v3_socket_cmsg_headers_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_cmsg_headers.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_cmsg_headers.pb.validate.go new file mode 100644 index 0000000000..d88c337e21 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_cmsg_headers.pb.validate.go @@ -0,0 +1,198 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/config/core/v3/socket_cmsg_headers.proto + +package corev3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on SocketCmsgHeaders with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *SocketCmsgHeaders) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SocketCmsgHeaders with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// SocketCmsgHeadersMultiError, or nil if none found. +func (m *SocketCmsgHeaders) ValidateAll() error { + return m.validate(true) +} + +func (m *SocketCmsgHeaders) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetLevel()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SocketCmsgHeadersValidationError{ + field: "Level", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SocketCmsgHeadersValidationError{ + field: "Level", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetLevel()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SocketCmsgHeadersValidationError{ + field: "Level", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetType()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SocketCmsgHeadersValidationError{ + field: "Type", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SocketCmsgHeadersValidationError{ + field: "Type", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetType()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SocketCmsgHeadersValidationError{ + field: "Type", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for ExpectedSize + + if len(errors) > 0 { + return SocketCmsgHeadersMultiError(errors) + } + + return nil +} + +// SocketCmsgHeadersMultiError is an error wrapping multiple validation errors +// returned by SocketCmsgHeaders.ValidateAll() if the designated constraints +// aren't met. +type SocketCmsgHeadersMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SocketCmsgHeadersMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m SocketCmsgHeadersMultiError) AllErrors() []error { return m } + +// SocketCmsgHeadersValidationError is the validation error returned by +// SocketCmsgHeaders.Validate if the designated constraints aren't met. +type SocketCmsgHeadersValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SocketCmsgHeadersValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SocketCmsgHeadersValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SocketCmsgHeadersValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SocketCmsgHeadersValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SocketCmsgHeadersValidationError) ErrorName() string { + return "SocketCmsgHeadersValidationError" +} + +// Error satisfies the builtin error interface +func (e SocketCmsgHeadersValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sSocketCmsgHeaders.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SocketCmsgHeadersValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SocketCmsgHeadersValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_option.pb.go b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_option.pb.go index 56f9132012..3b7d7f832d 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_option.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_option.pb.go @@ -101,7 +101,7 @@ func (SocketOption_SocketState) EnumDescriptor() ([]byte, []int) { // :ref:`admin's ` socket_options etc. // // It should be noted that the name or level may have different values on different platforms. -// [#next-free-field: 7] +// [#next-free-field: 8] type SocketOption struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -122,6 +122,9 @@ type SocketOption struct { // The state in which the option will be applied. When used in BindConfig // STATE_PREBIND is currently the only valid value. State SocketOption_SocketState `protobuf:"varint,6,opt,name=state,proto3,enum=envoy.config.core.v3.SocketOption_SocketState" json:"state,omitempty"` + // Apply the socket option to the specified `socket type `_. + // If not specified, the socket option will be applied to all socket types. + Type *SocketOption_SocketType `protobuf:"bytes,7,opt,name=type,proto3" json:"type,omitempty"` } func (x *SocketOption) Reset() { @@ -205,6 +208,13 @@ func (x *SocketOption) GetState() SocketOption_SocketState { return SocketOption_STATE_PREBIND } +func (x *SocketOption) GetType() *SocketOption_SocketType { + if x != nil { + return x.Type + } + return nil +} + type isSocketOption_Value interface { isSocketOption_Value() } @@ -270,6 +280,148 @@ func (x *SocketOptionsOverride) GetSocketOptions() []*SocketOption { return nil } +// The `socket type `_ to apply the socket option to. +// Only one field should be set. If multiple fields are set, the precedence order will determine +// the selected one. If none of the fields is set, the socket option will be applied to all socket types. +// +// For example: +// If :ref:`stream ` is set, +// it takes precedence over :ref:`datagram `. +type SocketOption_SocketType struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Apply the socket option to the stream socket type. + Stream *SocketOption_SocketType_Stream `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` + // Apply the socket option to the datagram socket type. + Datagram *SocketOption_SocketType_Datagram `protobuf:"bytes,2,opt,name=datagram,proto3" json:"datagram,omitempty"` +} + +func (x *SocketOption_SocketType) Reset() { + *x = SocketOption_SocketType{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_config_core_v3_socket_option_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SocketOption_SocketType) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SocketOption_SocketType) ProtoMessage() {} + +func (x *SocketOption_SocketType) ProtoReflect() protoreflect.Message { + mi := &file_envoy_config_core_v3_socket_option_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SocketOption_SocketType.ProtoReflect.Descriptor instead. +func (*SocketOption_SocketType) Descriptor() ([]byte, []int) { + return file_envoy_config_core_v3_socket_option_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *SocketOption_SocketType) GetStream() *SocketOption_SocketType_Stream { + if x != nil { + return x.Stream + } + return nil +} + +func (x *SocketOption_SocketType) GetDatagram() *SocketOption_SocketType_Datagram { + if x != nil { + return x.Datagram + } + return nil +} + +// The stream socket type. +type SocketOption_SocketType_Stream struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SocketOption_SocketType_Stream) Reset() { + *x = SocketOption_SocketType_Stream{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_config_core_v3_socket_option_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SocketOption_SocketType_Stream) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SocketOption_SocketType_Stream) ProtoMessage() {} + +func (x *SocketOption_SocketType_Stream) ProtoReflect() protoreflect.Message { + mi := &file_envoy_config_core_v3_socket_option_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SocketOption_SocketType_Stream.ProtoReflect.Descriptor instead. +func (*SocketOption_SocketType_Stream) Descriptor() ([]byte, []int) { + return file_envoy_config_core_v3_socket_option_proto_rawDescGZIP(), []int{0, 0, 0} +} + +// The datagram socket type. +type SocketOption_SocketType_Datagram struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SocketOption_SocketType_Datagram) Reset() { + *x = SocketOption_SocketType_Datagram{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_config_core_v3_socket_option_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SocketOption_SocketType_Datagram) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SocketOption_SocketType_Datagram) ProtoMessage() {} + +func (x *SocketOption_SocketType_Datagram) ProtoReflect() protoreflect.Message { + mi := &file_envoy_config_core_v3_socket_option_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SocketOption_SocketType_Datagram.ProtoReflect.Descriptor instead. +func (*SocketOption_SocketType_Datagram) Descriptor() ([]byte, []int) { + return file_envoy_config_core_v3_socket_option_proto_rawDescGZIP(), []int{0, 0, 1} +} + var File_envoy_config_core_v3_socket_option_proto protoreflect.FileDescriptor var file_envoy_config_core_v3_socket_option_proto_rawDesc = []byte{ @@ -282,7 +434,7 @@ var file_envoy_config_core_v3_socket_option_proto_rawDesc = []byte{ 0x21, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x02, 0x0a, 0x0c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xef, 0x04, 0x0a, 0x0c, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, @@ -297,30 +449,47 @@ var file_envoy_config_core_v3_socket_option_proto_rawDesc = []byte{ 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x46, 0x0a, 0x0b, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, - 0x52, 0x45, 0x42, 0x49, 0x4e, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x3a, 0x25, - 0x9a, 0xc5, 0x88, 0x1e, 0x20, 0x0a, 0x1e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x03, - 0xf8, 0x42, 0x01, 0x22, 0x62, 0x0a, 0x15, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x49, 0x0a, 0x0e, - 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x85, 0x01, 0x0a, 0x22, 0x69, 0x6f, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x42, 0x11, - 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, - 0x3b, 0x63, 0x6f, 0x72, 0x65, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x1a, 0xc4, 0x01, 0x0a, 0x0a, 0x53, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4c, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x06, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x52, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x67, 0x72, + 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, + 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x67, 0x72, 0x61, 0x6d, + 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x67, 0x72, 0x61, 0x6d, 0x1a, 0x08, 0x0a, 0x06, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x1a, 0x0a, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x67, 0x72, 0x61, 0x6d, + 0x22, 0x46, 0x0a, 0x0b, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x42, 0x49, 0x4e, 0x44, + 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x4f, 0x55, 0x4e, + 0x44, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x49, 0x53, + 0x54, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x3a, 0x25, 0x9a, 0xc5, 0x88, 0x1e, 0x20, 0x0a, + 0x1e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x0c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, 0x62, 0x0a, + 0x15, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x76, + 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x49, 0x0a, 0x0e, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0x85, 0x01, 0x0a, 0x22, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x42, 0x11, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x3b, 0x63, 0x6f, 0x72, 0x65, 0x76, + 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -336,20 +505,26 @@ func file_envoy_config_core_v3_socket_option_proto_rawDescGZIP() []byte { } var file_envoy_config_core_v3_socket_option_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_envoy_config_core_v3_socket_option_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_envoy_config_core_v3_socket_option_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_envoy_config_core_v3_socket_option_proto_goTypes = []interface{}{ - (SocketOption_SocketState)(0), // 0: envoy.config.core.v3.SocketOption.SocketState - (*SocketOption)(nil), // 1: envoy.config.core.v3.SocketOption - (*SocketOptionsOverride)(nil), // 2: envoy.config.core.v3.SocketOptionsOverride + (SocketOption_SocketState)(0), // 0: envoy.config.core.v3.SocketOption.SocketState + (*SocketOption)(nil), // 1: envoy.config.core.v3.SocketOption + (*SocketOptionsOverride)(nil), // 2: envoy.config.core.v3.SocketOptionsOverride + (*SocketOption_SocketType)(nil), // 3: envoy.config.core.v3.SocketOption.SocketType + (*SocketOption_SocketType_Stream)(nil), // 4: envoy.config.core.v3.SocketOption.SocketType.Stream + (*SocketOption_SocketType_Datagram)(nil), // 5: envoy.config.core.v3.SocketOption.SocketType.Datagram } var file_envoy_config_core_v3_socket_option_proto_depIdxs = []int32{ 0, // 0: envoy.config.core.v3.SocketOption.state:type_name -> envoy.config.core.v3.SocketOption.SocketState - 1, // 1: envoy.config.core.v3.SocketOptionsOverride.socket_options:type_name -> envoy.config.core.v3.SocketOption - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 3, // 1: envoy.config.core.v3.SocketOption.type:type_name -> envoy.config.core.v3.SocketOption.SocketType + 1, // 2: envoy.config.core.v3.SocketOptionsOverride.socket_options:type_name -> envoy.config.core.v3.SocketOption + 4, // 3: envoy.config.core.v3.SocketOption.SocketType.stream:type_name -> envoy.config.core.v3.SocketOption.SocketType.Stream + 5, // 4: envoy.config.core.v3.SocketOption.SocketType.datagram:type_name -> envoy.config.core.v3.SocketOption.SocketType.Datagram + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_envoy_config_core_v3_socket_option_proto_init() } @@ -382,6 +557,42 @@ func file_envoy_config_core_v3_socket_option_proto_init() { return nil } } + file_envoy_config_core_v3_socket_option_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SocketOption_SocketType); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_config_core_v3_socket_option_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SocketOption_SocketType_Stream); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_config_core_v3_socket_option_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SocketOption_SocketType_Datagram); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_envoy_config_core_v3_socket_option_proto_msgTypes[0].OneofWrappers = []interface{}{ (*SocketOption_IntValue)(nil), @@ -393,7 +604,7 @@ func file_envoy_config_core_v3_socket_option_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_envoy_config_core_v3_socket_option_proto_rawDesc, NumEnums: 1, - NumMessages: 2, + NumMessages: 5, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_option.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_option.pb.validate.go index dc0b53f551..f728136750 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_option.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/config/core/v3/socket_option.pb.validate.go @@ -74,6 +74,35 @@ func (m *SocketOption) validate(all bool) error { errors = append(errors, err) } + if all { + switch v := interface{}(m.GetType()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SocketOptionValidationError{ + field: "Type", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SocketOptionValidationError{ + field: "Type", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetType()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SocketOptionValidationError{ + field: "Type", + reason: "embedded message failed validation", + cause: err, + } + } + } + oneofValuePresent := false switch v := m.Value.(type) { case *SocketOption_IntValue: @@ -328,3 +357,371 @@ var _ interface { Cause() error ErrorName() string } = SocketOptionsOverrideValidationError{} + +// Validate checks the field values on SocketOption_SocketType with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *SocketOption_SocketType) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SocketOption_SocketType with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// SocketOption_SocketTypeMultiError, or nil if none found. +func (m *SocketOption_SocketType) ValidateAll() error { + return m.validate(true) +} + +func (m *SocketOption_SocketType) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetStream()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SocketOption_SocketTypeValidationError{ + field: "Stream", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SocketOption_SocketTypeValidationError{ + field: "Stream", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetStream()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SocketOption_SocketTypeValidationError{ + field: "Stream", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetDatagram()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SocketOption_SocketTypeValidationError{ + field: "Datagram", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SocketOption_SocketTypeValidationError{ + field: "Datagram", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetDatagram()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SocketOption_SocketTypeValidationError{ + field: "Datagram", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return SocketOption_SocketTypeMultiError(errors) + } + + return nil +} + +// SocketOption_SocketTypeMultiError is an error wrapping multiple validation +// errors returned by SocketOption_SocketType.ValidateAll() if the designated +// constraints aren't met. +type SocketOption_SocketTypeMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SocketOption_SocketTypeMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m SocketOption_SocketTypeMultiError) AllErrors() []error { return m } + +// SocketOption_SocketTypeValidationError is the validation error returned by +// SocketOption_SocketType.Validate if the designated constraints aren't met. +type SocketOption_SocketTypeValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SocketOption_SocketTypeValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SocketOption_SocketTypeValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SocketOption_SocketTypeValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SocketOption_SocketTypeValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SocketOption_SocketTypeValidationError) ErrorName() string { + return "SocketOption_SocketTypeValidationError" +} + +// Error satisfies the builtin error interface +func (e SocketOption_SocketTypeValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sSocketOption_SocketType.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SocketOption_SocketTypeValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SocketOption_SocketTypeValidationError{} + +// Validate checks the field values on SocketOption_SocketType_Stream with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *SocketOption_SocketType_Stream) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SocketOption_SocketType_Stream with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// SocketOption_SocketType_StreamMultiError, or nil if none found. +func (m *SocketOption_SocketType_Stream) ValidateAll() error { + return m.validate(true) +} + +func (m *SocketOption_SocketType_Stream) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return SocketOption_SocketType_StreamMultiError(errors) + } + + return nil +} + +// SocketOption_SocketType_StreamMultiError is an error wrapping multiple +// validation errors returned by SocketOption_SocketType_Stream.ValidateAll() +// if the designated constraints aren't met. +type SocketOption_SocketType_StreamMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SocketOption_SocketType_StreamMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m SocketOption_SocketType_StreamMultiError) AllErrors() []error { return m } + +// SocketOption_SocketType_StreamValidationError is the validation error +// returned by SocketOption_SocketType_Stream.Validate if the designated +// constraints aren't met. +type SocketOption_SocketType_StreamValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SocketOption_SocketType_StreamValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SocketOption_SocketType_StreamValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SocketOption_SocketType_StreamValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SocketOption_SocketType_StreamValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SocketOption_SocketType_StreamValidationError) ErrorName() string { + return "SocketOption_SocketType_StreamValidationError" +} + +// Error satisfies the builtin error interface +func (e SocketOption_SocketType_StreamValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sSocketOption_SocketType_Stream.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SocketOption_SocketType_StreamValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SocketOption_SocketType_StreamValidationError{} + +// Validate checks the field values on SocketOption_SocketType_Datagram with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *SocketOption_SocketType_Datagram) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on SocketOption_SocketType_Datagram with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// SocketOption_SocketType_DatagramMultiError, or nil if none found. +func (m *SocketOption_SocketType_Datagram) ValidateAll() error { + return m.validate(true) +} + +func (m *SocketOption_SocketType_Datagram) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return SocketOption_SocketType_DatagramMultiError(errors) + } + + return nil +} + +// SocketOption_SocketType_DatagramMultiError is an error wrapping multiple +// validation errors returned by +// SocketOption_SocketType_Datagram.ValidateAll() if the designated +// constraints aren't met. +type SocketOption_SocketType_DatagramMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SocketOption_SocketType_DatagramMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m SocketOption_SocketType_DatagramMultiError) AllErrors() []error { return m } + +// SocketOption_SocketType_DatagramValidationError is the validation error +// returned by SocketOption_SocketType_Datagram.Validate if the designated +// constraints aren't met. +type SocketOption_SocketType_DatagramValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SocketOption_SocketType_DatagramValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SocketOption_SocketType_DatagramValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SocketOption_SocketType_DatagramValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SocketOption_SocketType_DatagramValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SocketOption_SocketType_DatagramValidationError) ErrorName() string { + return "SocketOption_SocketType_DatagramValidationError" +} + +// Error satisfies the builtin error interface +func (e SocketOption_SocketType_DatagramValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sSocketOption_SocketType_Datagram.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SocketOption_SocketType_DatagramValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SocketOption_SocketType_DatagramValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/listener/v3/quic_config.pb.go b/vendor/github.com/cilium/proxy/go/envoy/config/listener/v3/quic_config.pb.go index a659715a3e..eb9898ca04 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/config/listener/v3/quic_config.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/config/listener/v3/quic_config.pb.go @@ -32,7 +32,7 @@ const ( const _ = proto.ProtoPackageIsVersion4 // Configuration specific to the UDP QUIC listener. -// [#next-free-field: 12] +// [#next-free-field: 14] type QuicProtocolOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -83,6 +83,15 @@ type QuicProtocolOptions struct { // If not specified, no debug visitor will be attached to connections. // [#extension-category: envoy.quic.connection_debug_visitor] ConnectionDebugVisitorConfig *v3.TypedExtensionConfig `protobuf:"bytes,11,opt,name=connection_debug_visitor_config,json=connectionDebugVisitorConfig,proto3" json:"connection_debug_visitor_config,omitempty"` + // Configure a type of UDP cmsg to pass to listener filters via QuicReceivedPacket. + // Both level and type must be specified for cmsg to be saved. + // Cmsg may be truncated or omitted if expected size is not set. + // If not specified, no cmsg will be saved to QuicReceivedPacket. + SaveCmsgConfig []*v3.SocketCmsgHeaders `protobuf:"bytes,12,rep,name=save_cmsg_config,json=saveCmsgConfig,proto3" json:"save_cmsg_config,omitempty"` + // If true, the listener will reject connection-establishing packets at the + // QUIC layer by replying with an empty version negotiation packet to the + // client. + RejectNewConnections bool `protobuf:"varint,13,opt,name=reject_new_connections,json=rejectNewConnections,proto3" json:"reject_new_connections,omitempty"` } func (x *QuicProtocolOptions) Reset() { @@ -194,6 +203,20 @@ func (x *QuicProtocolOptions) GetConnectionDebugVisitorConfig() *v3.TypedExtensi return nil } +func (x *QuicProtocolOptions) GetSaveCmsgConfig() []*v3.SocketCmsgHeaders { + if x != nil { + return x.SaveCmsgConfig + } + return nil +} + +func (x *QuicProtocolOptions) GetRejectNewConnections() bool { + if x != nil { + return x.RejectNewConnections + } + return false +} + var File_envoy_config_listener_v3_quic_config_proto protoreflect.FileDescriptor var file_envoy_config_listener_v3_quic_config_proto_rawDesc = []byte{ @@ -208,6 +231,9 @@ var file_envoy_config_listener_v3_quic_config_proto_rawDesc = []byte{ 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x63, 0x6d, 0x73, 0x67, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, @@ -219,8 +245,8 @@ var file_envoy_config_listener_v3_quic_config_proto_rawDesc = []byte{ 0x74, 0x6f, 0x1a, 0x21, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf6, - 0x08, 0x0a, 0x13, 0x51, 0x75, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x89, + 0x0a, 0x0a, 0x13, 0x51, 0x75, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5d, 0x0a, 0x15, 0x71, 0x75, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, @@ -288,20 +314,29 @@ var file_envoy_config_listener_v3_quic_config_proto_rawDesc = []byte{ 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x1c, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x56, 0x69, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x30, 0x9a, 0xc5, 0x88, 0x1e, 0x2b, 0x0a, 0x29, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x8f, 0x01, 0x0a, 0x26, 0x69, 0x6f, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x2e, - 0x76, 0x33, 0x42, 0x0f, 0x51, 0x75, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x76, - 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5b, 0x0a, 0x10, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x63, 0x6d, + 0x73, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6d, 0x73, + 0x67, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x0e, 0x73, 0x61, 0x76, 0x65, 0x43, 0x6d, 0x73, 0x67, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x65, 0x77, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x14, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x77, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x30, 0x9a, 0xc5, 0x88, 0x1e, 0x2b, 0x0a, + 0x29, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x8f, 0x01, 0x0a, 0x26, 0x69, + 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x2e, 0x76, 0x33, 0x42, 0x0f, 0x51, 0x75, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, + 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x3b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -325,6 +360,7 @@ var file_envoy_config_listener_v3_quic_config_proto_goTypes = []interface{}{ (*wrapperspb.UInt32Value)(nil), // 4: google.protobuf.UInt32Value (*v3.TypedExtensionConfig)(nil), // 5: envoy.config.core.v3.TypedExtensionConfig (*wrapperspb.BoolValue)(nil), // 6: google.protobuf.BoolValue + (*v3.SocketCmsgHeaders)(nil), // 7: envoy.config.core.v3.SocketCmsgHeaders } var file_envoy_config_listener_v3_quic_config_proto_depIdxs = []int32{ 1, // 0: envoy.config.listener.v3.QuicProtocolOptions.quic_protocol_options:type_name -> envoy.config.core.v3.QuicProtocolOptions @@ -338,11 +374,12 @@ var file_envoy_config_listener_v3_quic_config_proto_depIdxs = []int32{ 5, // 8: envoy.config.listener.v3.QuicProtocolOptions.server_preferred_address_config:type_name -> envoy.config.core.v3.TypedExtensionConfig 6, // 9: envoy.config.listener.v3.QuicProtocolOptions.send_disable_active_migration:type_name -> google.protobuf.BoolValue 5, // 10: envoy.config.listener.v3.QuicProtocolOptions.connection_debug_visitor_config:type_name -> envoy.config.core.v3.TypedExtensionConfig - 11, // [11:11] is the sub-list for method output_type - 11, // [11:11] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 7, // 11: envoy.config.listener.v3.QuicProtocolOptions.save_cmsg_config:type_name -> envoy.config.core.v3.SocketCmsgHeaders + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_envoy_config_listener_v3_quic_config_proto_init() } diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/listener/v3/quic_config.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/config/listener/v3/quic_config.pb.validate.go index 8c6d891a40..42b0e9fdf7 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/config/listener/v3/quic_config.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/config/listener/v3/quic_config.pb.validate.go @@ -362,6 +362,53 @@ func (m *QuicProtocolOptions) validate(all bool) error { } } + if len(m.GetSaveCmsgConfig()) > 1 { + err := QuicProtocolOptionsValidationError{ + field: "SaveCmsgConfig", + reason: "value must contain no more than 1 item(s)", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetSaveCmsgConfig() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, QuicProtocolOptionsValidationError{ + field: fmt.Sprintf("SaveCmsgConfig[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, QuicProtocolOptionsValidationError{ + field: fmt.Sprintf("SaveCmsgConfig[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return QuicProtocolOptionsValidationError{ + field: fmt.Sprintf("SaveCmsgConfig[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + // no validation rules for RejectNewConnections + if len(errors) > 0 { return QuicProtocolOptionsMultiError(errors) } diff --git a/vendor/github.com/cilium/proxy/go/envoy/config/trace/v3/dynamic_ot.pb.go b/vendor/github.com/cilium/proxy/go/envoy/config/trace/v3/dynamic_ot.pb.go index 1b3c157314..0653b675c0 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/config/trace/v3/dynamic_ot.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/config/trace/v3/dynamic_ot.pb.go @@ -29,10 +29,10 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 -// DynamicOtConfig is used to dynamically load a tracer from a shared library +// DynamicOtConfig was used to dynamically load a tracer from a shared library // that implements the `OpenTracing dynamic loading API // `_. -// [#extension: envoy.tracers.dynamic_ot] +// [#not-implemented-hide:] type DynamicOtConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/basic_auth/v3/basic_auth.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/basic_auth/v3/basic_auth.pb.go index 07e59ea184..d470134a43 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/basic_auth/v3/basic_auth.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/basic_auth/v3/basic_auth.pb.go @@ -52,6 +52,10 @@ type BasicAuth struct { // // If it is not specified, the username will not be forwarded. ForwardUsernameHeader string `protobuf:"bytes,2,opt,name=forward_username_header,json=forwardUsernameHeader,proto3" json:"forward_username_header,omitempty"` + // This field specifies the request header to load the basic credential from. + // + // If it is not specified, the filter loads the credential from the "Authorization" header. + AuthenticationHeader string `protobuf:"bytes,3,opt,name=authentication_header,json=authenticationHeader,proto3" json:"authentication_header,omitempty"` } func (x *BasicAuth) Reset() { @@ -100,6 +104,13 @@ func (x *BasicAuth) GetForwardUsernameHeader() string { return "" } +func (x *BasicAuth) GetAuthenticationHeader() string { + if x != nil { + return x.AuthenticationHeader + } + return "" +} + // Extra settings that may be added to per-route configuration for // a virtual host or a cluster. type BasicAuthPerRoute struct { @@ -167,7 +178,7 @@ var file_envoy_extensions_filters_http_basic_auth_v3_basic_auth_proto_rawDesc = 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x90, 0x01, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd2, 0x01, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x3e, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, @@ -176,25 +187,29 @@ var file_envoy_extensions_filters_http_basic_auth_v3_basic_auth_proto_rawDesc = 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xc8, 0x01, 0x00, 0x52, 0x15, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x55, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x5b, 0x0a, 0x11, 0x42, 0x61, 0x73, - 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x46, - 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, - 0x0e, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0xb8, 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x52, - 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x42, 0xb6, 0x01, 0x0a, 0x39, 0x69, 0x6f, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x61, 0x75, 0x74, - 0x68, 0x2e, 0x76, 0x33, 0x42, 0x0e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, - 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x62, 0x61, 0x73, - 0x69, 0x63, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x33, 0x3b, 0x62, 0x61, 0x73, 0x69, 0x63, - 0x5f, 0x61, 0x75, 0x74, 0x68, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x15, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, + 0x01, 0x01, 0xc8, 0x01, 0x00, 0x52, 0x14, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x5b, 0x0a, 0x11, 0x42, + 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x12, 0x46, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x42, 0x0e, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0xb8, 0xb7, 0x8b, 0xa4, 0x02, + 0x01, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x42, 0xb6, 0x01, 0x0a, 0x39, 0x69, 0x6f, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x61, + 0x75, 0x74, 0x68, 0x2e, 0x76, 0x33, 0x42, 0x0e, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, + 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, + 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x62, + 0x61, 0x73, 0x69, 0x63, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x33, 0x3b, 0x62, 0x61, 0x73, + 0x69, 0x63, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, + 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/basic_auth/v3/basic_auth.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/basic_auth/v3/basic_auth.pb.validate.go index abdb8cd45d..bfb9a4ff1a 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/basic_auth/v3/basic_auth.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/basic_auth/v3/basic_auth.pb.validate.go @@ -97,6 +97,17 @@ func (m *BasicAuth) validate(all bool) error { errors = append(errors, err) } + if !_BasicAuth_AuthenticationHeader_Pattern.MatchString(m.GetAuthenticationHeader()) { + err := BasicAuthValidationError{ + field: "AuthenticationHeader", + reason: "value does not match regex pattern \"^[^\\x00\\n\\r]*$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + if len(errors) > 0 { return BasicAuthMultiError(errors) } @@ -176,6 +187,8 @@ var _ interface { var _BasicAuth_ForwardUsernameHeader_Pattern = regexp.MustCompile("^[^\x00\n\r]*$") +var _BasicAuth_AuthenticationHeader_Pattern = regexp.MustCompile("^[^\x00\n\r]*$") + // Validate checks the field values on BasicAuthPerRoute with the rules defined // in the proto definition for this message. If any rules are violated, the // first error encountered is returned, or nil if there are no violations. diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.go index c0a49e0f47..fa214c31ad 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.go @@ -17,6 +17,7 @@ import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" @@ -33,7 +34,7 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 -// [#next-free-field: 28] +// [#next-free-field: 30] type ExtAuthz struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -261,6 +262,20 @@ type ExtAuthz struct { // // If unset, defaults to true. EnableDynamicMetadataIngestion *wrapperspb.BoolValue `protobuf:"bytes,27,opt,name=enable_dynamic_metadata_ingestion,json=enableDynamicMetadataIngestion,proto3" json:"enable_dynamic_metadata_ingestion,omitempty"` + // Additional metadata to be added to the filter state for logging purposes. The metadata will be + // added to StreamInfo's filter state under the namespace corresponding to the ext_authz filter + // name. + FilterMetadata *structpb.Struct `protobuf:"bytes,28,opt,name=filter_metadata,json=filterMetadata,proto3" json:"filter_metadata,omitempty"` + // When set to true, the filter will emit per-stream stats for access logging. The filter state + // key will be the same as the filter name. + // + // If using Envoy GRPC, emits latency, bytes sent / received, upstream info, and upstream cluster + // info. If not using Envoy GRPC, emits only latency. Note that stats are ONLY added to filter + // state if a check request is actually made to an ext_authz service. + // + // If this is false the filter will not emit stats, but filter_metadata will still be respected if + // it has a value. + EmitFilterStateStats bool `protobuf:"varint,29,opt,name=emit_filter_state_stats,json=emitFilterStateStats,proto3" json:"emit_filter_state_stats,omitempty"` } func (x *ExtAuthz) Reset() { @@ -484,6 +499,20 @@ func (x *ExtAuthz) GetEnableDynamicMetadataIngestion() *wrapperspb.BoolValue { return nil } +func (x *ExtAuthz) GetFilterMetadata() *structpb.Struct { + if x != nil { + return x.FilterMetadata + } + return nil +} + +func (x *ExtAuthz) GetEmitFilterStateStats() bool { + if x != nil { + return x.EmitFilterStateStats + } + return false +} + type isExtAuthz_Services interface { isExtAuthz_Services() } @@ -1071,300 +1100,309 @@ var file_envoy_extensions_filters_http_ext_authz_v3_ext_authz_proto_rawDesc = [] 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, - 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x75, + 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x75, 0x64, 0x70, + 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x65, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, - 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfc, 0x0f, 0x0a, 0x08, 0x45, - 0x78, 0x74, 0x41, 0x75, 0x74, 0x68, 0x7a, 0x12, 0x46, 0x0a, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x5f, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x48, 0x00, 0x52, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x5c, 0x0a, 0x0c, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, - 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, - 0x52, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, - 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, - 0x12, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x40, 0x0a, 0x1d, 0x66, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x75, 0x64, + 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf5, 0x10, 0x0a, 0x08, 0x45, 0x78, 0x74, + 0x41, 0x75, 0x74, 0x68, 0x7a, 0x12, 0x46, 0x0a, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x33, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, + 0x52, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5c, 0x0a, + 0x0c, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, + 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, + 0x2e, 0x48, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0b, + 0x68, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x15, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x33, 0x2e, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x18, 0x13, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x19, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x41, - 0x6c, 0x6c, 0x6f, 0x77, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x66, 0x0a, - 0x11, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, - 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, - 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0f, 0x77, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x12, 0x41, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x6e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x40, 0x0a, 0x1d, 0x66, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x19, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x6c, + 0x6f, 0x77, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x66, 0x0a, 0x11, 0x77, + 0x69, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, + 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x0f, 0x77, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x63, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, + 0x41, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x6e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, + 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x3e, 0x0a, 0x1b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x12, 0x49, 0x0a, 0x21, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1e, 0x74, 0x79, + 0x70, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x21, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x27, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x21, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1e, - 0x74, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x49, - 0x0a, 0x21, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1e, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x27, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, 0x23, 0x72, 0x6f, 0x75, 0x74, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, - 0x55, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x17, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, - 0x15, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x50, 0x0a, 0x0f, 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x61, - 0x74, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x0d, 0x64, 0x65, 0x6e, 0x79, 0x41, - 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x50, 0x65, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x12, 0x41, 0x0a, 0x1d, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x62, 0x6f, 0x6f, 0x74, - 0x73, 0x74, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x51, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x64, 0x69, 0x73, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, - 0x11, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x6c, - 0x73, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x6c, 0x73, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x1d, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x61, 0x77, 0x5f, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x61, 0x77, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x7d, 0x0a, 0x1d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, - 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6d, 0x75, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x52, 0x1a, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x65, - 0x0a, 0x21, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x79, 0x6e, - 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, - 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x35, 0x9a, 0xc5, 0x88, 0x1e, 0x30, 0x0a, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, - 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x41, 0x75, 0x74, 0x68, 0x7a, 0x42, 0x0a, 0x0a, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x09, - 0x75, 0x73, 0x65, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x22, 0xda, 0x01, 0x0a, 0x0e, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x33, 0x0a, 0x11, - 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x20, 0x00, - 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x61, 0x73, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x61, - 0x63, 0x6b, 0x41, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, 0x3a, 0x3b, 0x9a, 0xc5, 0x88, 0x1e, 0x36, - 0x0a, 0x34, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, - 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xaf, 0x03, 0x0a, 0x0b, 0x48, 0x74, 0x74, 0x70, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x55, 0x72, 0x69, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x55, 0x72, 0x69, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, 0x50, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x75, 0x0a, 0x15, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, - 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, - 0x33, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x14, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x78, 0x0a, 0x16, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, - 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x15, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x38, 0x9a, 0xc5, 0x88, 0x1e, 0x33, 0x0a, 0x31, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, - 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, - 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x82, 0x02, 0x0a, 0x14, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x5e, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, - 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x72, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, - 0x30, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x6f, 0x5f, - 0x61, 0x64, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, - 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x54, 0x6f, 0x41, 0x64, 0x64, 0x3a, 0x41, 0x9a, 0xc5, 0x88, 0x1e, - 0x3c, 0x0a, 0x3a, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, - 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xf6, 0x04, - 0x0a, 0x15, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x18, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, - 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x72, 0x52, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x55, 0x70, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x74, 0x0a, 0x22, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x72, 0x52, 0x1e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x54, 0x6f, 0x41, 0x70, 0x70, 0x65, 0x6e, - 0x64, 0x12, 0x5e, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x14, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x72, 0x0a, 0x21, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x1d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x53, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x6b, 0x0a, 0x1d, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x1a, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x72, 0x6f, 0x6d, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x3a, 0x42, 0x9a, 0xc5, 0x88, 0x1e, 0x3d, 0x0a, 0x3b, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x68, - 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x32, - 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf7, 0x01, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x41, 0x75, - 0x74, 0x68, 0x7a, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x08, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x6a, 0x02, 0x08, 0x01, 0x48, 0x00, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x6c, 0x0a, 0x0e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, - 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x48, - 0x00, 0x52, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x3a, 0x3d, 0x9a, 0xc5, 0x88, 0x1e, 0x38, 0x0a, 0x36, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x65, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, 0x23, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x55, 0x0a, + 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x5e, 0x0a, 0x17, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x15, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x50, 0x0a, 0x0f, 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x61, 0x74, 0x5f, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x0d, 0x64, 0x65, 0x6e, 0x79, 0x41, 0x74, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x50, 0x65, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x12, 0x41, 0x0a, 0x1d, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, + 0x72, 0x61, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x4b, 0x65, 0x79, 0x12, 0x51, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x11, 0x64, + 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x6c, 0x73, 0x5f, + 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x6c, 0x73, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x5d, 0x0a, 0x1d, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x2c, 0x0a, 0x12, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x61, 0x77, 0x5f, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x52, 0x61, 0x77, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x7d, 0x0a, + 0x1d, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, + 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x1a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6d, 0x75, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x52, 0x1a, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, + 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x65, 0x0a, 0x21, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x1e, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x79, 0x6e, 0x61, 0x6d, + 0x69, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x17, 0x65, 0x6d, 0x69, 0x74, 0x5f, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x18, 0x1d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3a, 0x35, 0x9a, 0xc5, + 0x88, 0x1e, 0x30, 0x0a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, + 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x41, 0x75, + 0x74, 0x68, 0x7a, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x4a, + 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x09, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x22, 0xda, 0x01, 0x0a, 0x0e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x33, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x20, 0x00, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0d, + 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, 0x41, 0x73, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x3a, 0x3b, 0x9a, 0xc5, 0x88, 0x1e, 0x36, 0x0a, 0x34, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, - 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x45, - 0x78, 0x74, 0x41, 0x75, 0x74, 0x68, 0x7a, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, - 0x0f, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x03, 0xf8, 0x42, 0x01, - 0x22, 0xc8, 0x03, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x50, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, - 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x42, 0x06, 0xb8, 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x1e, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x12, 0x66, 0x0a, 0x11, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, - 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0f, 0x77, 0x69, 0x74, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, - 0x3a, 0x9a, 0xc5, 0x88, 0x1e, 0x35, 0x0a, 0x33, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, - 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0xb2, 0x01, 0x0a, 0x38, - 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, + 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xaf, 0x03, + 0x0a, 0x0b, 0x48, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3c, 0x0a, + 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x55, 0x72, 0x69, + 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x55, 0x72, 0x69, 0x12, 0x1f, 0x0a, 0x0b, 0x70, + 0x61, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x70, 0x61, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x75, 0x0a, 0x15, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, - 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x42, 0x0d, 0x45, 0x78, 0x74, 0x41, 0x75, 0x74, - 0x68, 0x7a, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5d, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, - 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2f, 0x76, 0x33, 0x3b, 0x65, 0x78, 0x74, - 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x14, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x78, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, + 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, + 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x15, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3a, 0x38, 0x9a, + 0xc5, 0x88, 0x1e, 0x33, 0x0a, 0x31, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, + 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, + 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, + 0x82, 0x02, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5e, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x0b, 0x18, 0x01, 0x92, + 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x54, 0x6f, 0x41, 0x64, + 0x64, 0x3a, 0x41, 0x9a, 0xc5, 0x88, 0x1e, 0x3c, 0x0a, 0x3a, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, + 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x32, 0x2e, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0xf6, 0x04, 0x0a, 0x15, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, + 0x0a, 0x18, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x16, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x74, 0x0a, 0x22, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x75, 0x70, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, + 0x6f, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x1e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x54, 0x6f, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x5e, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x72, 0x0a, 0x21, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x1d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x4f, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x6b, 0x0a, 0x1d, + 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x1a, 0x64, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x46, 0x72, + 0x6f, 0x6d, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x3a, 0x42, 0x9a, 0xc5, 0x88, 0x1e, 0x3d, + 0x0a, 0x3b, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, + 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf7, 0x01, + 0x0a, 0x10, 0x45, 0x78, 0x74, 0x41, 0x75, 0x74, 0x68, 0x7a, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x6a, 0x02, 0x08, 0x01, 0x48, 0x00, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x6c, 0x0a, 0x0e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, + 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x2e, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x3d, 0x9a, 0xc5, 0x88, 0x1e, 0x38, 0x0a, 0x36, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x74, 0x41, 0x75, 0x74, 0x68, 0x7a, 0x50, 0x65, + 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x42, 0x0f, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, 0xc8, 0x03, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x12, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x50, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, + 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x06, 0xb8, 0xb7, 0x8b, 0xa4, 0x02, 0x01, + 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x66, 0x0a, 0x11, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, + 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, + 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x0f, 0x77, 0x69, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x3a, 0x9a, 0xc5, 0x88, 0x1e, 0x35, 0x0a, 0x33, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, + 0x7a, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x42, 0xb2, 0x01, 0x0a, 0x38, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, + 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x2e, 0x76, 0x33, 0x42, + 0x0d, 0x45, 0x78, 0x74, 0x41, 0x75, 0x74, 0x68, 0x7a, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x5d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, + 0x2f, 0x76, 0x33, 0x3b, 0x65, 0x78, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x76, 0x33, 0xba, + 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1398,8 +1436,9 @@ var file_envoy_extensions_filters_http_ext_authz_v3_ext_authz_proto_goTypes = [] (*v32.ListStringMatcher)(nil), // 14: envoy.type.matcher.v3.ListStringMatcher (*wrapperspb.BoolValue)(nil), // 15: google.protobuf.BoolValue (*v33.HeaderMutationRules)(nil), // 16: envoy.config.common.mutation_rules.v3.HeaderMutationRules - (*v3.HttpUri)(nil), // 17: envoy.config.core.v3.HttpUri - (*v3.HeaderValue)(nil), // 18: envoy.config.core.v3.HeaderValue + (*structpb.Struct)(nil), // 17: google.protobuf.Struct + (*v3.HttpUri)(nil), // 18: envoy.config.core.v3.HttpUri + (*v3.HeaderValue)(nil), // 19: envoy.config.core.v3.HeaderValue } var file_envoy_extensions_filters_http_ext_authz_v3_ext_authz_proto_depIdxs = []int32{ 8, // 0: envoy.extensions.filters.http.ext_authz.v3.ExtAuthz.grpc_service:type_name -> envoy.config.core.v3.GrpcService @@ -1415,24 +1454,25 @@ var file_envoy_extensions_filters_http_ext_authz_v3_ext_authz_proto_depIdxs = [] 15, // 10: envoy.extensions.filters.http.ext_authz.v3.ExtAuthz.charge_cluster_response_stats:type_name -> google.protobuf.BoolValue 16, // 11: envoy.extensions.filters.http.ext_authz.v3.ExtAuthz.decoder_header_mutation_rules:type_name -> envoy.config.common.mutation_rules.v3.HeaderMutationRules 15, // 12: envoy.extensions.filters.http.ext_authz.v3.ExtAuthz.enable_dynamic_metadata_ingestion:type_name -> google.protobuf.BoolValue - 17, // 13: envoy.extensions.filters.http.ext_authz.v3.HttpService.server_uri:type_name -> envoy.config.core.v3.HttpUri - 3, // 14: envoy.extensions.filters.http.ext_authz.v3.HttpService.authorization_request:type_name -> envoy.extensions.filters.http.ext_authz.v3.AuthorizationRequest - 4, // 15: envoy.extensions.filters.http.ext_authz.v3.HttpService.authorization_response:type_name -> envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse - 14, // 16: envoy.extensions.filters.http.ext_authz.v3.AuthorizationRequest.allowed_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher - 18, // 17: envoy.extensions.filters.http.ext_authz.v3.AuthorizationRequest.headers_to_add:type_name -> envoy.config.core.v3.HeaderValue - 14, // 18: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.allowed_upstream_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher - 14, // 19: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.allowed_upstream_headers_to_append:type_name -> envoy.type.matcher.v3.ListStringMatcher - 14, // 20: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.allowed_client_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher - 14, // 21: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.allowed_client_headers_on_success:type_name -> envoy.type.matcher.v3.ListStringMatcher - 14, // 22: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.dynamic_metadata_from_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher - 6, // 23: envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute.check_settings:type_name -> envoy.extensions.filters.http.ext_authz.v3.CheckSettings - 7, // 24: envoy.extensions.filters.http.ext_authz.v3.CheckSettings.context_extensions:type_name -> envoy.extensions.filters.http.ext_authz.v3.CheckSettings.ContextExtensionsEntry - 1, // 25: envoy.extensions.filters.http.ext_authz.v3.CheckSettings.with_request_body:type_name -> envoy.extensions.filters.http.ext_authz.v3.BufferSettings - 26, // [26:26] is the sub-list for method output_type - 26, // [26:26] is the sub-list for method input_type - 26, // [26:26] is the sub-list for extension type_name - 26, // [26:26] is the sub-list for extension extendee - 0, // [0:26] is the sub-list for field type_name + 17, // 13: envoy.extensions.filters.http.ext_authz.v3.ExtAuthz.filter_metadata:type_name -> google.protobuf.Struct + 18, // 14: envoy.extensions.filters.http.ext_authz.v3.HttpService.server_uri:type_name -> envoy.config.core.v3.HttpUri + 3, // 15: envoy.extensions.filters.http.ext_authz.v3.HttpService.authorization_request:type_name -> envoy.extensions.filters.http.ext_authz.v3.AuthorizationRequest + 4, // 16: envoy.extensions.filters.http.ext_authz.v3.HttpService.authorization_response:type_name -> envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse + 14, // 17: envoy.extensions.filters.http.ext_authz.v3.AuthorizationRequest.allowed_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher + 19, // 18: envoy.extensions.filters.http.ext_authz.v3.AuthorizationRequest.headers_to_add:type_name -> envoy.config.core.v3.HeaderValue + 14, // 19: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.allowed_upstream_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher + 14, // 20: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.allowed_upstream_headers_to_append:type_name -> envoy.type.matcher.v3.ListStringMatcher + 14, // 21: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.allowed_client_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher + 14, // 22: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.allowed_client_headers_on_success:type_name -> envoy.type.matcher.v3.ListStringMatcher + 14, // 23: envoy.extensions.filters.http.ext_authz.v3.AuthorizationResponse.dynamic_metadata_from_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher + 6, // 24: envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute.check_settings:type_name -> envoy.extensions.filters.http.ext_authz.v3.CheckSettings + 7, // 25: envoy.extensions.filters.http.ext_authz.v3.CheckSettings.context_extensions:type_name -> envoy.extensions.filters.http.ext_authz.v3.CheckSettings.ContextExtensionsEntry + 1, // 26: envoy.extensions.filters.http.ext_authz.v3.CheckSettings.with_request_body:type_name -> envoy.extensions.filters.http.ext_authz.v3.BufferSettings + 27, // [27:27] is the sub-list for method output_type + 27, // [27:27] is the sub-list for method input_type + 27, // [27:27] is the sub-list for extension type_name + 27, // [27:27] is the sub-list for extension extendee + 0, // [0:27] is the sub-list for field type_name } func init() { file_envoy_extensions_filters_http_ext_authz_v3_ext_authz_proto_init() } diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.validate.go index c75a1b96ce..dab1aa4d37 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_authz/v3/ext_authz.pb.validate.go @@ -380,6 +380,37 @@ func (m *ExtAuthz) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetFilterMetadata()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExtAuthzValidationError{ + field: "FilterMetadata", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExtAuthzValidationError{ + field: "FilterMetadata", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetFilterMetadata()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExtAuthzValidationError{ + field: "FilterMetadata", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for EmitFilterStateStats + switch v := m.Services.(type) { case *ExtAuthz_GrpcService: if v == nil { diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_proc/v3/ext_proc.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_proc/v3/ext_proc.pb.go index 7e9bdfa1d8..92ccd9b360 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_proc/v3/ext_proc.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_proc/v3/ext_proc.pb.go @@ -11,6 +11,7 @@ import ( v3 "github.com/cilium/proxy/go/envoy/config/core/v3" v32 "github.com/cilium/proxy/go/envoy/type/matcher/v3" _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/cncf/xds/go/xds/annotations/v3" _ "github.com/envoyproxy/protoc-gen-validate/validate" proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -158,7 +159,7 @@ func (ExternalProcessor_RouteCacheAction) EnumDescriptor() ([]byte, []int) { // ` object in a namespace matching the filter // name. // -// [#next-free-field: 20] +// [#next-free-field: 23] type ExternalProcessor struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -166,7 +167,43 @@ type ExternalProcessor struct { // Configuration for the gRPC service that the filter will communicate with. // The filter supports both the "Envoy" and "Google" gRPC clients. + // Only one of “grpc_service“ or “http_service“ can be set. + // It is required that one of them must be set. GrpcService *v3.GrpcService `protobuf:"bytes,1,opt,name=grpc_service,json=grpcService,proto3" json:"grpc_service,omitempty"` + // [#not-implemented-hide:] + // Configuration for the HTTP service that the filter will communicate with. + // Only one of “http_service“ or + // :ref:`grpc_service `. + // can be set. It is required that one of them must be set. + // + // If “http_service“ is set, the + // :ref:`processing_mode ` + // can not be configured to send any body or trailers. i.e, http_service only supports + // sending request or response headers to the side stream server. + // + // With this configuration, Envoy behavior: + // + // 1. The headers are first put in a proto message + // :ref:`ProcessingRequest `. + // + // 2. This proto message is then transcoded into a JSON text. + // + // 3. Envoy then sends a HTTP POST message with content-type as "application/json", + // and this JSON text as body to the side stream server. + // + // After the side-stream receives this HTTP request message, it is expected to do as follows: + // + // 1. It converts the body, which is a JSON string, into a “ProcessingRequest“ + // proto message to examine and mutate the headers. + // + // 2. It then sets the mutated headers into a new proto message + // :ref:`ProcessingResponse `. + // + // 3. It converts “ProcessingResponse“ proto message into a JSON text. + // + // 4. It then sends a HTTP response back to Envoy with status code as "200", + // content-type as "application/json" and sets the JSON text as the body. + HttpService *ExtProcHttpService `protobuf:"bytes,20,opt,name=http_service,json=httpService,proto3" json:"http_service,omitempty"` // By default, if the gRPC stream cannot be established, or if it is closed // prematurely with an error, the filter will fail. Specifically, if the // response headers have not yet been delivered, then it will return a 500 @@ -278,6 +315,29 @@ type ExternalProcessor struct { // backend stream lifetime. In this case, Envoy will eventually timeout the external processor stream according to this time limit. // The default value is 5000 milliseconds (5 seconds) if not specified. DeferredCloseTimeout *durationpb.Duration `protobuf:"bytes,19,opt,name=deferred_close_timeout,json=deferredCloseTimeout,proto3" json:"deferred_close_timeout,omitempty"` + // Send body to the side stream server once it arrives without waiting for the header response from that server. + // It only works for STREAMED body processing mode. For any other body processing modes, it is ignored. + // The server has two options upon receiving a header request: + // + // 1. Instant Response: send the header response as soon as the header request is received. + // + // 2. Delayed Response: wait for the body before sending any response. + // + // In all scenarios, the header-body ordering must always be maintained. + // + // If enabled Envoy will ignore the + // :ref:`mode_override ` + // value that the server sends in the header response. This is because Envoy may have already + // sent the body to the server, prior to processing the header response. + SendBodyWithoutWaitingForHeaderResponse bool `protobuf:"varint,21,opt,name=send_body_without_waiting_for_header_response,json=sendBodyWithoutWaitingForHeaderResponse,proto3" json:"send_body_without_waiting_for_header_response,omitempty"` + // When :ref:`allow_mode_override + // ` is enabled and + // “allowed_override_modes“ is configured, the filter config :ref:`processing_mode + // ` + // can only be overridden by the response message from the external processing server iff the + // :ref:`mode_override ` is allowed by + // the “allowed_override_modes“ allow-list below. + AllowedOverrideModes []*ProcessingMode `protobuf:"bytes,22,rep,name=allowed_override_modes,json=allowedOverrideModes,proto3" json:"allowed_override_modes,omitempty"` } func (x *ExternalProcessor) Reset() { @@ -319,6 +379,13 @@ func (x *ExternalProcessor) GetGrpcService() *v3.GrpcService { return nil } +func (x *ExternalProcessor) GetHttpService() *ExtProcHttpService { + if x != nil { + return x.HttpService + } + return nil +} + func (x *ExternalProcessor) GetFailureModeAllow() bool { if x != nil { return x.FailureModeAllow @@ -438,6 +505,69 @@ func (x *ExternalProcessor) GetDeferredCloseTimeout() *durationpb.Duration { return nil } +func (x *ExternalProcessor) GetSendBodyWithoutWaitingForHeaderResponse() bool { + if x != nil { + return x.SendBodyWithoutWaitingForHeaderResponse + } + return false +} + +func (x *ExternalProcessor) GetAllowedOverrideModes() []*ProcessingMode { + if x != nil { + return x.AllowedOverrideModes + } + return nil +} + +// ExtProcHttpService is used for HTTP communication between the filter and the external processing service. +type ExtProcHttpService struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Sets the HTTP service which the external processing requests must be sent to. + HttpService *v3.HttpService `protobuf:"bytes,1,opt,name=http_service,json=httpService,proto3" json:"http_service,omitempty"` +} + +func (x *ExtProcHttpService) Reset() { + *x = ExtProcHttpService{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExtProcHttpService) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExtProcHttpService) ProtoMessage() {} + +func (x *ExtProcHttpService) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExtProcHttpService.ProtoReflect.Descriptor instead. +func (*ExtProcHttpService) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{1} +} + +func (x *ExtProcHttpService) GetHttpService() *v3.HttpService { + if x != nil { + return x.HttpService + } + return nil +} + // The MetadataOptions structure defines options for the sending and receiving of // dynamic metadata. Specifically, which namespaces to send to the server, whether // metadata returned by the server may be written, and how that metadata may be written. @@ -458,7 +588,7 @@ type MetadataOptions struct { func (x *MetadataOptions) Reset() { *x = MetadataOptions{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[1] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -471,7 +601,7 @@ func (x *MetadataOptions) String() string { func (*MetadataOptions) ProtoMessage() {} func (x *MetadataOptions) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[1] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -484,7 +614,7 @@ func (x *MetadataOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use MetadataOptions.ProtoReflect.Descriptor instead. func (*MetadataOptions) Descriptor() ([]byte, []int) { - return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{1} + return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{2} } func (x *MetadataOptions) GetForwardingNamespaces() *MetadataOptions_MetadataNamespaces { @@ -529,7 +659,7 @@ type HeaderForwardingRules struct { func (x *HeaderForwardingRules) Reset() { *x = HeaderForwardingRules{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[2] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -542,7 +672,7 @@ func (x *HeaderForwardingRules) String() string { func (*HeaderForwardingRules) ProtoMessage() {} func (x *HeaderForwardingRules) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[2] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -555,7 +685,7 @@ func (x *HeaderForwardingRules) ProtoReflect() protoreflect.Message { // Deprecated: Use HeaderForwardingRules.ProtoReflect.Descriptor instead. func (*HeaderForwardingRules) Descriptor() ([]byte, []int) { - return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{2} + return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{3} } func (x *HeaderForwardingRules) GetAllowedHeaders() *v32.ListStringMatcher { @@ -589,7 +719,7 @@ type ExtProcPerRoute struct { func (x *ExtProcPerRoute) Reset() { *x = ExtProcPerRoute{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[3] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -602,7 +732,7 @@ func (x *ExtProcPerRoute) String() string { func (*ExtProcPerRoute) ProtoMessage() {} func (x *ExtProcPerRoute) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[3] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -615,7 +745,7 @@ func (x *ExtProcPerRoute) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtProcPerRoute.ProtoReflect.Descriptor instead. func (*ExtProcPerRoute) Descriptor() ([]byte, []int) { - return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{3} + return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{4} } func (m *ExtProcPerRoute) GetOverride() isExtProcPerRoute_Override { @@ -698,7 +828,7 @@ type ExtProcOverrides struct { func (x *ExtProcOverrides) Reset() { *x = ExtProcOverrides{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[4] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -711,7 +841,7 @@ func (x *ExtProcOverrides) String() string { func (*ExtProcOverrides) ProtoMessage() {} func (x *ExtProcOverrides) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[4] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -724,7 +854,7 @@ func (x *ExtProcOverrides) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtProcOverrides.ProtoReflect.Descriptor instead. func (*ExtProcOverrides) Descriptor() ([]byte, []int) { - return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{4} + return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{5} } func (x *ExtProcOverrides) GetProcessingMode() *ProcessingMode { @@ -794,7 +924,7 @@ type MetadataOptions_MetadataNamespaces struct { func (x *MetadataOptions_MetadataNamespaces) Reset() { *x = MetadataOptions_MetadataNamespaces{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[5] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -807,7 +937,7 @@ func (x *MetadataOptions_MetadataNamespaces) String() string { func (*MetadataOptions_MetadataNamespaces) ProtoMessage() {} func (x *MetadataOptions_MetadataNamespaces) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[5] + mi := &file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -820,7 +950,7 @@ func (x *MetadataOptions_MetadataNamespaces) ProtoReflect() protoreflect.Message // Deprecated: Use MetadataOptions_MetadataNamespaces.ProtoReflect.Descriptor instead. func (*MetadataOptions_MetadataNamespaces) Descriptor() ([]byte, []int) { - return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{1, 0} + return file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP(), []int{2, 0} } func (x *MetadataOptions_MetadataNamespaces) GetUntyped() []string { @@ -854,204 +984,237 @@ var file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDesc = []by 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3f, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x65, 0x78, 0x74, 0x5f, 0x70, - 0x72, 0x6f, 0x63, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, - 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, - 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, - 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, - 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc7, 0x0b, 0x0a, 0x11, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x4e, 0x0a, 0x0c, - 0x67, 0x72, 0x70, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x0b, 0x67, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, - 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x62, 0x0a, 0x0f, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, - 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, - 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0e, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2d, - 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, - 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x51, - 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x0d, 0xfa, 0x42, 0x0a, 0xaa, 0x01, 0x07, 0x22, 0x03, 0x08, 0x90, 0x1c, 0x32, - 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x12, 0x61, 0x0a, 0x0e, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, - 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0d, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0xfa, - 0x42, 0x0a, 0xaa, 0x01, 0x07, 0x22, 0x03, 0x08, 0x90, 0x1c, 0x32, 0x00, 0x52, 0x11, 0x6d, 0x61, - 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, - 0x65, 0x0a, 0x0d, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, - 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0c, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, - 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4d, 0x6f, 0x64, 0x65, - 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, - 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, - 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6f, 0x62, 0x73, 0x65, 0x72, - 0x76, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x59, 0x0a, 0x19, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x42, - 0x1e, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x18, 0x12, 0x16, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x52, - 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x9b, 0x01, 0x0a, 0x12, 0x72, 0x6f, 0x75, 0x74, - 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, - 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, - 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x1e, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x18, 0x12, 0x16, 0x63, 0x6c, 0x65, - 0x61, 0x72, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x10, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x16, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, - 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x36, 0x0a, 0x10, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, - 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x45, 0x41, 0x52, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x54, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x4a, 0x04, - 0x08, 0x04, 0x10, 0x05, 0x52, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x22, 0xdf, 0x02, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x15, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, - 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x73, 0x52, 0x14, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x14, 0x72, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, - 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x13, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, - 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x44, 0x0a, 0x12, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x79, 0x70, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74, 0x79, 0x70, - 0x65, 0x64, 0x22, 0xc3, 0x01, 0x0a, 0x15, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x6f, 0x72, - 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x51, 0x0a, 0x0f, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, - 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x57, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, - 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x74, - 0x50, 0x72, 0x6f, 0x63, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x25, 0x0a, 0x08, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x6a, 0x02, 0x08, 0x01, 0x48, 0x00, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x5b, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, - 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, - 0x64, 0x65, 0x73, 0x48, 0x00, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, - 0x42, 0x0f, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x03, 0xf8, 0x42, - 0x01, 0x22, 0xf9, 0x03, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x4f, 0x76, 0x65, - 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, + 0x33, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, + 0x74, 0x74, 0x70, 0x2f, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x76, 0x33, 0x2f, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x74, 0x79, 0x70, + 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x78, 0x64, 0x73, 0x2f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0xb7, 0x0e, 0x0a, 0x11, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, + 0x1d, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x17, 0x12, 0x15, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, + 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x52, 0x0b, + 0x67, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0c, + 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, + 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x45, + 0x78, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x48, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x42, 0x25, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x17, 0x12, 0x15, 0x65, 0x78, 0x74, 0x5f, 0x70, + 0x72, 0x6f, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x52, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x12, 0x62, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, + 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x51, 0x0a, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0xfa, 0x42, 0x0a, + 0xaa, 0x01, 0x07, 0x22, 0x03, 0x08, 0x90, 0x1c, 0x32, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, + 0x61, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x73, 0x74, 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x61, 0x0a, 0x0e, 0x6d, + 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, + 0x0d, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x58, + 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0xfa, 0x42, 0x0a, 0xaa, 0x01, 0x07, 0x22, 0x03, + 0x08, 0x90, 0x1c, 0x32, 0x00, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x65, 0x0a, 0x0d, 0x66, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x40, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, - 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, - 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x61, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0c, 0x67, 0x72, 0x70, - 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x52, 0x0c, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, + 0x40, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, + 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, + 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6d, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6d, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x15, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x67, 0x72, 0x70, 0x63, 0x49, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0xae, 0x01, - 0x0a, 0x37, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x59, 0x0a, 0x19, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x63, + 0x68, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x42, 0x1e, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x18, + 0x12, 0x16, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6c, 0x65, 0x61, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x12, 0x9b, 0x01, 0x0a, 0x12, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x4d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, - 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x42, 0x0c, 0x45, 0x78, 0x74, 0x50, 0x72, - 0x6f, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5b, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, - 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, - 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x76, 0x33, 0x3b, 0x65, 0x78, 0x74, 0x5f, - 0x70, 0x72, 0x6f, 0x63, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1e, 0xf2, 0x98, + 0xfe, 0x8f, 0x05, 0x18, 0x12, 0x16, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x5f, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x52, 0x10, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, + 0x0a, 0x16, 0x64, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x64, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x65, 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x5e, 0x0a, 0x2d, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x6f, 0x75, 0x74, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x27, 0x73, 0x65, 0x6e, 0x64, 0x42, 0x6f, 0x64, 0x79, + 0x57, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x6f, + 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6f, 0x0a, 0x16, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, + 0x69, 0x64, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x14, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x73, + 0x22, 0x36, 0x0a, 0x10, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, + 0x00, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x45, 0x41, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, + 0x52, 0x45, 0x54, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x52, 0x0a, + 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x5a, 0x0a, 0x12, 0x45, 0x78, + 0x74, 0x50, 0x72, 0x6f, 0x63, 0x48, 0x74, 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x44, 0x0a, 0x0c, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, + 0x74, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x68, 0x74, 0x74, 0x70, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xdf, 0x02, 0x0a, 0x0f, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x15, 0x66, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4d, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, + 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x14, 0x66, 0x6f, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, + 0x80, 0x01, 0x0a, 0x14, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4d, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, + 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x52, 0x13, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x73, 0x1a, 0x44, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x6e, 0x74, 0x79, + 0x70, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x75, 0x6e, 0x74, 0x79, 0x70, + 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65, 0x64, 0x22, 0xc3, 0x01, 0x0a, 0x15, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x12, 0x51, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, + 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x11, 0x64, 0x69, 0x73, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x22, 0xa6, + 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x12, 0x25, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x6a, 0x02, 0x08, 0x01, 0x48, 0x00, 0x52, + 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x5b, 0x0a, 0x09, 0x6f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, + 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x63, + 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x48, 0x00, 0x52, 0x09, 0x6f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x42, 0x0f, 0x0a, 0x08, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, 0xf9, 0x03, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x50, + 0x72, 0x6f, 0x63, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x0f, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, + 0x33, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, + 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x2f, + 0x0a, 0x13, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, + 0x44, 0x0a, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x70, + 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0b, 0x67, 0x72, 0x70, 0x63, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x65, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0f, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x15, + 0x67, 0x72, 0x70, 0x63, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, + 0x67, 0x72, 0x70, 0x63, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x42, 0xae, 0x01, 0x0a, 0x37, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, + 0x74, 0x74, 0x70, 0x2e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2e, 0x76, 0x33, 0x42, + 0x0c, 0x45, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x5b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x76, + 0x33, 0x3b, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, + 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1067,48 +1230,53 @@ func file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDescGZIP() } var file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_goTypes = []interface{}{ (ExternalProcessor_RouteCacheAction)(0), // 0: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.RouteCacheAction (*ExternalProcessor)(nil), // 1: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor - (*MetadataOptions)(nil), // 2: envoy.extensions.filters.http.ext_proc.v3.MetadataOptions - (*HeaderForwardingRules)(nil), // 3: envoy.extensions.filters.http.ext_proc.v3.HeaderForwardingRules - (*ExtProcPerRoute)(nil), // 4: envoy.extensions.filters.http.ext_proc.v3.ExtProcPerRoute - (*ExtProcOverrides)(nil), // 5: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides - (*MetadataOptions_MetadataNamespaces)(nil), // 6: envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.MetadataNamespaces - (*v3.GrpcService)(nil), // 7: envoy.config.core.v3.GrpcService - (*ProcessingMode)(nil), // 8: envoy.extensions.filters.http.ext_proc.v3.ProcessingMode - (*durationpb.Duration)(nil), // 9: google.protobuf.Duration - (*v31.HeaderMutationRules)(nil), // 10: envoy.config.common.mutation_rules.v3.HeaderMutationRules - (*structpb.Struct)(nil), // 11: google.protobuf.Struct - (*v32.ListStringMatcher)(nil), // 12: envoy.type.matcher.v3.ListStringMatcher - (*v3.HeaderValue)(nil), // 13: envoy.config.core.v3.HeaderValue + (*ExtProcHttpService)(nil), // 2: envoy.extensions.filters.http.ext_proc.v3.ExtProcHttpService + (*MetadataOptions)(nil), // 3: envoy.extensions.filters.http.ext_proc.v3.MetadataOptions + (*HeaderForwardingRules)(nil), // 4: envoy.extensions.filters.http.ext_proc.v3.HeaderForwardingRules + (*ExtProcPerRoute)(nil), // 5: envoy.extensions.filters.http.ext_proc.v3.ExtProcPerRoute + (*ExtProcOverrides)(nil), // 6: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides + (*MetadataOptions_MetadataNamespaces)(nil), // 7: envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.MetadataNamespaces + (*v3.GrpcService)(nil), // 8: envoy.config.core.v3.GrpcService + (*ProcessingMode)(nil), // 9: envoy.extensions.filters.http.ext_proc.v3.ProcessingMode + (*durationpb.Duration)(nil), // 10: google.protobuf.Duration + (*v31.HeaderMutationRules)(nil), // 11: envoy.config.common.mutation_rules.v3.HeaderMutationRules + (*structpb.Struct)(nil), // 12: google.protobuf.Struct + (*v3.HttpService)(nil), // 13: envoy.config.core.v3.HttpService + (*v32.ListStringMatcher)(nil), // 14: envoy.type.matcher.v3.ListStringMatcher + (*v3.HeaderValue)(nil), // 15: envoy.config.core.v3.HeaderValue } var file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_depIdxs = []int32{ - 7, // 0: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.grpc_service:type_name -> envoy.config.core.v3.GrpcService - 8, // 1: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.processing_mode:type_name -> envoy.extensions.filters.http.ext_proc.v3.ProcessingMode - 9, // 2: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.message_timeout:type_name -> google.protobuf.Duration - 10, // 3: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.mutation_rules:type_name -> envoy.config.common.mutation_rules.v3.HeaderMutationRules - 9, // 4: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.max_message_timeout:type_name -> google.protobuf.Duration - 3, // 5: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.forward_rules:type_name -> envoy.extensions.filters.http.ext_proc.v3.HeaderForwardingRules - 11, // 6: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.filter_metadata:type_name -> google.protobuf.Struct - 2, // 7: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.metadata_options:type_name -> envoy.extensions.filters.http.ext_proc.v3.MetadataOptions - 0, // 8: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.route_cache_action:type_name -> envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.RouteCacheAction - 9, // 9: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.deferred_close_timeout:type_name -> google.protobuf.Duration - 6, // 10: envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.forwarding_namespaces:type_name -> envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.MetadataNamespaces - 6, // 11: envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.receiving_namespaces:type_name -> envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.MetadataNamespaces - 12, // 12: envoy.extensions.filters.http.ext_proc.v3.HeaderForwardingRules.allowed_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher - 12, // 13: envoy.extensions.filters.http.ext_proc.v3.HeaderForwardingRules.disallowed_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher - 5, // 14: envoy.extensions.filters.http.ext_proc.v3.ExtProcPerRoute.overrides:type_name -> envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides - 8, // 15: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides.processing_mode:type_name -> envoy.extensions.filters.http.ext_proc.v3.ProcessingMode - 7, // 16: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides.grpc_service:type_name -> envoy.config.core.v3.GrpcService - 2, // 17: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides.metadata_options:type_name -> envoy.extensions.filters.http.ext_proc.v3.MetadataOptions - 13, // 18: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides.grpc_initial_metadata:type_name -> envoy.config.core.v3.HeaderValue - 19, // [19:19] is the sub-list for method output_type - 19, // [19:19] is the sub-list for method input_type - 19, // [19:19] is the sub-list for extension type_name - 19, // [19:19] is the sub-list for extension extendee - 0, // [0:19] is the sub-list for field type_name + 8, // 0: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.grpc_service:type_name -> envoy.config.core.v3.GrpcService + 2, // 1: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.http_service:type_name -> envoy.extensions.filters.http.ext_proc.v3.ExtProcHttpService + 9, // 2: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.processing_mode:type_name -> envoy.extensions.filters.http.ext_proc.v3.ProcessingMode + 10, // 3: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.message_timeout:type_name -> google.protobuf.Duration + 11, // 4: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.mutation_rules:type_name -> envoy.config.common.mutation_rules.v3.HeaderMutationRules + 10, // 5: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.max_message_timeout:type_name -> google.protobuf.Duration + 4, // 6: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.forward_rules:type_name -> envoy.extensions.filters.http.ext_proc.v3.HeaderForwardingRules + 12, // 7: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.filter_metadata:type_name -> google.protobuf.Struct + 3, // 8: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.metadata_options:type_name -> envoy.extensions.filters.http.ext_proc.v3.MetadataOptions + 0, // 9: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.route_cache_action:type_name -> envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.RouteCacheAction + 10, // 10: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.deferred_close_timeout:type_name -> google.protobuf.Duration + 9, // 11: envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor.allowed_override_modes:type_name -> envoy.extensions.filters.http.ext_proc.v3.ProcessingMode + 13, // 12: envoy.extensions.filters.http.ext_proc.v3.ExtProcHttpService.http_service:type_name -> envoy.config.core.v3.HttpService + 7, // 13: envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.forwarding_namespaces:type_name -> envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.MetadataNamespaces + 7, // 14: envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.receiving_namespaces:type_name -> envoy.extensions.filters.http.ext_proc.v3.MetadataOptions.MetadataNamespaces + 14, // 15: envoy.extensions.filters.http.ext_proc.v3.HeaderForwardingRules.allowed_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher + 14, // 16: envoy.extensions.filters.http.ext_proc.v3.HeaderForwardingRules.disallowed_headers:type_name -> envoy.type.matcher.v3.ListStringMatcher + 6, // 17: envoy.extensions.filters.http.ext_proc.v3.ExtProcPerRoute.overrides:type_name -> envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides + 9, // 18: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides.processing_mode:type_name -> envoy.extensions.filters.http.ext_proc.v3.ProcessingMode + 8, // 19: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides.grpc_service:type_name -> envoy.config.core.v3.GrpcService + 3, // 20: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides.metadata_options:type_name -> envoy.extensions.filters.http.ext_proc.v3.MetadataOptions + 15, // 21: envoy.extensions.filters.http.ext_proc.v3.ExtProcOverrides.grpc_initial_metadata:type_name -> envoy.config.core.v3.HeaderValue + 22, // [22:22] is the sub-list for method output_type + 22, // [22:22] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_init() } @@ -1131,7 +1299,7 @@ func file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_init() { } } file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetadataOptions); i { + switch v := v.(*ExtProcHttpService); i { case 0: return &v.state case 1: @@ -1143,7 +1311,7 @@ func file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_init() { } } file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeaderForwardingRules); i { + switch v := v.(*MetadataOptions); i { case 0: return &v.state case 1: @@ -1155,7 +1323,7 @@ func file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_init() { } } file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtProcPerRoute); i { + switch v := v.(*HeaderForwardingRules); i { case 0: return &v.state case 1: @@ -1167,7 +1335,7 @@ func file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_init() { } } file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtProcOverrides); i { + switch v := v.(*ExtProcPerRoute); i { case 0: return &v.state case 1: @@ -1179,6 +1347,18 @@ func file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_init() { } } file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExtProcOverrides); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetadataOptions_MetadataNamespaces); i { case 0: return &v.state @@ -1191,7 +1371,7 @@ func file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_init() { } } } - file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_msgTypes[4].OneofWrappers = []interface{}{ (*ExtProcPerRoute_Disabled)(nil), (*ExtProcPerRoute_Overrides)(nil), } @@ -1201,7 +1381,7 @@ func file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_envoy_extensions_filters_http_ext_proc_v3_ext_proc_proto_rawDesc, NumEnums: 1, - NumMessages: 6, + NumMessages: 7, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_proc/v3/ext_proc.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_proc/v3/ext_proc.pb.validate.go index 403201e4ed..19e83ab05e 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_proc/v3/ext_proc.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/ext_proc/v3/ext_proc.pb.validate.go @@ -57,17 +57,6 @@ func (m *ExternalProcessor) validate(all bool) error { var errors []error - if m.GetGrpcService() == nil { - err := ExternalProcessorValidationError{ - field: "GrpcService", - reason: "value is required", - } - if !all { - return err - } - errors = append(errors, err) - } - if all { switch v := interface{}(m.GetGrpcService()).(type) { case interface{ ValidateAll() error }: @@ -97,6 +86,35 @@ func (m *ExternalProcessor) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetHttpService()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExternalProcessorValidationError{ + field: "HttpService", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExternalProcessorValidationError{ + field: "HttpService", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetHttpService()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExternalProcessorValidationError{ + field: "HttpService", + reason: "embedded message failed validation", + cause: err, + } + } + } + // no validation rules for FailureModeAllow if all { @@ -347,6 +365,42 @@ func (m *ExternalProcessor) validate(all bool) error { } } + // no validation rules for SendBodyWithoutWaitingForHeaderResponse + + for idx, item := range m.GetAllowedOverrideModes() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExternalProcessorValidationError{ + field: fmt.Sprintf("AllowedOverrideModes[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExternalProcessorValidationError{ + field: fmt.Sprintf("AllowedOverrideModes[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExternalProcessorValidationError{ + field: fmt.Sprintf("AllowedOverrideModes[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + if len(errors) > 0 { return ExternalProcessorMultiError(errors) } @@ -427,6 +481,137 @@ var _ interface { ErrorName() string } = ExternalProcessorValidationError{} +// Validate checks the field values on ExtProcHttpService with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *ExtProcHttpService) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ExtProcHttpService with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ExtProcHttpServiceMultiError, or nil if none found. +func (m *ExtProcHttpService) ValidateAll() error { + return m.validate(true) +} + +func (m *ExtProcHttpService) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetHttpService()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExtProcHttpServiceValidationError{ + field: "HttpService", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExtProcHttpServiceValidationError{ + field: "HttpService", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetHttpService()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExtProcHttpServiceValidationError{ + field: "HttpService", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return ExtProcHttpServiceMultiError(errors) + } + + return nil +} + +// ExtProcHttpServiceMultiError is an error wrapping multiple validation errors +// returned by ExtProcHttpService.ValidateAll() if the designated constraints +// aren't met. +type ExtProcHttpServiceMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ExtProcHttpServiceMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ExtProcHttpServiceMultiError) AllErrors() []error { return m } + +// ExtProcHttpServiceValidationError is the validation error returned by +// ExtProcHttpService.Validate if the designated constraints aren't met. +type ExtProcHttpServiceValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ExtProcHttpServiceValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ExtProcHttpServiceValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ExtProcHttpServiceValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ExtProcHttpServiceValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ExtProcHttpServiceValidationError) ErrorName() string { + return "ExtProcHttpServiceValidationError" +} + +// Error satisfies the builtin error interface +func (e ExtProcHttpServiceValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sExtProcHttpService.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ExtProcHttpServiceValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ExtProcHttpServiceValidationError{} + // Validate checks the field values on MetadataOptions with the rules defined // in the proto definition for this message. If any rules are violated, the // first error encountered is returned, or nil if there are no violations. diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/jwt_authn/v3/config.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/jwt_authn/v3/config.pb.go index 255f3e8f35..87dc7896c0 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/jwt_authn/v3/config.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/jwt_authn/v3/config.pb.go @@ -291,11 +291,13 @@ type JwtProvider struct { // Specify the claim name you want to copy in which HTTP header. For examples, following config: // The claim must be of type; string, int, double, bool. Array type claims are not supported // - // .. code-block:: yaml + // .. literalinclude:: /_configs/repo/jwt_authn.yaml // - // claim_to_headers: - // - name: x-jwt-claim-nested-claim - // claim: claim.nested.key + // :language: yaml + // :lines: 44-48 + // :linenos: + // :lineno-start: 44 + // :caption: :download:`jwt_authn.yaml ` // // This header is only reserved for jwt claim; any other value will be overwritten. ClaimToHeaders []*JwtClaimToHeader `protobuf:"bytes,15,rep,name=claim_to_headers,json=claimToHeaders,proto3" json:"claim_to_headers,omitempty"` @@ -1750,9 +1752,9 @@ type JwtProvider_NormalizePayload struct { // Each claim in this list will be interpreted as a space-delimited string // and converted to a list of strings based on the delimited values. - // Example: a token with a claim “scopes: "email profile"“ is translated - // to dynamic metadata “scopes: ["email", "profile"]“ if this field is - // set value “["scopes"]“. This special handling of “scopes“ is + // Example: a token with a claim “scope: "email profile"“ is translated + // to dynamic metadata “scope: ["email", "profile"]“ if this field is + // set value “["scope"]“. This special handling of “scope“ is // recommended by `RFC8693 // `_. SpaceDelimitedClaims []string `protobuf:"bytes,1,rep,name=space_delimited_claims,json=spaceDelimitedClaims,proto3" json:"space_delimited_claims,omitempty"` diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/local_ratelimit/v3/local_rate_limit.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/local_ratelimit/v3/local_rate_limit.pb.go index e719edf6f9..e877a48be3 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/local_ratelimit/v3/local_rate_limit.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/local_ratelimit/v3/local_rate_limit.pb.go @@ -8,6 +8,7 @@ package local_ratelimitv3 import ( v31 "github.com/cilium/proxy/go/envoy/config/core/v3" + v33 "github.com/cilium/proxy/go/envoy/config/route/v3" v32 "github.com/cilium/proxy/go/envoy/extensions/common/ratelimit/v3" v3 "github.com/cilium/proxy/go/envoy/type/v3" _ "github.com/cncf/xds/go/udpa/annotations" @@ -31,7 +32,7 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 -// [#next-free-field: 17] +// [#next-free-field: 18] type LocalRateLimit struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -148,6 +149,25 @@ type LocalRateLimit struct { // of the default “UNAVAILABLE“ gRPC code for a rate limited gRPC call. The // HTTP code will be 200 for a gRPC response. RateLimitedAsResourceExhausted bool `protobuf:"varint,15,opt,name=rate_limited_as_resource_exhausted,json=rateLimitedAsResourceExhausted,proto3" json:"rate_limited_as_resource_exhausted,omitempty"` + // Rate limit configuration that is used to generate a list of descriptor entries based on + // the request context. The generated entries will be used to find one or multiple matched rate + // limit rule from the “descriptors“. + // If this is set, then + // :ref:`VirtualHost.rate_limits` or + // :ref:`RouteAction.rate_limits` fields + // will be ignored. + // + // .. note:: + // + // Not all configuration fields of + // :ref:`rate limit config ` is supported at here. + // Following fields are not supported: + // + // 1. :ref:`rate limit stage `. + // 2. :ref:`dynamic metadata `. + // 3. :ref:`disable_key `. + // 4. :ref:`override limit `. + RateLimits []*v33.RateLimit `protobuf:"bytes,17,rep,name=rate_limits,json=rateLimits,proto3" json:"rate_limits,omitempty"` } func (x *LocalRateLimit) Reset() { @@ -287,6 +307,13 @@ func (x *LocalRateLimit) GetRateLimitedAsResourceExhausted() bool { return false } +func (x *LocalRateLimit) GetRateLimits() []*v33.RateLimit { + if x != nil { + return x.RateLimits + } + return nil +} + var File_envoy_extensions_filters_http_local_ratelimit_v3_local_rate_limit_proto protoreflect.FileDescriptor var file_envoy_extensions_filters_http_local_ratelimit_v3_local_rate_limit_proto_rawDesc = []byte{ @@ -299,119 +326,126 @@ var file_envoy_extensions_filters_http_local_ratelimit_v3_local_rate_limit_proto 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, - 0x33, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x34, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, - 0x76, 0x33, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x76, - 0x33, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, - 0x76, 0x33, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xce, 0x0a, - 0x0a, 0x0e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x28, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, - 0x73, 0x74, 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, - 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, - 0x0b, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x55, 0x0a, 0x0e, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x6e, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x12, 0x87, 0x01, 0x0a, - 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x77, 0x68, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, - 0x5f, 0x65, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, - 0x10, 0x0a, 0x52, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x54, 0x6f, 0x41, 0x64, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x12, 0x68, 0x0a, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x64, - 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x0a, 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x54, 0x6f, 0x41, 0x64, 0x64, - 0x12, 0x60, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x33, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x2f, 0x76, 0x33, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x34, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x76, 0x33, + 0x2f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x76, 0x33, 0x2f, + 0x68, 0x74, 0x74, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x20, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x76, 0x33, + 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x91, 0x0b, 0x0a, 0x0e, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x28, + 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x73, 0x74, + 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, + 0x33, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0b, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x55, 0x0a, 0x0e, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x57, 0x0a, 0x0f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x12, 0x87, 0x01, 0x0a, 0x28, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, + 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x77, 0x68, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, 0x74, 0x5f, 0x65, + 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x0a, + 0x52, 0x22, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x54, 0x6f, 0x41, 0x64, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x4e, 0x6f, 0x74, 0x45, 0x6e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x64, 0x12, 0x68, 0x0a, 0x17, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x0a, 0x52, 0x14, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x54, 0x6f, 0x41, 0x64, 0x64, 0x12, 0x60, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x72, 0x61, + 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x1d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0a, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, + 0x59, 0x0a, 0x2a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x25, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x50, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x18, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x74, 0x65, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x15, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x88, 0x01, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x78, 0x5f, 0x72, 0x61, + 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, - 0x72, 0x73, 0x12, 0x1d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x0a, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x12, 0x59, 0x0a, 0x2a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x25, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x50, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x18, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x15, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x1a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x78, 0x5f, - 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x76, 0x33, 0x2e, 0x58, - 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, - 0x52, 0x46, 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x17, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x58, 0x52, 0x61, 0x74, - 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x69, 0x0a, - 0x0e, 0x76, 0x68, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x76, 0x33, 0x2e, 0x56, 0x68, 0x52, - 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x76, 0x68, 0x52, 0x61, - 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x23, 0x61, 0x6c, 0x77, 0x61, - 0x79, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x1f, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x4a, 0x0a, 0x22, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, - 0x78, 0x68, 0x61, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1e, - 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x41, 0x73, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x78, 0x68, 0x61, 0x75, 0x73, 0x74, 0x65, 0x64, 0x42, 0xca, - 0x01, 0x0a, 0x3e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x76, - 0x33, 0x42, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x69, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, - 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6c, - 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, 0x76, - 0x33, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x76, 0x33, 0x2e, 0x58, 0x52, 0x61, + 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x52, 0x46, + 0x43, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x17, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x58, 0x52, 0x61, 0x74, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x69, 0x0a, 0x0e, 0x76, + 0x68, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x72, 0x61, + 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x76, 0x33, 0x2e, 0x56, 0x68, 0x52, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x76, 0x68, 0x52, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x23, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, + 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x1f, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x12, 0x4a, 0x0a, 0x22, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x78, 0x68, + 0x61, 0x75, 0x73, 0x74, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1e, 0x72, 0x61, + 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x41, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x45, 0x78, 0x68, 0x61, 0x75, 0x73, 0x74, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0b, + 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, + 0xca, 0x01, 0x0a, 0x3e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, + 0x76, 0x33, 0x42, 0x13, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x69, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2f, + 0x76, 0x33, 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -438,6 +472,7 @@ var file_envoy_extensions_filters_http_local_ratelimit_v3_local_rate_limit_proto (v32.XRateLimitHeadersRFCVersion)(0), // 7: envoy.extensions.common.ratelimit.v3.XRateLimitHeadersRFCVersion (v32.VhRateLimitsOptions)(0), // 8: envoy.extensions.common.ratelimit.v3.VhRateLimitsOptions (*wrapperspb.BoolValue)(nil), // 9: google.protobuf.BoolValue + (*v33.RateLimit)(nil), // 10: envoy.config.route.v3.RateLimit } var file_envoy_extensions_filters_http_local_ratelimit_v3_local_rate_limit_proto_depIdxs = []int32{ 1, // 0: envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit.status:type_name -> envoy.type.v3.HttpStatus @@ -451,11 +486,12 @@ var file_envoy_extensions_filters_http_local_ratelimit_v3_local_rate_limit_proto 7, // 8: envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit.enable_x_ratelimit_headers:type_name -> envoy.extensions.common.ratelimit.v3.XRateLimitHeadersRFCVersion 8, // 9: envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit.vh_rate_limits:type_name -> envoy.extensions.common.ratelimit.v3.VhRateLimitsOptions 9, // 10: envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit.always_consume_default_token_bucket:type_name -> google.protobuf.BoolValue - 11, // [11:11] is the sub-list for method output_type - 11, // [11:11] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 10, // 11: envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit.rate_limits:type_name -> envoy.config.route.v3.RateLimit + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_envoy_extensions_filters_http_local_ratelimit_v3_local_rate_limit_proto_init() } diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/local_ratelimit/v3/local_rate_limit.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/local_ratelimit/v3/local_rate_limit.pb.validate.go index 12e324c671..6b8f6312a7 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/local_ratelimit/v3/local_rate_limit.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/local_ratelimit/v3/local_rate_limit.pb.validate.go @@ -407,6 +407,40 @@ func (m *LocalRateLimit) validate(all bool) error { // no validation rules for RateLimitedAsResourceExhausted + for idx, item := range m.GetRateLimits() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, LocalRateLimitValidationError{ + field: fmt.Sprintf("RateLimits[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, LocalRateLimitValidationError{ + field: fmt.Sprintf("RateLimits[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return LocalRateLimitValidationError{ + field: fmt.Sprintf("RateLimits[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + if len(errors) > 0 { return LocalRateLimitMultiError(errors) } diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3/oauth.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3/oauth.pb.go index 650a36eee5..9545a9d8e6 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3/oauth.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3/oauth.pb.go @@ -82,6 +82,7 @@ func (OAuth2Config_AuthType) EnumDescriptor() ([]byte, []int) { return file_envoy_extensions_filters_http_oauth2_v3_oauth_proto_rawDescGZIP(), []int{1, 0} } +// [#next-free-field: 6] type OAuth2Credentials struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -99,6 +100,9 @@ type OAuth2Credentials struct { TokenFormation isOAuth2Credentials_TokenFormation `protobuf_oneof:"token_formation"` // The cookie names used in OAuth filters flow. CookieNames *OAuth2Credentials_CookieNames `protobuf:"bytes,4,opt,name=cookie_names,json=cookieNames,proto3" json:"cookie_names,omitempty"` + // The domain to set the cookie on. If not set, the cookie will default to the host of the request, not including the subdomains. + // This is useful when token cookies need to be shared across multiple subdomains. + CookieDomain string `protobuf:"bytes,5,opt,name=cookie_domain,json=cookieDomain,proto3" json:"cookie_domain,omitempty"` } func (x *OAuth2Credentials) Reset() { @@ -168,6 +172,13 @@ func (x *OAuth2Credentials) GetCookieNames() *OAuth2Credentials_CookieNames { return nil } +func (x *OAuth2Credentials) GetCookieDomain() string { + if x != nil { + return x.CookieDomain + } + return "" +} + type isOAuth2Credentials_TokenFormation interface { isOAuth2Credentials_TokenFormation() } @@ -181,7 +192,7 @@ func (*OAuth2Credentials_HmacSecret) isOAuth2Credentials_TokenFormation() {} // OAuth config // -// [#next-free-field: 18] +// [#next-free-field: 21] type OAuth2Config struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -189,6 +200,8 @@ type OAuth2Config struct { // Endpoint on the authorization server to retrieve the access token from. TokenEndpoint *v31.HttpUri `protobuf:"bytes,1,opt,name=token_endpoint,json=tokenEndpoint,proto3" json:"token_endpoint,omitempty"` + // Specifies the retry policy for requests to the OAuth server. If not specified, then no retries will be performed. + RetryPolicy *v31.RetryPolicy `protobuf:"bytes,18,opt,name=retry_policy,json=retryPolicy,proto3" json:"retry_policy,omitempty"` // The endpoint redirect to for authorization in response to unauthorized requests. AuthorizationEndpoint string `protobuf:"bytes,2,opt,name=authorization_endpoint,json=authorizationEndpoint,proto3" json:"authorization_endpoint,omitempty"` // Credentials used for OAuth. @@ -206,7 +219,7 @@ type OAuth2Config struct { // Forward the OAuth token as a Bearer to upstream web service. ForwardBearerToken bool `protobuf:"varint,7,opt,name=forward_bearer_token,json=forwardBearerToken,proto3" json:"forward_bearer_token,omitempty"` // If set to true, preserve the existing authorization header. - // By default Envoy strips the existing authorization header before forwarding upstream. + // By default the client strips the existing authorization header before forwarding upstream. // Can not be set to true if forward_bearer_token is already set to true. // Default value is false. PreserveAuthorizationHeader bool `protobuf:"varint,16,opt,name=preserve_authorization_header,json=preserveAuthorizationHeader,proto3" json:"preserve_authorization_header,omitempty"` @@ -239,13 +252,23 @@ type OAuth2Config struct { // // If this value is not set, it will default to “604800s“. In this case, the cookie with the refresh token will be expired // in a week. - // This setting is only considered if “use_refresh_token“ is set to true, otherwise the authorization server expiration or “defaul_expires_in“ is used. + // This setting is only considered if “use_refresh_token“ is set to true, otherwise the authorization server expiration or “default_expires_in“ is used. DefaultRefreshTokenExpiresIn *durationpb.Duration `protobuf:"bytes,15,opt,name=default_refresh_token_expires_in,json=defaultRefreshTokenExpiresIn,proto3" json:"default_refresh_token_expires_in,omitempty"` - // If set to true, Envoy will not set a cookie for ID Token even if one is received from the Identity Provider. This may be useful in cases where the ID + // If set to true, the client will not set a cookie for ID Token even if one is received from the Identity Provider. This may be useful in cases where the ID // Token is too large for HTTP cookies (longer than 4096 characters). Enabling this option will only disable setting the cookie response header, the filter // will still process incoming ID Tokens as part of the HMAC if they are there. This is to ensure compatibility while switching this setting on. Future // sessions would not set the IdToken cookie header. DisableIdTokenSetCookie bool `protobuf:"varint,17,opt,name=disable_id_token_set_cookie,json=disableIdTokenSetCookie,proto3" json:"disable_id_token_set_cookie,omitempty"` + // If set to true, the client will not set a cookie for Access Token even if one is received from the Identity Provider. + // Enabling this option will only disable setting the cookie response header, the filter + // will still process incoming Access Tokens as part of the HMAC if they are there. This is to ensure compatibility while switching this setting on. Future + // sessions would not set the Access Token cookie header. + DisableAccessTokenSetCookie bool `protobuf:"varint,19,opt,name=disable_access_token_set_cookie,json=disableAccessTokenSetCookie,proto3" json:"disable_access_token_set_cookie,omitempty"` + // If set to true, the client will not set a cookie for Refresh Token even if one is received from the Identity Provider. + // Enabling this option will only disable setting the cookie response header, the filter + // will still process incoming Refresh Tokens as part of the HMAC if they are there. This is to ensure compatibility while switching this setting on. Future + // sessions would not set the Refresh Token cookie header. + DisableRefreshTokenSetCookie bool `protobuf:"varint,20,opt,name=disable_refresh_token_set_cookie,json=disableRefreshTokenSetCookie,proto3" json:"disable_refresh_token_set_cookie,omitempty"` } func (x *OAuth2Config) Reset() { @@ -287,6 +310,13 @@ func (x *OAuth2Config) GetTokenEndpoint() *v31.HttpUri { return nil } +func (x *OAuth2Config) GetRetryPolicy() *v31.RetryPolicy { + if x != nil { + return x.RetryPolicy + } + return nil +} + func (x *OAuth2Config) GetAuthorizationEndpoint() string { if x != nil { return x.AuthorizationEndpoint @@ -399,6 +429,20 @@ func (x *OAuth2Config) GetDisableIdTokenSetCookie() bool { return false } +func (x *OAuth2Config) GetDisableAccessTokenSetCookie() bool { + if x != nil { + return x.DisableAccessTokenSetCookie + } + return false +} + +func (x *OAuth2Config) GetDisableRefreshTokenSetCookie() bool { + if x != nil { + return x.DisableRefreshTokenSetCookie + } + return false +} + // Filter config. type OAuth2 struct { state protoimpl.MessageState @@ -448,7 +492,7 @@ func (x *OAuth2) GetConfig() *OAuth2Config { return nil } -// [#next-free-field: 6] +// [#next-free-field: 7] type OAuth2Credentials_CookieNames struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -468,6 +512,8 @@ type OAuth2Credentials_CookieNames struct { IdToken string `protobuf:"bytes,4,opt,name=id_token,json=idToken,proto3" json:"id_token,omitempty"` // Cookie name to hold the refresh token. Defaults to “RefreshToken“. RefreshToken string `protobuf:"bytes,5,opt,name=refresh_token,json=refreshToken,proto3" json:"refresh_token,omitempty"` + // Cookie name to hold the nonce value. Defaults to “OauthNonce“. + OauthNonce string `protobuf:"bytes,6,opt,name=oauth_nonce,json=oauthNonce,proto3" json:"oauth_nonce,omitempty"` } func (x *OAuth2Credentials_CookieNames) Reset() { @@ -537,6 +583,13 @@ func (x *OAuth2Credentials_CookieNames) GetRefreshToken() string { return "" } +func (x *OAuth2Credentials_CookieNames) GetOauthNonce() string { + if x != nil { + return x.OauthNonce + } + return "" +} + var File_envoy_extensions_filters_http_oauth2_v3_oauth_proto protoreflect.FileDescriptor var file_envoy_extensions_filters_http_oauth2_v3_oauth_proto_rawDesc = []byte{ @@ -545,164 +598,184 @@ var file_envoy_extensions_filters_http_oauth2_v3_oauth_proto_rawDesc = []byte{ 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x76, 0x33, 0x2f, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x27, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, - 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, 0x33, 0x1a, 0x23, + 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, - 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x75, 0x72, 0x69, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x36, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, - 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x33, - 0x2f, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, - 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, - 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0x86, 0x05, 0x0a, 0x11, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x24, 0x0a, 0x09, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x67, 0x0a, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, - 0x33, 0x2e, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x67, 0x0a, 0x0b, 0x68, 0x6d, 0x61, 0x63, - 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, - 0x02, 0x10, 0x01, 0x48, 0x00, 0x52, 0x0a, 0x68, 0x6d, 0x61, 0x63, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x12, 0x69, 0x0a, 0x0c, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, - 0x33, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x73, 0x2e, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x52, - 0x0b, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x1a, 0xf5, 0x01, 0x0a, - 0x0b, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x0c, - 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, - 0x0b, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x0a, - 0x6f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x6d, 0x61, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, 0x09, 0x6f, - 0x61, 0x75, 0x74, 0x68, 0x48, 0x6d, 0x61, 0x63, 0x12, 0x30, 0x0a, 0x0d, 0x6f, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, 0x0c, 0x6f, 0x61, - 0x75, 0x74, 0x68, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x08, 0x69, 0x64, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, - 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, 0x07, 0x69, 0x64, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x30, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, - 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x16, 0x0a, 0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, 0x8d, 0x0a, 0x0a, - 0x0c, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, - 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, - 0x70, 0x55, 0x72, 0x69, 0x52, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x15, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x66, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x75, 0x72, 0x69, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x36, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, + 0x33, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, + 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd9, 0x05, 0x0a, 0x11, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x24, 0x0a, 0x09, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x67, 0x0a, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, + 0x76, 0x33, 0x2e, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x67, 0x0a, 0x0b, 0x68, 0x6d, 0x61, + 0x63, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x64, 0x73, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, + 0x01, 0x02, 0x10, 0x01, 0x48, 0x00, 0x52, 0x0a, 0x68, 0x6d, 0x61, 0x63, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x12, 0x69, 0x0a, 0x0c, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0b, - 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x0c, 0x72, - 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, 0x69, 0x12, 0x60, 0x0a, 0x15, 0x72, 0x65, 0x64, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x50, - 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x13, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x50, 0x61, - 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x0c, 0x73, 0x69, 0x67, - 0x6e, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, - 0x69, 0x67, 0x6e, 0x6f, 0x75, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, - 0x64, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x42, 0x0a, 0x1d, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x1b, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x12, 0x56, 0x0a, 0x14, 0x70, 0x61, 0x73, 0x73, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, - 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x72, 0x52, 0x12, 0x70, 0x61, 0x73, 0x73, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, - 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, - 0x75, 0x74, 0x68, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x65, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x61, 0x75, 0x74, 0x68, - 0x32, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x46, - 0x0a, 0x11, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x47, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, - 0x58, 0x0a, 0x15, 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x72, 0x52, 0x13, 0x64, 0x65, 0x6e, 0x79, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x61, 0x0a, 0x20, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, 0x3c, 0x0a, 0x1b, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x17, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x75, - 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x52, 0x4c, 0x5f, 0x45, 0x4e, - 0x43, 0x4f, 0x44, 0x45, 0x44, 0x5f, 0x42, 0x4f, 0x44, 0x59, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, - 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x10, 0x01, 0x22, 0x57, 0x0a, 0x06, - 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x12, 0x4d, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, 0x33, - 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0xa6, 0x01, 0x0a, 0x35, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, 0x33, 0x42, - 0x0a, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x57, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, - 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, - 0x74, 0x74, 0x70, 0x2f, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2f, 0x76, 0x33, 0x3b, 0x6f, 0x61, - 0x75, 0x74, 0x68, 0x32, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x61, 0x6c, 0x73, 0x2e, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x1a, 0xa3, 0x02, 0x0a, 0x0b, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x0c, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, + 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, 0x0b, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x0a, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x68, 0x6d, 0x61, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, + 0xd0, 0x01, 0x01, 0x52, 0x09, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x48, 0x6d, 0x61, 0x63, 0x12, 0x30, + 0x0a, 0x0d, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, + 0x01, 0x01, 0x52, 0x0c, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x12, 0x26, 0x0a, 0x08, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, + 0x07, 0x69, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x30, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, 0x0c, 0x72, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2c, 0x0a, 0x0b, 0x6f, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x01, 0xd0, 0x01, 0x01, 0x52, 0x0a, 0x6f, 0x61, + 0x75, 0x74, 0x68, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x42, 0x16, 0x0a, 0x0f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x03, 0xf8, 0x42, 0x01, + 0x22, 0xe1, 0x0b, 0x0a, 0x0c, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x44, 0x0a, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x48, 0x74, 0x74, 0x70, 0x55, 0x72, 0x69, 0x52, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x45, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, + 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x0b, 0x72, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3e, 0x0a, + 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x15, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x66, 0x0a, + 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, + 0x74, 0x70, 0x2e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x41, 0x75, + 0x74, 0x68, 0x32, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x0c, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x72, + 0x69, 0x12, 0x60, 0x0a, 0x15, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x13, + 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x6f, 0x75, 0x74, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, + 0x33, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x6f, 0x75, 0x74, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x42, 0x65, 0x61, 0x72, 0x65, + 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x42, 0x0a, 0x1d, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x14, 0x70, 0x61, + 0x73, 0x73, 0x5f, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x12, + 0x70, 0x61, 0x73, 0x73, 0x54, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x53, 0x63, 0x6f, + 0x70, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x12, 0x65, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, + 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, 0x33, 0x2e, 0x4f, + 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x75, 0x74, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, + 0x61, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x11, 0x75, 0x73, 0x65, 0x5f, + 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0f, 0x75, 0x73, 0x65, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x47, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, 0x58, 0x0a, 0x15, 0x64, 0x65, 0x6e, + 0x79, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x13, + 0x64, 0x65, 0x6e, 0x79, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x72, 0x12, 0x61, 0x0a, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x45, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, 0x3c, 0x0a, 0x1b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, + 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x49, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x53, 0x65, 0x74, 0x43, 0x6f, + 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x44, 0x0a, 0x1f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x74, + 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x46, 0x0a, 0x20, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6f, 0x6b, + 0x69, 0x65, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, + 0x0a, 0x10, 0x55, 0x52, 0x4c, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x45, 0x44, 0x5f, 0x42, 0x4f, + 0x44, 0x59, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x41, 0x55, + 0x54, 0x48, 0x10, 0x01, 0x22, 0x57, 0x0a, 0x06, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x12, 0x4d, + 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, + 0x61, 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0xa6, 0x01, + 0x0a, 0x35, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x61, + 0x75, 0x74, 0x68, 0x32, 0x2e, 0x76, 0x33, 0x42, 0x0a, 0x4f, 0x61, 0x75, 0x74, 0x68, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x57, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6f, 0x61, 0x75, 0x74, + 0x68, 0x32, 0x2f, 0x76, 0x33, 0x3b, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x32, 0x76, 0x33, 0xba, 0x80, + 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -727,31 +800,33 @@ var file_envoy_extensions_filters_http_oauth2_v3_oauth_proto_goTypes = []interfa (*OAuth2Credentials_CookieNames)(nil), // 4: envoy.extensions.filters.http.oauth2.v3.OAuth2Credentials.CookieNames (*v3.SdsSecretConfig)(nil), // 5: envoy.extensions.transport_sockets.tls.v3.SdsSecretConfig (*v31.HttpUri)(nil), // 6: envoy.config.core.v3.HttpUri - (*v32.PathMatcher)(nil), // 7: envoy.type.matcher.v3.PathMatcher - (*v33.HeaderMatcher)(nil), // 8: envoy.config.route.v3.HeaderMatcher - (*wrapperspb.BoolValue)(nil), // 9: google.protobuf.BoolValue - (*durationpb.Duration)(nil), // 10: google.protobuf.Duration + (*v31.RetryPolicy)(nil), // 7: envoy.config.core.v3.RetryPolicy + (*v32.PathMatcher)(nil), // 8: envoy.type.matcher.v3.PathMatcher + (*v33.HeaderMatcher)(nil), // 9: envoy.config.route.v3.HeaderMatcher + (*wrapperspb.BoolValue)(nil), // 10: google.protobuf.BoolValue + (*durationpb.Duration)(nil), // 11: google.protobuf.Duration } var file_envoy_extensions_filters_http_oauth2_v3_oauth_proto_depIdxs = []int32{ 5, // 0: envoy.extensions.filters.http.oauth2.v3.OAuth2Credentials.token_secret:type_name -> envoy.extensions.transport_sockets.tls.v3.SdsSecretConfig 5, // 1: envoy.extensions.filters.http.oauth2.v3.OAuth2Credentials.hmac_secret:type_name -> envoy.extensions.transport_sockets.tls.v3.SdsSecretConfig 4, // 2: envoy.extensions.filters.http.oauth2.v3.OAuth2Credentials.cookie_names:type_name -> envoy.extensions.filters.http.oauth2.v3.OAuth2Credentials.CookieNames 6, // 3: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.token_endpoint:type_name -> envoy.config.core.v3.HttpUri - 1, // 4: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.credentials:type_name -> envoy.extensions.filters.http.oauth2.v3.OAuth2Credentials - 7, // 5: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.redirect_path_matcher:type_name -> envoy.type.matcher.v3.PathMatcher - 7, // 6: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.signout_path:type_name -> envoy.type.matcher.v3.PathMatcher - 8, // 7: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.pass_through_matcher:type_name -> envoy.config.route.v3.HeaderMatcher - 0, // 8: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.auth_type:type_name -> envoy.extensions.filters.http.oauth2.v3.OAuth2Config.AuthType - 9, // 9: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.use_refresh_token:type_name -> google.protobuf.BoolValue - 10, // 10: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.default_expires_in:type_name -> google.protobuf.Duration - 8, // 11: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.deny_redirect_matcher:type_name -> envoy.config.route.v3.HeaderMatcher - 10, // 12: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.default_refresh_token_expires_in:type_name -> google.protobuf.Duration - 2, // 13: envoy.extensions.filters.http.oauth2.v3.OAuth2.config:type_name -> envoy.extensions.filters.http.oauth2.v3.OAuth2Config - 14, // [14:14] is the sub-list for method output_type - 14, // [14:14] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 7, // 4: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.retry_policy:type_name -> envoy.config.core.v3.RetryPolicy + 1, // 5: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.credentials:type_name -> envoy.extensions.filters.http.oauth2.v3.OAuth2Credentials + 8, // 6: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.redirect_path_matcher:type_name -> envoy.type.matcher.v3.PathMatcher + 8, // 7: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.signout_path:type_name -> envoy.type.matcher.v3.PathMatcher + 9, // 8: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.pass_through_matcher:type_name -> envoy.config.route.v3.HeaderMatcher + 0, // 9: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.auth_type:type_name -> envoy.extensions.filters.http.oauth2.v3.OAuth2Config.AuthType + 10, // 10: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.use_refresh_token:type_name -> google.protobuf.BoolValue + 11, // 11: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.default_expires_in:type_name -> google.protobuf.Duration + 9, // 12: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.deny_redirect_matcher:type_name -> envoy.config.route.v3.HeaderMatcher + 11, // 13: envoy.extensions.filters.http.oauth2.v3.OAuth2Config.default_refresh_token_expires_in:type_name -> google.protobuf.Duration + 2, // 14: envoy.extensions.filters.http.oauth2.v3.OAuth2.config:type_name -> envoy.extensions.filters.http.oauth2.v3.OAuth2Config + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_envoy_extensions_filters_http_oauth2_v3_oauth_proto_init() } diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3/oauth.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3/oauth.pb.validate.go index d14241dd3b..2438bb6246 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3/oauth.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3/oauth.pb.validate.go @@ -137,6 +137,8 @@ func (m *OAuth2Credentials) validate(all bool) error { } } + // no validation rules for CookieDomain + oneofTokenFormationPresent := false switch v := m.TokenFormation.(type) { case *OAuth2Credentials_HmacSecret: @@ -337,6 +339,35 @@ func (m *OAuth2Config) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetRetryPolicy()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, OAuth2ConfigValidationError{ + field: "RetryPolicy", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, OAuth2ConfigValidationError{ + field: "RetryPolicy", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetRetryPolicy()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return OAuth2ConfigValidationError{ + field: "RetryPolicy", + reason: "embedded message failed validation", + cause: err, + } + } + } + if utf8.RuneCountInString(m.GetAuthorizationEndpoint()) < 1 { err := OAuth2ConfigValidationError{ field: "AuthorizationEndpoint", @@ -651,6 +682,10 @@ func (m *OAuth2Config) validate(all bool) error { // no validation rules for DisableIdTokenSetCookie + // no validation rules for DisableAccessTokenSetCookie + + // no validation rules for DisableRefreshTokenSetCookie + if len(errors) > 0 { return OAuth2ConfigMultiError(errors) } @@ -952,6 +987,21 @@ func (m *OAuth2Credentials_CookieNames) validate(all bool) error { } + if m.GetOauthNonce() != "" { + + if !_OAuth2Credentials_CookieNames_OauthNonce_Pattern.MatchString(m.GetOauthNonce()) { + err := OAuth2Credentials_CookieNamesValidationError{ + field: "OauthNonce", + reason: "value does not match regex pattern \"^:?[0-9a-zA-Z!#$%&'*+-.^_|~`]+$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + if len(errors) > 0 { return OAuth2Credentials_CookieNamesMultiError(errors) } @@ -1042,3 +1092,5 @@ var _OAuth2Credentials_CookieNames_OauthExpires_Pattern = regexp.MustCompile("^: var _OAuth2Credentials_CookieNames_IdToken_Pattern = regexp.MustCompile("^:?[0-9a-zA-Z!#$%&'*+-.^_|~`]+$") var _OAuth2Credentials_CookieNames_RefreshToken_Pattern = regexp.MustCompile("^:?[0-9a-zA-Z!#$%&'*+-.^_|~`]+$") + +var _OAuth2Credentials_CookieNames_OauthNonce_Pattern = regexp.MustCompile("^:?[0-9a-zA-Z!#$%&'*+-.^_|~`]+$") diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3/config.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3/config.pb.go new file mode 100644 index 0000000000..c1e2f93bf8 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3/config.pb.go @@ -0,0 +1,526 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/filters/http/proto_message_extraction/v3/config.proto + +package proto_message_extractionv3 + +import ( + v3 "github.com/cilium/proxy/go/envoy/config/core/v3" + _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/cncf/xds/go/xds/annotations/v3" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type ProtoMessageExtractionConfig_ExtractMode int32 + +const ( + ProtoMessageExtractionConfig_ExtractMode_UNSPECIFIED ProtoMessageExtractionConfig_ExtractMode = 0 + // The filter will extract the first and the last message for + // for streaming cases, containing + // client-side streaming, server-side streaming or bi-directional streaming. + ProtoMessageExtractionConfig_FIRST_AND_LAST ProtoMessageExtractionConfig_ExtractMode = 1 +) + +// Enum value maps for ProtoMessageExtractionConfig_ExtractMode. +var ( + ProtoMessageExtractionConfig_ExtractMode_name = map[int32]string{ + 0: "ExtractMode_UNSPECIFIED", + 1: "FIRST_AND_LAST", + } + ProtoMessageExtractionConfig_ExtractMode_value = map[string]int32{ + "ExtractMode_UNSPECIFIED": 0, + "FIRST_AND_LAST": 1, + } +) + +func (x ProtoMessageExtractionConfig_ExtractMode) Enum() *ProtoMessageExtractionConfig_ExtractMode { + p := new(ProtoMessageExtractionConfig_ExtractMode) + *p = x + return p +} + +func (x ProtoMessageExtractionConfig_ExtractMode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ProtoMessageExtractionConfig_ExtractMode) Descriptor() protoreflect.EnumDescriptor { + return file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_enumTypes[0].Descriptor() +} + +func (ProtoMessageExtractionConfig_ExtractMode) Type() protoreflect.EnumType { + return &file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_enumTypes[0] +} + +func (x ProtoMessageExtractionConfig_ExtractMode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ProtoMessageExtractionConfig_ExtractMode.Descriptor instead. +func (ProtoMessageExtractionConfig_ExtractMode) EnumDescriptor() ([]byte, []int) { + return file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescGZIP(), []int{0, 0} +} + +type MethodExtraction_ExtractDirective int32 + +const ( + MethodExtraction_ExtractDirective_UNSPECIFIED MethodExtraction_ExtractDirective = 0 + // The value of this field will be extracted. + MethodExtraction_EXTRACT MethodExtraction_ExtractDirective = 1 + // It should be only annotated on Message type fields so if the field isn't + // empty, an empty Struct will be extracted. + MethodExtraction_EXTRACT_REDACT MethodExtraction_ExtractDirective = 2 +) + +// Enum value maps for MethodExtraction_ExtractDirective. +var ( + MethodExtraction_ExtractDirective_name = map[int32]string{ + 0: "ExtractDirective_UNSPECIFIED", + 1: "EXTRACT", + 2: "EXTRACT_REDACT", + } + MethodExtraction_ExtractDirective_value = map[string]int32{ + "ExtractDirective_UNSPECIFIED": 0, + "EXTRACT": 1, + "EXTRACT_REDACT": 2, + } +) + +func (x MethodExtraction_ExtractDirective) Enum() *MethodExtraction_ExtractDirective { + p := new(MethodExtraction_ExtractDirective) + *p = x + return p +} + +func (x MethodExtraction_ExtractDirective) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (MethodExtraction_ExtractDirective) Descriptor() protoreflect.EnumDescriptor { + return file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_enumTypes[1].Descriptor() +} + +func (MethodExtraction_ExtractDirective) Type() protoreflect.EnumType { + return &file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_enumTypes[1] +} + +func (x MethodExtraction_ExtractDirective) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use MethodExtraction_ExtractDirective.Descriptor instead. +func (MethodExtraction_ExtractDirective) EnumDescriptor() ([]byte, []int) { + return file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescGZIP(), []int{1, 0} +} + +type ProtoMessageExtractionConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The proto descriptor set binary for the gRPC services. + // + // Types that are assignable to DescriptorSet: + // + // *ProtoMessageExtractionConfig_DataSource + // *ProtoMessageExtractionConfig_ProtoDescriptorTypedMetadata + DescriptorSet isProtoMessageExtractionConfig_DescriptorSet `protobuf_oneof:"descriptor_set"` + Mode ProtoMessageExtractionConfig_ExtractMode `protobuf:"varint,3,opt,name=mode,proto3,enum=envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig_ExtractMode" json:"mode,omitempty"` + // Specify the message extraction info. + // The key is the fully qualified gRPC method name. + // “${package}.${Service}.${Method}“, like + // “endpoints.examples.bookstore.BookStore.GetShelf“ + // + // The value is the message extraction information for individual gRPC + // methods. + ExtractionByMethod map[string]*MethodExtraction `protobuf:"bytes,4,rep,name=extraction_by_method,json=extractionByMethod,proto3" json:"extraction_by_method,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ProtoMessageExtractionConfig) Reset() { + *x = ProtoMessageExtractionConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProtoMessageExtractionConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProtoMessageExtractionConfig) ProtoMessage() {} + +func (x *ProtoMessageExtractionConfig) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProtoMessageExtractionConfig.ProtoReflect.Descriptor instead. +func (*ProtoMessageExtractionConfig) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescGZIP(), []int{0} +} + +func (m *ProtoMessageExtractionConfig) GetDescriptorSet() isProtoMessageExtractionConfig_DescriptorSet { + if m != nil { + return m.DescriptorSet + } + return nil +} + +func (x *ProtoMessageExtractionConfig) GetDataSource() *v3.DataSource { + if x, ok := x.GetDescriptorSet().(*ProtoMessageExtractionConfig_DataSource); ok { + return x.DataSource + } + return nil +} + +func (x *ProtoMessageExtractionConfig) GetProtoDescriptorTypedMetadata() string { + if x, ok := x.GetDescriptorSet().(*ProtoMessageExtractionConfig_ProtoDescriptorTypedMetadata); ok { + return x.ProtoDescriptorTypedMetadata + } + return "" +} + +func (x *ProtoMessageExtractionConfig) GetMode() ProtoMessageExtractionConfig_ExtractMode { + if x != nil { + return x.Mode + } + return ProtoMessageExtractionConfig_ExtractMode_UNSPECIFIED +} + +func (x *ProtoMessageExtractionConfig) GetExtractionByMethod() map[string]*MethodExtraction { + if x != nil { + return x.ExtractionByMethod + } + return nil +} + +type isProtoMessageExtractionConfig_DescriptorSet interface { + isProtoMessageExtractionConfig_DescriptorSet() +} + +type ProtoMessageExtractionConfig_DataSource struct { + // It could be passed by a local file through “Datasource.filename“ or + // embedded in the “Datasource.inline_bytes“. + DataSource *v3.DataSource `protobuf:"bytes,1,opt,name=data_source,json=dataSource,proto3,oneof"` +} + +type ProtoMessageExtractionConfig_ProtoDescriptorTypedMetadata struct { + // Unimplemented, the key of proto descriptor TypedMetadata. + // Among filters depending on the proto descriptor, we can have a + // TypedMetadata for proto descriptors, so that these filters can share one + // copy of proto descriptor in memory. + ProtoDescriptorTypedMetadata string `protobuf:"bytes,2,opt,name=proto_descriptor_typed_metadata,json=protoDescriptorTypedMetadata,proto3,oneof"` +} + +func (*ProtoMessageExtractionConfig_DataSource) isProtoMessageExtractionConfig_DescriptorSet() {} + +func (*ProtoMessageExtractionConfig_ProtoDescriptorTypedMetadata) isProtoMessageExtractionConfig_DescriptorSet() { +} + +// This message can be used to support per route config approach later even +// though the Istio doesn't support that so far. +type MethodExtraction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The mapping of field path to its ExtractDirective for request messages + RequestExtractionByField map[string]MethodExtraction_ExtractDirective `protobuf:"bytes,2,rep,name=request_extraction_by_field,json=requestExtractionByField,proto3" json:"request_extraction_by_field,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction_ExtractDirective"` + // The mapping of field path to its ExtractDirective for response messages + ResponseExtractionByField map[string]MethodExtraction_ExtractDirective `protobuf:"bytes,3,rep,name=response_extraction_by_field,json=responseExtractionByField,proto3" json:"response_extraction_by_field,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction_ExtractDirective"` +} + +func (x *MethodExtraction) Reset() { + *x = MethodExtraction{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MethodExtraction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MethodExtraction) ProtoMessage() {} + +func (x *MethodExtraction) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MethodExtraction.ProtoReflect.Descriptor instead. +func (*MethodExtraction) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescGZIP(), []int{1} +} + +func (x *MethodExtraction) GetRequestExtractionByField() map[string]MethodExtraction_ExtractDirective { + if x != nil { + return x.RequestExtractionByField + } + return nil +} + +func (x *MethodExtraction) GetResponseExtractionByField() map[string]MethodExtraction_ExtractDirective { + if x != nil { + return x.ResponseExtractionByField + } + return nil +} + +var File_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto protoreflect.FileDescriptor + +var file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDesc = []byte{ + 0x0a, 0x46, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x39, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x78, 0x64, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb0, 0x05, 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x43, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, + 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x1f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x77, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x63, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, + 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0xa1, 0x01, 0x0a, + 0x14, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x6f, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x79, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x1a, 0x92, 0x01, 0x0a, 0x17, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x79, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x61, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4b, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3e, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x4d, + 0x6f, 0x64, 0x65, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x4c, + 0x41, 0x53, 0x54, 0x10, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x22, 0x9b, 0x06, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0xa8, 0x01, 0x0a, + 0x1b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x69, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, + 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x18, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0xab, 0x01, 0x0a, 0x1c, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x62, 0x79, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x6a, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x19, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x1a, 0xa9, 0x01, 0x0a, 0x1d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x72, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x45, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0xaa, 0x01, 0x0a, 0x1e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x78, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x79, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x72, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x55, + 0x0a, 0x10, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x58, 0x54, 0x52, 0x41, 0x43, 0x54, 0x10, + 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x45, 0x58, 0x54, 0x52, 0x41, 0x43, 0x54, 0x5f, 0x52, 0x45, 0x44, + 0x41, 0x43, 0x54, 0x10, 0x02, 0x42, 0xe5, 0x01, 0x0a, 0x47, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x33, 0x42, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x7b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x76, 0x33, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x76, 0x33, 0xba, 0x80, 0xc8, + 0xd1, 0x06, 0x02, 0x10, 0x02, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescOnce sync.Once + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescData = file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDesc +) + +func file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescGZIP() []byte { + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescOnce.Do(func() { + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescData) + }) + return file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDescData +} + +var file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_goTypes = []interface{}{ + (ProtoMessageExtractionConfig_ExtractMode)(0), // 0: envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig.ExtractMode + (MethodExtraction_ExtractDirective)(0), // 1: envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.ExtractDirective + (*ProtoMessageExtractionConfig)(nil), // 2: envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig + (*MethodExtraction)(nil), // 3: envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction + nil, // 4: envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig.ExtractionByMethodEntry + nil, // 5: envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.RequestExtractionByFieldEntry + nil, // 6: envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.ResponseExtractionByFieldEntry + (*v3.DataSource)(nil), // 7: envoy.config.core.v3.DataSource +} +var file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_depIdxs = []int32{ + 7, // 0: envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig.data_source:type_name -> envoy.config.core.v3.DataSource + 0, // 1: envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig.mode:type_name -> envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig.ExtractMode + 4, // 2: envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig.extraction_by_method:type_name -> envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig.ExtractionByMethodEntry + 5, // 3: envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.request_extraction_by_field:type_name -> envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.RequestExtractionByFieldEntry + 6, // 4: envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.response_extraction_by_field:type_name -> envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.ResponseExtractionByFieldEntry + 3, // 5: envoy.extensions.filters.http.proto_message_extraction.v3.ProtoMessageExtractionConfig.ExtractionByMethodEntry.value:type_name -> envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction + 1, // 6: envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.RequestExtractionByFieldEntry.value:type_name -> envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.ExtractDirective + 1, // 7: envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.ResponseExtractionByFieldEntry.value:type_name -> envoy.extensions.filters.http.proto_message_extraction.v3.MethodExtraction.ExtractDirective + 8, // [8:8] is the sub-list for method output_type + 8, // [8:8] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_init() } +func file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_init() { + if File_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProtoMessageExtractionConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MethodExtraction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*ProtoMessageExtractionConfig_DataSource)(nil), + (*ProtoMessageExtractionConfig_ProtoDescriptorTypedMetadata)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDesc, + NumEnums: 2, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_goTypes, + DependencyIndexes: file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_depIdxs, + EnumInfos: file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_enumTypes, + MessageInfos: file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_msgTypes, + }.Build() + File_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto = out.File + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_rawDesc = nil + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_goTypes = nil + file_envoy_extensions_filters_http_proto_message_extraction_v3_config_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3/config.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3/config.pb.validate.go new file mode 100644 index 0000000000..6baef2f4e3 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3/config.pb.validate.go @@ -0,0 +1,349 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/filters/http/proto_message_extraction/v3/config.proto + +package proto_message_extractionv3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on ProtoMessageExtractionConfig with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *ProtoMessageExtractionConfig) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ProtoMessageExtractionConfig with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ProtoMessageExtractionConfigMultiError, or nil if none found. +func (m *ProtoMessageExtractionConfig) ValidateAll() error { + return m.validate(true) +} + +func (m *ProtoMessageExtractionConfig) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Mode + + { + sorted_keys := make([]string, len(m.GetExtractionByMethod())) + i := 0 + for key := range m.GetExtractionByMethod() { + sorted_keys[i] = key + i++ + } + sort.Slice(sorted_keys, func(i, j int) bool { return sorted_keys[i] < sorted_keys[j] }) + for _, key := range sorted_keys { + val := m.GetExtractionByMethod()[key] + _ = val + + // no validation rules for ExtractionByMethod[key] + + if all { + switch v := interface{}(val).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ProtoMessageExtractionConfigValidationError{ + field: fmt.Sprintf("ExtractionByMethod[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ProtoMessageExtractionConfigValidationError{ + field: fmt.Sprintf("ExtractionByMethod[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(val).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ProtoMessageExtractionConfigValidationError{ + field: fmt.Sprintf("ExtractionByMethod[%v]", key), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + } + + switch v := m.DescriptorSet.(type) { + case *ProtoMessageExtractionConfig_DataSource: + if v == nil { + err := ProtoMessageExtractionConfigValidationError{ + field: "DescriptorSet", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetDataSource()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ProtoMessageExtractionConfigValidationError{ + field: "DataSource", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ProtoMessageExtractionConfigValidationError{ + field: "DataSource", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetDataSource()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ProtoMessageExtractionConfigValidationError{ + field: "DataSource", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *ProtoMessageExtractionConfig_ProtoDescriptorTypedMetadata: + if v == nil { + err := ProtoMessageExtractionConfigValidationError{ + field: "DescriptorSet", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + // no validation rules for ProtoDescriptorTypedMetadata + default: + _ = v // ensures v is used + } + + if len(errors) > 0 { + return ProtoMessageExtractionConfigMultiError(errors) + } + + return nil +} + +// ProtoMessageExtractionConfigMultiError is an error wrapping multiple +// validation errors returned by ProtoMessageExtractionConfig.ValidateAll() if +// the designated constraints aren't met. +type ProtoMessageExtractionConfigMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ProtoMessageExtractionConfigMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ProtoMessageExtractionConfigMultiError) AllErrors() []error { return m } + +// ProtoMessageExtractionConfigValidationError is the validation error returned +// by ProtoMessageExtractionConfig.Validate if the designated constraints +// aren't met. +type ProtoMessageExtractionConfigValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ProtoMessageExtractionConfigValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ProtoMessageExtractionConfigValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ProtoMessageExtractionConfigValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ProtoMessageExtractionConfigValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ProtoMessageExtractionConfigValidationError) ErrorName() string { + return "ProtoMessageExtractionConfigValidationError" +} + +// Error satisfies the builtin error interface +func (e ProtoMessageExtractionConfigValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sProtoMessageExtractionConfig.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ProtoMessageExtractionConfigValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ProtoMessageExtractionConfigValidationError{} + +// Validate checks the field values on MethodExtraction with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *MethodExtraction) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on MethodExtraction with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// MethodExtractionMultiError, or nil if none found. +func (m *MethodExtraction) ValidateAll() error { + return m.validate(true) +} + +func (m *MethodExtraction) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for RequestExtractionByField + + // no validation rules for ResponseExtractionByField + + if len(errors) > 0 { + return MethodExtractionMultiError(errors) + } + + return nil +} + +// MethodExtractionMultiError is an error wrapping multiple validation errors +// returned by MethodExtraction.ValidateAll() if the designated constraints +// aren't met. +type MethodExtractionMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m MethodExtractionMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m MethodExtractionMultiError) AllErrors() []error { return m } + +// MethodExtractionValidationError is the validation error returned by +// MethodExtraction.Validate if the designated constraints aren't met. +type MethodExtractionValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MethodExtractionValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MethodExtractionValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MethodExtractionValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MethodExtractionValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MethodExtractionValidationError) ErrorName() string { return "MethodExtractionValidationError" } + +// Error satisfies the builtin error interface +func (e MethodExtractionValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMethodExtraction.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MethodExtractionValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MethodExtractionValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.go new file mode 100644 index 0000000000..8e48135163 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.go @@ -0,0 +1,334 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/filters/network/generic_proxy/action/v3/action.proto + +package actionv3 + +import ( + v3 "github.com/cilium/proxy/go/envoy/config/core/v3" + v31 "github.com/cilium/proxy/go/envoy/config/route/v3" + _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/cncf/xds/go/xds/annotations/v3" + _ "github.com/envoyproxy/protoc-gen-validate/validate" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + durationpb "google.golang.org/protobuf/types/known/durationpb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Configuration for the route match action. +// [#next-free-field: 8] +type RouteAction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the route action. This should be unique across all route actions. + Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"` + // Types that are assignable to ClusterSpecifier: + // + // *RouteAction_Cluster + // *RouteAction_WeightedClusters + ClusterSpecifier isRouteAction_ClusterSpecifier `protobuf_oneof:"cluster_specifier"` + // Route metadata. + Metadata *v3.Metadata `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` + // Route level config for L7 generic filters. The key should be the related :ref:`extension name + // ` in the :ref:`generic filters + // `. + PerFilterConfig map[string]*anypb.Any `protobuf:"bytes,4,rep,name=per_filter_config,json=perFilterConfig,proto3" json:"per_filter_config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Specifies the upstream timeout for the route. If not specified, the default is 15s. This + // spans between the point at which the entire downstream request (i.e. end-of-stream) has been + // processed and when the upstream response has been completely processed. A value of 0 will + // disable the route's timeout. + Timeout *durationpb.Duration `protobuf:"bytes,6,opt,name=timeout,proto3" json:"timeout,omitempty"` + // Specifies the retry policy for the route. If not specified, then no retries will be performed. + // + // .. note:: + // + // Only simplest retry policy is supported and only ``num_retries`` field is used for generic + // proxy. The default value for ``num_retries`` is 1 means that the request will be tried once + // and no additional retries will be performed. + RetryPolicy *v3.RetryPolicy `protobuf:"bytes,7,opt,name=retry_policy,json=retryPolicy,proto3" json:"retry_policy,omitempty"` +} + +func (x *RouteAction) Reset() { + *x = RouteAction{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RouteAction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RouteAction) ProtoMessage() {} + +func (x *RouteAction) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RouteAction.ProtoReflect.Descriptor instead. +func (*RouteAction) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDescGZIP(), []int{0} +} + +func (x *RouteAction) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (m *RouteAction) GetClusterSpecifier() isRouteAction_ClusterSpecifier { + if m != nil { + return m.ClusterSpecifier + } + return nil +} + +func (x *RouteAction) GetCluster() string { + if x, ok := x.GetClusterSpecifier().(*RouteAction_Cluster); ok { + return x.Cluster + } + return "" +} + +func (x *RouteAction) GetWeightedClusters() *v31.WeightedCluster { + if x, ok := x.GetClusterSpecifier().(*RouteAction_WeightedClusters); ok { + return x.WeightedClusters + } + return nil +} + +func (x *RouteAction) GetMetadata() *v3.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *RouteAction) GetPerFilterConfig() map[string]*anypb.Any { + if x != nil { + return x.PerFilterConfig + } + return nil +} + +func (x *RouteAction) GetTimeout() *durationpb.Duration { + if x != nil { + return x.Timeout + } + return nil +} + +func (x *RouteAction) GetRetryPolicy() *v3.RetryPolicy { + if x != nil { + return x.RetryPolicy + } + return nil +} + +type isRouteAction_ClusterSpecifier interface { + isRouteAction_ClusterSpecifier() +} + +type RouteAction_Cluster struct { + // Indicates the upstream cluster to which the request should be routed. + Cluster string `protobuf:"bytes,1,opt,name=cluster,proto3,oneof"` +} + +type RouteAction_WeightedClusters struct { + // [#not-implemented-hide:] + // Multiple upstream clusters can be specified for a given route. The request is routed to one + // of the upstream clusters based on weights assigned to each cluster. + // Currently ClusterWeight only supports the name and weight fields. + WeightedClusters *v31.WeightedCluster `protobuf:"bytes,2,opt,name=weighted_clusters,json=weightedClusters,proto3,oneof"` +} + +func (*RouteAction_Cluster) isRouteAction_ClusterSpecifier() {} + +func (*RouteAction_WeightedClusters) isRouteAction_ClusterSpecifier() {} + +var File_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto protoreflect.FileDescriptor + +var file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDesc = []byte{ + 0x0a, 0x45, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x38, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, + 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x33, 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, + 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x2c, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x78, 0x64, 0x73, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, + 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc8, 0x04, 0x0a, 0x0b, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x55, 0x0a, 0x11, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, + 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x3a, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x86, 0x01, 0x0a, 0x11, 0x70, 0x65, 0x72, 0x5f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x5a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0f, 0x70, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x44, 0x0a, 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x33, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0b, + 0x72, 0x65, 0x74, 0x72, 0x79, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x58, 0x0a, 0x14, 0x50, + 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x18, 0x0a, 0x11, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x42, + 0xd1, 0x01, 0x0a, 0x46, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x68, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x33, 0x3b, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, + 0x02, 0x08, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDescOnce sync.Once + file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDescData = file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDesc +) + +func file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDescGZIP() []byte { + file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDescOnce.Do(func() { + file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDescData) + }) + return file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDescData +} + +var file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_goTypes = []interface{}{ + (*RouteAction)(nil), // 0: envoy.extensions.filters.network.generic_proxy.action.v3.RouteAction + nil, // 1: envoy.extensions.filters.network.generic_proxy.action.v3.RouteAction.PerFilterConfigEntry + (*v31.WeightedCluster)(nil), // 2: envoy.config.route.v3.WeightedCluster + (*v3.Metadata)(nil), // 3: envoy.config.core.v3.Metadata + (*durationpb.Duration)(nil), // 4: google.protobuf.Duration + (*v3.RetryPolicy)(nil), // 5: envoy.config.core.v3.RetryPolicy + (*anypb.Any)(nil), // 6: google.protobuf.Any +} +var file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_depIdxs = []int32{ + 2, // 0: envoy.extensions.filters.network.generic_proxy.action.v3.RouteAction.weighted_clusters:type_name -> envoy.config.route.v3.WeightedCluster + 3, // 1: envoy.extensions.filters.network.generic_proxy.action.v3.RouteAction.metadata:type_name -> envoy.config.core.v3.Metadata + 1, // 2: envoy.extensions.filters.network.generic_proxy.action.v3.RouteAction.per_filter_config:type_name -> envoy.extensions.filters.network.generic_proxy.action.v3.RouteAction.PerFilterConfigEntry + 4, // 3: envoy.extensions.filters.network.generic_proxy.action.v3.RouteAction.timeout:type_name -> google.protobuf.Duration + 5, // 4: envoy.extensions.filters.network.generic_proxy.action.v3.RouteAction.retry_policy:type_name -> envoy.config.core.v3.RetryPolicy + 6, // 5: envoy.extensions.filters.network.generic_proxy.action.v3.RouteAction.PerFilterConfigEntry.value:type_name -> google.protobuf.Any + 6, // [6:6] is the sub-list for method output_type + 6, // [6:6] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_init() } +func file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_init() { + if File_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RouteAction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*RouteAction_Cluster)(nil), + (*RouteAction_WeightedClusters)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_goTypes, + DependencyIndexes: file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_depIdxs, + MessageInfos: file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_msgTypes, + }.Build() + File_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto = out.File + file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_rawDesc = nil + file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_goTypes = nil + file_envoy_extensions_filters_network_generic_proxy_action_v3_action_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.validate.go new file mode 100644 index 0000000000..d87b455cb1 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.validate.go @@ -0,0 +1,341 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/filters/network/generic_proxy/action/v3/action.proto + +package actionv3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on RouteAction with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *RouteAction) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RouteAction with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in RouteActionMultiError, or +// nil if none found. +func (m *RouteAction) ValidateAll() error { + return m.validate(true) +} + +func (m *RouteAction) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Name + + if all { + switch v := interface{}(m.GetMetadata()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: "Metadata", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: "Metadata", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetadata()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RouteActionValidationError{ + field: "Metadata", + reason: "embedded message failed validation", + cause: err, + } + } + } + + { + sorted_keys := make([]string, len(m.GetPerFilterConfig())) + i := 0 + for key := range m.GetPerFilterConfig() { + sorted_keys[i] = key + i++ + } + sort.Slice(sorted_keys, func(i, j int) bool { return sorted_keys[i] < sorted_keys[j] }) + for _, key := range sorted_keys { + val := m.GetPerFilterConfig()[key] + _ = val + + // no validation rules for PerFilterConfig[key] + + if all { + switch v := interface{}(val).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: fmt.Sprintf("PerFilterConfig[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: fmt.Sprintf("PerFilterConfig[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(val).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RouteActionValidationError{ + field: fmt.Sprintf("PerFilterConfig[%v]", key), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + } + + if all { + switch v := interface{}(m.GetTimeout()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: "Timeout", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: "Timeout", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTimeout()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RouteActionValidationError{ + field: "Timeout", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetRetryPolicy()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: "RetryPolicy", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: "RetryPolicy", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetRetryPolicy()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RouteActionValidationError{ + field: "RetryPolicy", + reason: "embedded message failed validation", + cause: err, + } + } + } + + oneofClusterSpecifierPresent := false + switch v := m.ClusterSpecifier.(type) { + case *RouteAction_Cluster: + if v == nil { + err := RouteActionValidationError{ + field: "ClusterSpecifier", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + oneofClusterSpecifierPresent = true + // no validation rules for Cluster + case *RouteAction_WeightedClusters: + if v == nil { + err := RouteActionValidationError{ + field: "ClusterSpecifier", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + oneofClusterSpecifierPresent = true + + if all { + switch v := interface{}(m.GetWeightedClusters()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: "WeightedClusters", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RouteActionValidationError{ + field: "WeightedClusters", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetWeightedClusters()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RouteActionValidationError{ + field: "WeightedClusters", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used + } + if !oneofClusterSpecifierPresent { + err := RouteActionValidationError{ + field: "ClusterSpecifier", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(errors) > 0 { + return RouteActionMultiError(errors) + } + + return nil +} + +// RouteActionMultiError is an error wrapping multiple validation errors +// returned by RouteAction.ValidateAll() if the designated constraints aren't met. +type RouteActionMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RouteActionMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RouteActionMultiError) AllErrors() []error { return m } + +// RouteActionValidationError is the validation error returned by +// RouteAction.Validate if the designated constraints aren't met. +type RouteActionValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RouteActionValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RouteActionValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RouteActionValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RouteActionValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RouteActionValidationError) ErrorName() string { return "RouteActionValidationError" } + +// Error satisfies the builtin error interface +func (e RouteActionValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRouteAction.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RouteActionValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RouteActionValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.go new file mode 100644 index 0000000000..f9a92e5794 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.go @@ -0,0 +1,163 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.proto + +package dubbov3 + +import ( + _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/cncf/xds/go/xds/annotations/v3" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type DubboCodecConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DubboCodecConfig) Reset() { + *x = DubboCodecConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DubboCodecConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DubboCodecConfig) ProtoMessage() {} + +func (x *DubboCodecConfig) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DubboCodecConfig.ProtoReflect.Descriptor instead. +func (*DubboCodecConfig) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDescGZIP(), []int{0} +} + +var File_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto protoreflect.FileDescriptor + +var file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDesc = []byte{ + 0x0a, 0x4a, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x2f, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2f, 0x76, 0x33, + 0x2f, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x63, 0x73, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x78, 0x64, + 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, + 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x12, 0x0a, 0x10, + 0x44, 0x75, 0x62, 0x62, 0x6f, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x42, 0xdb, 0x01, 0x0a, 0x4c, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x76, + 0x33, 0x42, 0x0a, 0x44, 0x75, 0x62, 0x62, 0x6f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x6d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, + 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x2f, 0x64, 0x75, + 0x62, 0x62, 0x6f, 0x2f, 0x76, 0x33, 0x3b, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x76, 0x33, 0xba, 0x80, + 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDescOnce sync.Once + file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDescData = file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDesc +) + +func file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDescGZIP() []byte { + file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDescOnce.Do(func() { + file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDescData) + }) + return file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDescData +} + +var file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_goTypes = []interface{}{ + (*DubboCodecConfig)(nil), // 0: envoy.extensions.filters.network.generic_proxy.codecs.dubbo.v3.DubboCodecConfig +} +var file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_init() } +func file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_init() { + if File_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DubboCodecConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_goTypes, + DependencyIndexes: file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_depIdxs, + MessageInfos: file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_msgTypes, + }.Build() + File_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto = out.File + file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_rawDesc = nil + file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_goTypes = nil + file_envoy_extensions_filters_network_generic_proxy_codecs_dubbo_v3_dubbo_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.validate.go new file mode 100644 index 0000000000..3e7d97daec --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.validate.go @@ -0,0 +1,136 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.proto + +package dubbov3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on DubboCodecConfig with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *DubboCodecConfig) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on DubboCodecConfig with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// DubboCodecConfigMultiError, or nil if none found. +func (m *DubboCodecConfig) ValidateAll() error { + return m.validate(true) +} + +func (m *DubboCodecConfig) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return DubboCodecConfigMultiError(errors) + } + + return nil +} + +// DubboCodecConfigMultiError is an error wrapping multiple validation errors +// returned by DubboCodecConfig.ValidateAll() if the designated constraints +// aren't met. +type DubboCodecConfigMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m DubboCodecConfigMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m DubboCodecConfigMultiError) AllErrors() []error { return m } + +// DubboCodecConfigValidationError is the validation error returned by +// DubboCodecConfig.Validate if the designated constraints aren't met. +type DubboCodecConfigValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DubboCodecConfigValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DubboCodecConfigValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DubboCodecConfigValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DubboCodecConfigValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DubboCodecConfigValidationError) ErrorName() string { return "DubboCodecConfigValidationError" } + +// Error satisfies the builtin error interface +func (e DubboCodecConfigValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDubboCodecConfig.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DubboCodecConfigValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DubboCodecConfigValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.go new file mode 100644 index 0000000000..0dc6b0b061 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.go @@ -0,0 +1,221 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.proto + +package http1v3 + +import ( + _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/cncf/xds/go/xds/annotations/v3" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Configuration for HTTP codec. This HTTP1 codec is used to parse and serialize HTTP1 messages +// for the generic proxy filter. +// Any decoding error will result in the generic proxy closing the connection. +// +// .. note:: +// +// This codec only supports HTTP1.1 messages and does not support HTTP1.0 messages. And it limits +// part of the HTTP1.1 features, such as upgrade, connect, etc. +// This codec is mainly designed for the features evaluation of the generic proxy filter. Please +// be cautious when using it in production. +type Http1CodecConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // If true, the codec will parse and serialize HTTP1 messages in a single frame per message. + // + // A frame is a minimal unit of data that can be processed by the generic proxy. If false, the + // codec will parse and serialize HTTP1 messages in a streaming way. In this case, the codec + // will output multiple frames for a single HTTP1 message to the generic proxy. + // If true, the codec will buffer the entire HTTP1 message body before sending it to the generic + // proxy. This may have better performance in small message scenarios and is more friendly to + // handle the HTTP1 message body. This also may result in higher memory usage and latency if + // the message body is large. + // + // Default is true. + SingleFrameMode *wrapperspb.BoolValue `protobuf:"bytes,1,opt,name=single_frame_mode,json=singleFrameMode,proto3" json:"single_frame_mode,omitempty"` + // The maximum size of the HTTP1 message body in bytes. If not set, 8*1024*1024 (8MB) is used. + // This only makes sense when single_frame_mode is true. + // If the HTTP1 message body size exceeds this value, this will result in a decoding error + // and the generic proxy will close the connection. + MaxBufferSize *wrapperspb.UInt32Value `protobuf:"bytes,2,opt,name=max_buffer_size,json=maxBufferSize,proto3" json:"max_buffer_size,omitempty"` +} + +func (x *Http1CodecConfig) Reset() { + *x = Http1CodecConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Http1CodecConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Http1CodecConfig) ProtoMessage() {} + +func (x *Http1CodecConfig) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Http1CodecConfig.ProtoReflect.Descriptor instead. +func (*Http1CodecConfig) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDescGZIP(), []int{0} +} + +func (x *Http1CodecConfig) GetSingleFrameMode() *wrapperspb.BoolValue { + if x != nil { + return x.SingleFrameMode + } + return nil +} + +func (x *Http1CodecConfig) GetMaxBufferSize() *wrapperspb.UInt32Value { + if x != nil { + return x.MaxBufferSize + } + return nil +} + +var File_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto protoreflect.FileDescriptor + +var file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDesc = []byte{ + 0x0a, 0x4a, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x31, 0x2f, 0x76, 0x33, + 0x2f, 0x68, 0x74, 0x74, 0x70, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x3e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x63, 0x6f, 0x64, + 0x65, 0x63, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x31, 0x2e, 0x76, 0x33, 0x1a, 0x1e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x78, 0x64, + 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, + 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa0, 0x01, 0x0a, + 0x10, 0x48, 0x74, 0x74, 0x70, 0x31, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x46, 0x0a, 0x11, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 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, 0x42, + 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x6d, 0x61, 0x78, + 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x42, + 0xdb, 0x01, 0x0a, 0x4c, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2e, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x31, 0x2e, 0x76, 0x33, + 0x42, 0x0a, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x6d, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x73, 0x2f, 0x68, 0x74, 0x74, + 0x70, 0x31, 0x2f, 0x76, 0x33, 0x3b, 0x68, 0x74, 0x74, 0x70, 0x31, 0x76, 0x33, 0xba, 0x80, 0xc8, + 0xd1, 0x06, 0x02, 0x10, 0x02, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDescOnce sync.Once + file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDescData = file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDesc +) + +func file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDescGZIP() []byte { + file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDescOnce.Do(func() { + file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDescData) + }) + return file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDescData +} + +var file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_goTypes = []interface{}{ + (*Http1CodecConfig)(nil), // 0: envoy.extensions.filters.network.generic_proxy.codecs.http1.v3.Http1CodecConfig + (*wrapperspb.BoolValue)(nil), // 1: google.protobuf.BoolValue + (*wrapperspb.UInt32Value)(nil), // 2: google.protobuf.UInt32Value +} +var file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_depIdxs = []int32{ + 1, // 0: envoy.extensions.filters.network.generic_proxy.codecs.http1.v3.Http1CodecConfig.single_frame_mode:type_name -> google.protobuf.BoolValue + 2, // 1: envoy.extensions.filters.network.generic_proxy.codecs.http1.v3.Http1CodecConfig.max_buffer_size:type_name -> google.protobuf.UInt32Value + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_init() } +func file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_init() { + if File_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Http1CodecConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_goTypes, + DependencyIndexes: file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_depIdxs, + MessageInfos: file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_msgTypes, + }.Build() + File_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto = out.File + file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_rawDesc = nil + file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_goTypes = nil + file_envoy_extensions_filters_network_generic_proxy_codecs_http1_v3_http1_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.validate.go new file mode 100644 index 0000000000..be5a6be651 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.validate.go @@ -0,0 +1,194 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.proto + +package http1v3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on Http1CodecConfig with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *Http1CodecConfig) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Http1CodecConfig with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// Http1CodecConfigMultiError, or nil if none found. +func (m *Http1CodecConfig) ValidateAll() error { + return m.validate(true) +} + +func (m *Http1CodecConfig) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetSingleFrameMode()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, Http1CodecConfigValidationError{ + field: "SingleFrameMode", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, Http1CodecConfigValidationError{ + field: "SingleFrameMode", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetSingleFrameMode()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return Http1CodecConfigValidationError{ + field: "SingleFrameMode", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetMaxBufferSize()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, Http1CodecConfigValidationError{ + field: "MaxBufferSize", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, Http1CodecConfigValidationError{ + field: "MaxBufferSize", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMaxBufferSize()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return Http1CodecConfigValidationError{ + field: "MaxBufferSize", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return Http1CodecConfigMultiError(errors) + } + + return nil +} + +// Http1CodecConfigMultiError is an error wrapping multiple validation errors +// returned by Http1CodecConfig.ValidateAll() if the designated constraints +// aren't met. +type Http1CodecConfigMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m Http1CodecConfigMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m Http1CodecConfigMultiError) AllErrors() []error { return m } + +// Http1CodecConfigValidationError is the validation error returned by +// Http1CodecConfig.Validate if the designated constraints aren't met. +type Http1CodecConfigValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e Http1CodecConfigValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e Http1CodecConfigValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e Http1CodecConfigValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e Http1CodecConfigValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e Http1CodecConfigValidationError) ErrorName() string { return "Http1CodecConfigValidationError" } + +// Error satisfies the builtin error interface +func (e Http1CodecConfigValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sHttp1CodecConfig.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = Http1CodecConfigValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = Http1CodecConfigValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.go new file mode 100644 index 0000000000..01b023e1b4 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.go @@ -0,0 +1,653 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.proto + +package matcherv3 + +import ( + v3 "github.com/cilium/proxy/go/envoy/type/matcher/v3" + _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/cncf/xds/go/xds/annotations/v3" + _ "github.com/envoyproxy/protoc-gen-validate/validate" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Used to match request service of the downstream request. Only applicable if a service provided +// by the application protocol. +// This is deprecated and should be replaced by HostMatchInput. This is kept for backward compatibility. +type ServiceMatchInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ServiceMatchInput) Reset() { + *x = ServiceMatchInput{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServiceMatchInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServiceMatchInput) ProtoMessage() {} + +func (x *ServiceMatchInput) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServiceMatchInput.ProtoReflect.Descriptor instead. +func (*ServiceMatchInput) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescGZIP(), []int{0} +} + +// Used to match request host of the generic downstream request. Only applicable if a host provided +// by the application protocol. +// This is same with the ServiceMatchInput and this should be preferred over ServiceMatchInput. +type HostMatchInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *HostMatchInput) Reset() { + *x = HostMatchInput{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HostMatchInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HostMatchInput) ProtoMessage() {} + +func (x *HostMatchInput) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HostMatchInput.ProtoReflect.Descriptor instead. +func (*HostMatchInput) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescGZIP(), []int{1} +} + +// Used to match request path of the generic downstream request. Only applicable if a path provided +// by the application protocol. +type PathMatchInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PathMatchInput) Reset() { + *x = PathMatchInput{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PathMatchInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PathMatchInput) ProtoMessage() {} + +func (x *PathMatchInput) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PathMatchInput.ProtoReflect.Descriptor instead. +func (*PathMatchInput) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescGZIP(), []int{2} +} + +// Used to match request method of the generic downstream request. Only applicable if a method provided +// by the application protocol. +type MethodMatchInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MethodMatchInput) Reset() { + *x = MethodMatchInput{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MethodMatchInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MethodMatchInput) ProtoMessage() {} + +func (x *MethodMatchInput) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MethodMatchInput.ProtoReflect.Descriptor instead. +func (*MethodMatchInput) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescGZIP(), []int{3} +} + +// Used to match an arbitrary property of the generic downstream request. +// These properties are populated by the codecs of application protocols. +type PropertyMatchInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The property name to match on. + PropertyName string `protobuf:"bytes,1,opt,name=property_name,json=propertyName,proto3" json:"property_name,omitempty"` +} + +func (x *PropertyMatchInput) Reset() { + *x = PropertyMatchInput{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PropertyMatchInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PropertyMatchInput) ProtoMessage() {} + +func (x *PropertyMatchInput) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PropertyMatchInput.ProtoReflect.Descriptor instead. +func (*PropertyMatchInput) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescGZIP(), []int{4} +} + +func (x *PropertyMatchInput) GetPropertyName() string { + if x != nil { + return x.PropertyName + } + return "" +} + +// Used to match an whole generic downstream request. +type RequestMatchInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RequestMatchInput) Reset() { + *x = RequestMatchInput{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequestMatchInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestMatchInput) ProtoMessage() {} + +func (x *RequestMatchInput) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestMatchInput.ProtoReflect.Descriptor instead. +func (*RequestMatchInput) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescGZIP(), []int{5} +} + +// Used to match an arbitrary key-value pair for headers, trailers or properties. +type KeyValueMatchEntry struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The key name to match on. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The key value pattern. + StringMatch *v3.StringMatcher `protobuf:"bytes,2,opt,name=string_match,json=stringMatch,proto3" json:"string_match,omitempty"` +} + +func (x *KeyValueMatchEntry) Reset() { + *x = KeyValueMatchEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *KeyValueMatchEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KeyValueMatchEntry) ProtoMessage() {} + +func (x *KeyValueMatchEntry) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KeyValueMatchEntry.ProtoReflect.Descriptor instead. +func (*KeyValueMatchEntry) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescGZIP(), []int{6} +} + +func (x *KeyValueMatchEntry) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *KeyValueMatchEntry) GetStringMatch() *v3.StringMatcher { + if x != nil { + return x.StringMatch + } + return nil +} + +// Custom matcher to match on the generic downstream request. This is used to match +// multiple fields of the downstream request and avoid complex combinations of +// HostMatchInput, PathMatchInput, MethodMatchInput and PropertyMatchInput. +type RequestMatcher struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Optional host pattern to match on. If not specified, any host will match. + Host *v3.StringMatcher `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"` + // Optional path pattern to match on. If not specified, any path will match. + Path *v3.StringMatcher `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + // Optional method pattern to match on. If not specified, any method will match. + Method *v3.StringMatcher `protobuf:"bytes,3,opt,name=method,proto3" json:"method,omitempty"` + // Optional arbitrary properties to match on. If not specified, any properties + // will match. The key is the property name and the value is the property value + // to match on. + Properties []*KeyValueMatchEntry `protobuf:"bytes,4,rep,name=properties,proto3" json:"properties,omitempty"` +} + +func (x *RequestMatcher) Reset() { + *x = RequestMatcher{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequestMatcher) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestMatcher) ProtoMessage() {} + +func (x *RequestMatcher) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestMatcher.ProtoReflect.Descriptor instead. +func (*RequestMatcher) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescGZIP(), []int{7} +} + +func (x *RequestMatcher) GetHost() *v3.StringMatcher { + if x != nil { + return x.Host + } + return nil +} + +func (x *RequestMatcher) GetPath() *v3.StringMatcher { + if x != nil { + return x.Path + } + return nil +} + +func (x *RequestMatcher) GetMethod() *v3.StringMatcher { + if x != nil { + return x.Method + } + return nil +} + +func (x *RequestMatcher) GetProperties() []*KeyValueMatchEntry { + if x != nil { + return x.Properties + } + return nil +} + +var File_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto protoreflect.FileDescriptor + +var file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDesc = []byte{ + 0x0a, 0x47, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x39, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x2e, 0x76, 0x33, 0x1a, 0x22, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, + 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x78, 0x64, 0x73, 0x2f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x13, 0x0a, 0x11, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x10, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x10, 0x0a, 0x0e, 0x50, 0x61, 0x74, 0x68, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x12, 0x0a, 0x10, 0x4d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x42, + 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x2c, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x13, 0x0a, 0x11, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, + 0x63, 0x68, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x4b, 0x65, 0x79, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1b, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, + 0x01, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb1, + 0x02, 0x0a, 0x0e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x12, 0x38, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, + 0x33, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x3c, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x12, 0x6d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, + 0x2e, 0x76, 0x33, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x74, 0x63, + 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x42, 0xd5, 0x01, 0x0a, 0x47, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x42, 0x0c, + 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x6a, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x33, + 0x3b, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, + 0x10, 0x02, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescOnce sync.Once + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescData = file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDesc +) + +func file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescGZIP() []byte { + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescOnce.Do(func() { + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescData) + }) + return file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDescData +} + +var file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_goTypes = []interface{}{ + (*ServiceMatchInput)(nil), // 0: envoy.extensions.filters.network.generic_proxy.matcher.v3.ServiceMatchInput + (*HostMatchInput)(nil), // 1: envoy.extensions.filters.network.generic_proxy.matcher.v3.HostMatchInput + (*PathMatchInput)(nil), // 2: envoy.extensions.filters.network.generic_proxy.matcher.v3.PathMatchInput + (*MethodMatchInput)(nil), // 3: envoy.extensions.filters.network.generic_proxy.matcher.v3.MethodMatchInput + (*PropertyMatchInput)(nil), // 4: envoy.extensions.filters.network.generic_proxy.matcher.v3.PropertyMatchInput + (*RequestMatchInput)(nil), // 5: envoy.extensions.filters.network.generic_proxy.matcher.v3.RequestMatchInput + (*KeyValueMatchEntry)(nil), // 6: envoy.extensions.filters.network.generic_proxy.matcher.v3.KeyValueMatchEntry + (*RequestMatcher)(nil), // 7: envoy.extensions.filters.network.generic_proxy.matcher.v3.RequestMatcher + (*v3.StringMatcher)(nil), // 8: envoy.type.matcher.v3.StringMatcher +} +var file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_depIdxs = []int32{ + 8, // 0: envoy.extensions.filters.network.generic_proxy.matcher.v3.KeyValueMatchEntry.string_match:type_name -> envoy.type.matcher.v3.StringMatcher + 8, // 1: envoy.extensions.filters.network.generic_proxy.matcher.v3.RequestMatcher.host:type_name -> envoy.type.matcher.v3.StringMatcher + 8, // 2: envoy.extensions.filters.network.generic_proxy.matcher.v3.RequestMatcher.path:type_name -> envoy.type.matcher.v3.StringMatcher + 8, // 3: envoy.extensions.filters.network.generic_proxy.matcher.v3.RequestMatcher.method:type_name -> envoy.type.matcher.v3.StringMatcher + 6, // 4: envoy.extensions.filters.network.generic_proxy.matcher.v3.RequestMatcher.properties:type_name -> envoy.extensions.filters.network.generic_proxy.matcher.v3.KeyValueMatchEntry + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_init() } +func file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_init() { + if File_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServiceMatchInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HostMatchInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PathMatchInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MethodMatchInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PropertyMatchInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RequestMatchInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*KeyValueMatchEntry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RequestMatcher); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDesc, + NumEnums: 0, + NumMessages: 8, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_goTypes, + DependencyIndexes: file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_depIdxs, + MessageInfos: file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_msgTypes, + }.Build() + File_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto = out.File + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_rawDesc = nil + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_goTypes = nil + file_envoy_extensions_filters_network_generic_proxy_matcher_v3_matcher_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.validate.go new file mode 100644 index 0000000000..747486cc4c --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.validate.go @@ -0,0 +1,1027 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.proto + +package matcherv3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on ServiceMatchInput with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *ServiceMatchInput) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ServiceMatchInput with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ServiceMatchInputMultiError, or nil if none found. +func (m *ServiceMatchInput) ValidateAll() error { + return m.validate(true) +} + +func (m *ServiceMatchInput) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return ServiceMatchInputMultiError(errors) + } + + return nil +} + +// ServiceMatchInputMultiError is an error wrapping multiple validation errors +// returned by ServiceMatchInput.ValidateAll() if the designated constraints +// aren't met. +type ServiceMatchInputMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ServiceMatchInputMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ServiceMatchInputMultiError) AllErrors() []error { return m } + +// ServiceMatchInputValidationError is the validation error returned by +// ServiceMatchInput.Validate if the designated constraints aren't met. +type ServiceMatchInputValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServiceMatchInputValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServiceMatchInputValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServiceMatchInputValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServiceMatchInputValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServiceMatchInputValidationError) ErrorName() string { + return "ServiceMatchInputValidationError" +} + +// Error satisfies the builtin error interface +func (e ServiceMatchInputValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sServiceMatchInput.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServiceMatchInputValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServiceMatchInputValidationError{} + +// Validate checks the field values on HostMatchInput with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *HostMatchInput) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on HostMatchInput with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in HostMatchInputMultiError, +// or nil if none found. +func (m *HostMatchInput) ValidateAll() error { + return m.validate(true) +} + +func (m *HostMatchInput) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return HostMatchInputMultiError(errors) + } + + return nil +} + +// HostMatchInputMultiError is an error wrapping multiple validation errors +// returned by HostMatchInput.ValidateAll() if the designated constraints +// aren't met. +type HostMatchInputMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m HostMatchInputMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m HostMatchInputMultiError) AllErrors() []error { return m } + +// HostMatchInputValidationError is the validation error returned by +// HostMatchInput.Validate if the designated constraints aren't met. +type HostMatchInputValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e HostMatchInputValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e HostMatchInputValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e HostMatchInputValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e HostMatchInputValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e HostMatchInputValidationError) ErrorName() string { return "HostMatchInputValidationError" } + +// Error satisfies the builtin error interface +func (e HostMatchInputValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sHostMatchInput.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = HostMatchInputValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = HostMatchInputValidationError{} + +// Validate checks the field values on PathMatchInput with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *PathMatchInput) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on PathMatchInput with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in PathMatchInputMultiError, +// or nil if none found. +func (m *PathMatchInput) ValidateAll() error { + return m.validate(true) +} + +func (m *PathMatchInput) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return PathMatchInputMultiError(errors) + } + + return nil +} + +// PathMatchInputMultiError is an error wrapping multiple validation errors +// returned by PathMatchInput.ValidateAll() if the designated constraints +// aren't met. +type PathMatchInputMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m PathMatchInputMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m PathMatchInputMultiError) AllErrors() []error { return m } + +// PathMatchInputValidationError is the validation error returned by +// PathMatchInput.Validate if the designated constraints aren't met. +type PathMatchInputValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PathMatchInputValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PathMatchInputValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PathMatchInputValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PathMatchInputValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PathMatchInputValidationError) ErrorName() string { return "PathMatchInputValidationError" } + +// Error satisfies the builtin error interface +func (e PathMatchInputValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPathMatchInput.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PathMatchInputValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PathMatchInputValidationError{} + +// Validate checks the field values on MethodMatchInput with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *MethodMatchInput) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on MethodMatchInput with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// MethodMatchInputMultiError, or nil if none found. +func (m *MethodMatchInput) ValidateAll() error { + return m.validate(true) +} + +func (m *MethodMatchInput) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return MethodMatchInputMultiError(errors) + } + + return nil +} + +// MethodMatchInputMultiError is an error wrapping multiple validation errors +// returned by MethodMatchInput.ValidateAll() if the designated constraints +// aren't met. +type MethodMatchInputMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m MethodMatchInputMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m MethodMatchInputMultiError) AllErrors() []error { return m } + +// MethodMatchInputValidationError is the validation error returned by +// MethodMatchInput.Validate if the designated constraints aren't met. +type MethodMatchInputValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MethodMatchInputValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MethodMatchInputValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MethodMatchInputValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MethodMatchInputValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MethodMatchInputValidationError) ErrorName() string { return "MethodMatchInputValidationError" } + +// Error satisfies the builtin error interface +func (e MethodMatchInputValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMethodMatchInput.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MethodMatchInputValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MethodMatchInputValidationError{} + +// Validate checks the field values on PropertyMatchInput with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *PropertyMatchInput) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on PropertyMatchInput with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// PropertyMatchInputMultiError, or nil if none found. +func (m *PropertyMatchInput) ValidateAll() error { + return m.validate(true) +} + +func (m *PropertyMatchInput) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if utf8.RuneCountInString(m.GetPropertyName()) < 1 { + err := PropertyMatchInputValidationError{ + field: "PropertyName", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(errors) > 0 { + return PropertyMatchInputMultiError(errors) + } + + return nil +} + +// PropertyMatchInputMultiError is an error wrapping multiple validation errors +// returned by PropertyMatchInput.ValidateAll() if the designated constraints +// aren't met. +type PropertyMatchInputMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m PropertyMatchInputMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m PropertyMatchInputMultiError) AllErrors() []error { return m } + +// PropertyMatchInputValidationError is the validation error returned by +// PropertyMatchInput.Validate if the designated constraints aren't met. +type PropertyMatchInputValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PropertyMatchInputValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PropertyMatchInputValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PropertyMatchInputValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PropertyMatchInputValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PropertyMatchInputValidationError) ErrorName() string { + return "PropertyMatchInputValidationError" +} + +// Error satisfies the builtin error interface +func (e PropertyMatchInputValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPropertyMatchInput.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PropertyMatchInputValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PropertyMatchInputValidationError{} + +// Validate checks the field values on RequestMatchInput with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *RequestMatchInput) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RequestMatchInput with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// RequestMatchInputMultiError, or nil if none found. +func (m *RequestMatchInput) ValidateAll() error { + return m.validate(true) +} + +func (m *RequestMatchInput) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return RequestMatchInputMultiError(errors) + } + + return nil +} + +// RequestMatchInputMultiError is an error wrapping multiple validation errors +// returned by RequestMatchInput.ValidateAll() if the designated constraints +// aren't met. +type RequestMatchInputMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RequestMatchInputMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RequestMatchInputMultiError) AllErrors() []error { return m } + +// RequestMatchInputValidationError is the validation error returned by +// RequestMatchInput.Validate if the designated constraints aren't met. +type RequestMatchInputValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RequestMatchInputValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RequestMatchInputValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RequestMatchInputValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RequestMatchInputValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RequestMatchInputValidationError) ErrorName() string { + return "RequestMatchInputValidationError" +} + +// Error satisfies the builtin error interface +func (e RequestMatchInputValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRequestMatchInput.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RequestMatchInputValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RequestMatchInputValidationError{} + +// Validate checks the field values on KeyValueMatchEntry with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *KeyValueMatchEntry) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on KeyValueMatchEntry with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// KeyValueMatchEntryMultiError, or nil if none found. +func (m *KeyValueMatchEntry) ValidateAll() error { + return m.validate(true) +} + +func (m *KeyValueMatchEntry) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if utf8.RuneCountInString(m.GetName()) < 1 { + err := KeyValueMatchEntryValidationError{ + field: "Name", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if m.GetStringMatch() == nil { + err := KeyValueMatchEntryValidationError{ + field: "StringMatch", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetStringMatch()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, KeyValueMatchEntryValidationError{ + field: "StringMatch", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, KeyValueMatchEntryValidationError{ + field: "StringMatch", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetStringMatch()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return KeyValueMatchEntryValidationError{ + field: "StringMatch", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return KeyValueMatchEntryMultiError(errors) + } + + return nil +} + +// KeyValueMatchEntryMultiError is an error wrapping multiple validation errors +// returned by KeyValueMatchEntry.ValidateAll() if the designated constraints +// aren't met. +type KeyValueMatchEntryMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m KeyValueMatchEntryMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m KeyValueMatchEntryMultiError) AllErrors() []error { return m } + +// KeyValueMatchEntryValidationError is the validation error returned by +// KeyValueMatchEntry.Validate if the designated constraints aren't met. +type KeyValueMatchEntryValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e KeyValueMatchEntryValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e KeyValueMatchEntryValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e KeyValueMatchEntryValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e KeyValueMatchEntryValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e KeyValueMatchEntryValidationError) ErrorName() string { + return "KeyValueMatchEntryValidationError" +} + +// Error satisfies the builtin error interface +func (e KeyValueMatchEntryValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sKeyValueMatchEntry.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = KeyValueMatchEntryValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = KeyValueMatchEntryValidationError{} + +// Validate checks the field values on RequestMatcher with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *RequestMatcher) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RequestMatcher with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in RequestMatcherMultiError, +// or nil if none found. +func (m *RequestMatcher) ValidateAll() error { + return m.validate(true) +} + +func (m *RequestMatcher) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetHost()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RequestMatcherValidationError{ + field: "Host", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RequestMatcherValidationError{ + field: "Host", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetHost()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RequestMatcherValidationError{ + field: "Host", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetPath()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RequestMatcherValidationError{ + field: "Path", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RequestMatcherValidationError{ + field: "Path", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetPath()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RequestMatcherValidationError{ + field: "Path", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetMethod()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RequestMatcherValidationError{ + field: "Method", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RequestMatcherValidationError{ + field: "Method", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMethod()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RequestMatcherValidationError{ + field: "Method", + reason: "embedded message failed validation", + cause: err, + } + } + } + + for idx, item := range m.GetProperties() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RequestMatcherValidationError{ + field: fmt.Sprintf("Properties[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RequestMatcherValidationError{ + field: fmt.Sprintf("Properties[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RequestMatcherValidationError{ + field: fmt.Sprintf("Properties[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return RequestMatcherMultiError(errors) + } + + return nil +} + +// RequestMatcherMultiError is an error wrapping multiple validation errors +// returned by RequestMatcher.ValidateAll() if the designated constraints +// aren't met. +type RequestMatcherMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RequestMatcherMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RequestMatcherMultiError) AllErrors() []error { return m } + +// RequestMatcherValidationError is the validation error returned by +// RequestMatcher.Validate if the designated constraints aren't met. +type RequestMatcherValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RequestMatcherValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RequestMatcherValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RequestMatcherValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RequestMatcherValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RequestMatcherValidationError) ErrorName() string { return "RequestMatcherValidationError" } + +// Error satisfies the builtin error interface +func (e RequestMatcherValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRequestMatcher.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RequestMatcherValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RequestMatcherValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.go new file mode 100644 index 0000000000..d2e92e7616 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.go @@ -0,0 +1,196 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/filters/network/generic_proxy/router/v3/router.proto + +package routerv3 + +import ( + _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/cncf/xds/go/xds/annotations/v3" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type Router struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Set to true if the upstream connection should be bound to the downstream connection, false + // otherwise. + // + // By default, one random upstream connection will be selected from the upstream connection pool + // and used for every request. And after the request is finished, the upstream connection will be + // released back to the upstream connection pool. + // + // If this option is true, the upstream connection will be bound to the downstream connection and + // have same lifetime as the downstream connection. The same upstream connection will be used for + // all requests from the same downstream connection. + // + // And if this options is true, one of the following requirements must be met: + // + // 1. The request must be handled one by one. That is, the next request can not be sent to the + // upstream until the previous request is finished. + // 2. Unique request id must be provided for each request and response. The request id must be + // unique for each request and response pair in same connection pair. And the request id must + // be the same for the corresponding request and response. + // + // This could be useful for some protocols that require the same upstream connection to be used + // for all requests from the same downstream connection. For example, the protocol using stateful + // connection. + BindUpstreamConnection bool `protobuf:"varint,1,opt,name=bind_upstream_connection,json=bindUpstreamConnection,proto3" json:"bind_upstream_connection,omitempty"` +} + +func (x *Router) Reset() { + *x = Router{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Router) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Router) ProtoMessage() {} + +func (x *Router) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Router.ProtoReflect.Descriptor instead. +func (*Router) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDescGZIP(), []int{0} +} + +func (x *Router) GetBindUpstreamConnection() bool { + if x != nil { + return x.BindUpstreamConnection + } + return false +} + +var File_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto protoreflect.FileDescriptor + +var file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDesc = []byte{ + 0x0a, 0x45, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x38, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, + 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x76, + 0x33, 0x1a, 0x1f, 0x78, 0x64, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x42, 0x0a, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x62, + 0x69, 0x6e, 0x64, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x62, + 0x69, 0x6e, 0x64, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xd1, 0x01, 0x0a, 0x46, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, + 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x33, + 0x42, 0x0b, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x68, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, + 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x33, + 0x3b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, + 0x02, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDescOnce sync.Once + file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDescData = file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDesc +) + +func file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDescGZIP() []byte { + file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDescOnce.Do(func() { + file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDescData) + }) + return file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDescData +} + +var file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_goTypes = []interface{}{ + (*Router)(nil), // 0: envoy.extensions.filters.network.generic_proxy.router.v3.Router +} +var file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_init() } +func file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_init() { + if File_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Router); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_goTypes, + DependencyIndexes: file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_depIdxs, + MessageInfos: file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_msgTypes, + }.Build() + File_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto = out.File + file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_rawDesc = nil + file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_goTypes = nil + file_envoy_extensions_filters_network_generic_proxy_router_v3_router_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.validate.go new file mode 100644 index 0000000000..d525c74fb3 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.validate.go @@ -0,0 +1,136 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/filters/network/generic_proxy/router/v3/router.proto + +package routerv3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on Router with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Router) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Router with the rules defined in the +// proto definition for this message. If any rules are violated, the result is +// a list of violation errors wrapped in RouterMultiError, or nil if none found. +func (m *Router) ValidateAll() error { + return m.validate(true) +} + +func (m *Router) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for BindUpstreamConnection + + if len(errors) > 0 { + return RouterMultiError(errors) + } + + return nil +} + +// RouterMultiError is an error wrapping multiple validation errors returned by +// Router.ValidateAll() if the designated constraints aren't met. +type RouterMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RouterMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RouterMultiError) AllErrors() []error { return m } + +// RouterValidationError is the validation error returned by Router.Validate if +// the designated constraints aren't met. +type RouterValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RouterValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RouterValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RouterValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RouterValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RouterValidationError) ErrorName() string { return "RouterValidationError" } + +// Error satisfies the builtin error interface +func (e RouterValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRouter.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RouterValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RouterValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.go new file mode 100644 index 0000000000..f4763e6821 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.go @@ -0,0 +1,415 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.proto + +package generic_proxyv3 + +import ( + v32 "github.com/cilium/proxy/go/envoy/config/accesslog/v3" + v3 "github.com/cilium/proxy/go/envoy/config/core/v3" + v31 "github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3" + _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/cncf/xds/go/xds/annotations/v3" + _ "github.com/envoyproxy/protoc-gen-validate/validate" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// [#next-free-field: 8] +type GenericProxy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The human readable prefix to use when emitting statistics. + StatPrefix string `protobuf:"bytes,1,opt,name=stat_prefix,json=statPrefix,proto3" json:"stat_prefix,omitempty"` + // The codec which encodes and decodes the application protocol. + // [#extension-category: envoy.generic_proxy.codecs] + CodecConfig *v3.TypedExtensionConfig `protobuf:"bytes,2,opt,name=codec_config,json=codecConfig,proto3" json:"codec_config,omitempty"` + // Types that are assignable to RouteSpecifier: + // + // *GenericProxy_GenericRds + // *GenericProxy_RouteConfig + RouteSpecifier isGenericProxy_RouteSpecifier `protobuf_oneof:"route_specifier"` + // A list of individual Layer-7 filters that make up the filter chain for requests made to the + // proxy. Order matters as the filters are processed sequentially as request events + // happen. + // [#extension-category: envoy.generic_proxy.filters] + Filters []*v3.TypedExtensionConfig `protobuf:"bytes,5,rep,name=filters,proto3" json:"filters,omitempty"` + // Tracing configuration for the generic proxy. + Tracing *v31.HttpConnectionManager_Tracing `protobuf:"bytes,6,opt,name=tracing,proto3" json:"tracing,omitempty"` + // Configuration for :ref:`access logs ` emitted by generic proxy. + AccessLog []*v32.AccessLog `protobuf:"bytes,7,rep,name=access_log,json=accessLog,proto3" json:"access_log,omitempty"` +} + +func (x *GenericProxy) Reset() { + *x = GenericProxy{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenericProxy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenericProxy) ProtoMessage() {} + +func (x *GenericProxy) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenericProxy.ProtoReflect.Descriptor instead. +func (*GenericProxy) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDescGZIP(), []int{0} +} + +func (x *GenericProxy) GetStatPrefix() string { + if x != nil { + return x.StatPrefix + } + return "" +} + +func (x *GenericProxy) GetCodecConfig() *v3.TypedExtensionConfig { + if x != nil { + return x.CodecConfig + } + return nil +} + +func (m *GenericProxy) GetRouteSpecifier() isGenericProxy_RouteSpecifier { + if m != nil { + return m.RouteSpecifier + } + return nil +} + +func (x *GenericProxy) GetGenericRds() *GenericRds { + if x, ok := x.GetRouteSpecifier().(*GenericProxy_GenericRds); ok { + return x.GenericRds + } + return nil +} + +func (x *GenericProxy) GetRouteConfig() *RouteConfiguration { + if x, ok := x.GetRouteSpecifier().(*GenericProxy_RouteConfig); ok { + return x.RouteConfig + } + return nil +} + +func (x *GenericProxy) GetFilters() []*v3.TypedExtensionConfig { + if x != nil { + return x.Filters + } + return nil +} + +func (x *GenericProxy) GetTracing() *v31.HttpConnectionManager_Tracing { + if x != nil { + return x.Tracing + } + return nil +} + +func (x *GenericProxy) GetAccessLog() []*v32.AccessLog { + if x != nil { + return x.AccessLog + } + return nil +} + +type isGenericProxy_RouteSpecifier interface { + isGenericProxy_RouteSpecifier() +} + +type GenericProxy_GenericRds struct { + // The generic proxies route table will be dynamically loaded via the meta RDS API. + GenericRds *GenericRds `protobuf:"bytes,3,opt,name=generic_rds,json=genericRds,proto3,oneof"` +} + +type GenericProxy_RouteConfig struct { + // The route table for the generic proxy is static and is specified in this property. + RouteConfig *RouteConfiguration `protobuf:"bytes,4,opt,name=route_config,json=routeConfig,proto3,oneof"` +} + +func (*GenericProxy_GenericRds) isGenericProxy_RouteSpecifier() {} + +func (*GenericProxy_RouteConfig) isGenericProxy_RouteSpecifier() {} + +type GenericRds struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Configuration source specifier for RDS. + ConfigSource *v3.ConfigSource `protobuf:"bytes,1,opt,name=config_source,json=configSource,proto3" json:"config_source,omitempty"` + // The name of the route configuration. This name will be passed to the RDS API. This allows an + // Envoy configuration with multiple generic proxies to use different route configurations. + RouteConfigName string `protobuf:"bytes,2,opt,name=route_config_name,json=routeConfigName,proto3" json:"route_config_name,omitempty"` +} + +func (x *GenericRds) Reset() { + *x = GenericRds{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenericRds) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenericRds) ProtoMessage() {} + +func (x *GenericRds) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenericRds.ProtoReflect.Descriptor instead. +func (*GenericRds) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDescGZIP(), []int{1} +} + +func (x *GenericRds) GetConfigSource() *v3.ConfigSource { + if x != nil { + return x.ConfigSource + } + return nil +} + +func (x *GenericRds) GetRouteConfigName() string { + if x != nil { + return x.RouteConfigName + } + return "" +} + +var File_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto protoreflect.FileDescriptor + +var file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDesc = []byte{ + 0x0a, 0x45, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x76, 0x33, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x31, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, + 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x1a, 0x29, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, + 0x6f, 0x67, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x6f, 0x67, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x28, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x24, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3d, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x59, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2f, 0x76, + 0x33, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x78, 0x64, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf8, 0x04, 0x0a, 0x0c, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x28, 0x0a, 0x0b, 0x73, 0x74, 0x61, + 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x50, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x12, 0x57, 0x0a, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, + 0x0b, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x60, 0x0a, 0x0b, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x64, 0x73, + 0x48, 0x00, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, 0x64, 0x73, 0x12, 0x6a, + 0x0a, 0x0c, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x07, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x74, 0x0a, 0x07, 0x74, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x5a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, + 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x74, + 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, + 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x42, 0x16, 0x0a, 0x0f, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x03, + 0xf8, 0x42, 0x01, 0x22, 0x94, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x52, + 0x64, 0x73, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x11, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0xd0, 0x01, 0x0a, 0x3f, 0x69, + 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x42, 0x11, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x68, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, 0x3b, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x76, 0x33, 0xba, 0x80, 0xc8, + 0xd1, 0x06, 0x02, 0x10, 0x02, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDescOnce sync.Once + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDescData = file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDesc +) + +func file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDescGZIP() []byte { + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDescOnce.Do(func() { + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDescData) + }) + return file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDescData +} + +var file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_goTypes = []interface{}{ + (*GenericProxy)(nil), // 0: envoy.extensions.filters.network.generic_proxy.v3.GenericProxy + (*GenericRds)(nil), // 1: envoy.extensions.filters.network.generic_proxy.v3.GenericRds + (*v3.TypedExtensionConfig)(nil), // 2: envoy.config.core.v3.TypedExtensionConfig + (*RouteConfiguration)(nil), // 3: envoy.extensions.filters.network.generic_proxy.v3.RouteConfiguration + (*v31.HttpConnectionManager_Tracing)(nil), // 4: envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing + (*v32.AccessLog)(nil), // 5: envoy.config.accesslog.v3.AccessLog + (*v3.ConfigSource)(nil), // 6: envoy.config.core.v3.ConfigSource +} +var file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_depIdxs = []int32{ + 2, // 0: envoy.extensions.filters.network.generic_proxy.v3.GenericProxy.codec_config:type_name -> envoy.config.core.v3.TypedExtensionConfig + 1, // 1: envoy.extensions.filters.network.generic_proxy.v3.GenericProxy.generic_rds:type_name -> envoy.extensions.filters.network.generic_proxy.v3.GenericRds + 3, // 2: envoy.extensions.filters.network.generic_proxy.v3.GenericProxy.route_config:type_name -> envoy.extensions.filters.network.generic_proxy.v3.RouteConfiguration + 2, // 3: envoy.extensions.filters.network.generic_proxy.v3.GenericProxy.filters:type_name -> envoy.config.core.v3.TypedExtensionConfig + 4, // 4: envoy.extensions.filters.network.generic_proxy.v3.GenericProxy.tracing:type_name -> envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing + 5, // 5: envoy.extensions.filters.network.generic_proxy.v3.GenericProxy.access_log:type_name -> envoy.config.accesslog.v3.AccessLog + 6, // 6: envoy.extensions.filters.network.generic_proxy.v3.GenericRds.config_source:type_name -> envoy.config.core.v3.ConfigSource + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_init() } +func file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_init() { + if File_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto != nil { + return + } + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_init() + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenericProxy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenericRds); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_msgTypes[0].OneofWrappers = []interface{}{ + (*GenericProxy_GenericRds)(nil), + (*GenericProxy_RouteConfig)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_goTypes, + DependencyIndexes: file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_depIdxs, + MessageInfos: file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_msgTypes, + }.Build() + File_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto = out.File + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_rawDesc = nil + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_goTypes = nil + file_envoy_extensions_filters_network_generic_proxy_v3_generic_proxy_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.go new file mode 100644 index 0000000000..37483bbacb --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.go @@ -0,0 +1,533 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.proto + +package generic_proxyv3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on GenericProxy with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *GenericProxy) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on GenericProxy with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in GenericProxyMultiError, or +// nil if none found. +func (m *GenericProxy) ValidateAll() error { + return m.validate(true) +} + +func (m *GenericProxy) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if utf8.RuneCountInString(m.GetStatPrefix()) < 1 { + err := GenericProxyValidationError{ + field: "StatPrefix", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if m.GetCodecConfig() == nil { + err := GenericProxyValidationError{ + field: "CodecConfig", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetCodecConfig()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: "CodecConfig", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: "CodecConfig", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetCodecConfig()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GenericProxyValidationError{ + field: "CodecConfig", + reason: "embedded message failed validation", + cause: err, + } + } + } + + for idx, item := range m.GetFilters() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: fmt.Sprintf("Filters[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: fmt.Sprintf("Filters[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GenericProxyValidationError{ + field: fmt.Sprintf("Filters[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if all { + switch v := interface{}(m.GetTracing()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: "Tracing", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: "Tracing", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTracing()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GenericProxyValidationError{ + field: "Tracing", + reason: "embedded message failed validation", + cause: err, + } + } + } + + for idx, item := range m.GetAccessLog() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: fmt.Sprintf("AccessLog[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: fmt.Sprintf("AccessLog[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GenericProxyValidationError{ + field: fmt.Sprintf("AccessLog[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + oneofRouteSpecifierPresent := false + switch v := m.RouteSpecifier.(type) { + case *GenericProxy_GenericRds: + if v == nil { + err := GenericProxyValidationError{ + field: "RouteSpecifier", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + oneofRouteSpecifierPresent = true + + if all { + switch v := interface{}(m.GetGenericRds()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: "GenericRds", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: "GenericRds", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetGenericRds()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GenericProxyValidationError{ + field: "GenericRds", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *GenericProxy_RouteConfig: + if v == nil { + err := GenericProxyValidationError{ + field: "RouteSpecifier", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + oneofRouteSpecifierPresent = true + + if all { + switch v := interface{}(m.GetRouteConfig()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: "RouteConfig", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GenericProxyValidationError{ + field: "RouteConfig", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetRouteConfig()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GenericProxyValidationError{ + field: "RouteConfig", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used + } + if !oneofRouteSpecifierPresent { + err := GenericProxyValidationError{ + field: "RouteSpecifier", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(errors) > 0 { + return GenericProxyMultiError(errors) + } + + return nil +} + +// GenericProxyMultiError is an error wrapping multiple validation errors +// returned by GenericProxy.ValidateAll() if the designated constraints aren't met. +type GenericProxyMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m GenericProxyMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m GenericProxyMultiError) AllErrors() []error { return m } + +// GenericProxyValidationError is the validation error returned by +// GenericProxy.Validate if the designated constraints aren't met. +type GenericProxyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e GenericProxyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e GenericProxyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e GenericProxyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e GenericProxyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e GenericProxyValidationError) ErrorName() string { return "GenericProxyValidationError" } + +// Error satisfies the builtin error interface +func (e GenericProxyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sGenericProxy.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = GenericProxyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = GenericProxyValidationError{} + +// Validate checks the field values on GenericRds with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *GenericRds) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on GenericRds with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in GenericRdsMultiError, or +// nil if none found. +func (m *GenericRds) ValidateAll() error { + return m.validate(true) +} + +func (m *GenericRds) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if m.GetConfigSource() == nil { + err := GenericRdsValidationError{ + field: "ConfigSource", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetConfigSource()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GenericRdsValidationError{ + field: "ConfigSource", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GenericRdsValidationError{ + field: "ConfigSource", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetConfigSource()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GenericRdsValidationError{ + field: "ConfigSource", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if utf8.RuneCountInString(m.GetRouteConfigName()) < 1 { + err := GenericRdsValidationError{ + field: "RouteConfigName", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(errors) > 0 { + return GenericRdsMultiError(errors) + } + + return nil +} + +// GenericRdsMultiError is an error wrapping multiple validation errors +// returned by GenericRds.ValidateAll() if the designated constraints aren't met. +type GenericRdsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m GenericRdsMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m GenericRdsMultiError) AllErrors() []error { return m } + +// GenericRdsValidationError is the validation error returned by +// GenericRds.Validate if the designated constraints aren't met. +type GenericRdsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e GenericRdsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e GenericRdsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e GenericRdsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e GenericRdsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e GenericRdsValidationError) ErrorName() string { return "GenericRdsValidationError" } + +// Error satisfies the builtin error interface +func (e GenericRdsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sGenericRds.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = GenericRdsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = GenericRdsValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/route.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/route.pb.go new file mode 100644 index 0000000000..d82cfcb2bf --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/route.pb.go @@ -0,0 +1,362 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/filters/network/generic_proxy/v3/route.proto + +package generic_proxyv3 + +import ( + _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/cncf/xds/go/xds/annotations/v3" + v3 "github.com/cncf/xds/go/xds/type/matcher/v3" + _ "github.com/envoyproxy/protoc-gen-validate/validate" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type VirtualHost struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the virtual host. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A list of hosts that will be matched to this virtual host. Wildcard hosts are supported in + // the suffix or prefix form. + // + // Host search order: + // 1. Exact names: “www.foo.com“. + // 2. Suffix wildcards: “*.foo.com“ or “*-bar.foo.com“. + // 3. Prefix wildcards: “foo.*“ or “foo-*“. + // 4. Special wildcard “*“ matching any host and will be the default virtual host. + // + // .. note:: + // + // The wildcard will not match the empty string. + // e.g. ``*-bar.foo.com`` will match ``baz-bar.foo.com`` but not ``-bar.foo.com``. + // The longest wildcards match first. + // Only a single virtual host in the entire route configuration can match on ``*``. A domain + // must be unique across all virtual hosts or the config will fail to load. + Hosts []string `protobuf:"bytes,2,rep,name=hosts,proto3" json:"hosts,omitempty"` + // The match tree to use when resolving route actions for incoming requests. + Routes *v3.Matcher `protobuf:"bytes,3,opt,name=routes,proto3" json:"routes,omitempty"` +} + +func (x *VirtualHost) Reset() { + *x = VirtualHost{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VirtualHost) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VirtualHost) ProtoMessage() {} + +func (x *VirtualHost) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VirtualHost.ProtoReflect.Descriptor instead. +func (*VirtualHost) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDescGZIP(), []int{0} +} + +func (x *VirtualHost) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *VirtualHost) GetHosts() []string { + if x != nil { + return x.Hosts + } + return nil +} + +func (x *VirtualHost) GetRoutes() *v3.Matcher { + if x != nil { + return x.Routes + } + return nil +} + +// The generic proxy makes use of the xDS matching API for routing configurations. +// +// In the below example, we combine a top level tree matcher with a linear matcher to match +// the incoming requests, and send the matching requests to v1 of the upstream service. +// +// .. code-block:: yaml +// +// name: example +// routes: +// matcher_tree: +// input: +// name: request-service +// typed_config: +// "@type": type.googleapis.com/envoy.extensions.filters.network.generic_proxy.matcher.v3.ServiceMatchInput +// exact_match_map: +// map: +// service_name_0: +// matcher: +// matcher_list: +// matchers: +// - predicate: +// and_matcher: +// predicate: +// - single_predicate: +// input: +// name: request-properties +// typed_config: +// "@type": type.googleapis.com/envoy.extensions.filters.network.generic_proxy.matcher.v3.PropertyMatchInput +// property_name: version +// value_match: +// exact: v1 +// - single_predicate: +// input: +// name: request-properties +// typed_config: +// "@type": type.googleapis.com/envoy.extensions.filters.network.generic_proxy.matcher.v3.PropertyMatchInput +// property_name: user +// value_match: +// exact: john +// on_match: +// action: +// name: route +// typed_config: +// "@type": type.googleapis.com/envoy.extensions.filters.network.generic_proxy.action.v3.routeAction +// cluster: cluster_0 +type RouteConfiguration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the route configuration. For example, it might match route_config_name in + // envoy.extensions.filters.network.generic_proxy.v3.Rds. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The match tree to use when resolving route actions for incoming requests. + // If no any virtual host is configured in the “virtual_hosts“ field or no special wildcard + // virtual host is configured, the “routes“ field will be used as the default route table. + // If both the wildcard virtual host and “routes“ are configured, the configuration will fail + // to load. + Routes *v3.Matcher `protobuf:"bytes,2,opt,name=routes,proto3" json:"routes,omitempty"` + // An array of virtual hosts that make up the route table. + VirtualHosts []*VirtualHost `protobuf:"bytes,3,rep,name=virtual_hosts,json=virtualHosts,proto3" json:"virtual_hosts,omitempty"` +} + +func (x *RouteConfiguration) Reset() { + *x = RouteConfiguration{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RouteConfiguration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RouteConfiguration) ProtoMessage() {} + +func (x *RouteConfiguration) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RouteConfiguration.ProtoReflect.Descriptor instead. +func (*RouteConfiguration) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDescGZIP(), []int{1} +} + +func (x *RouteConfiguration) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RouteConfiguration) GetRoutes() *v3.Matcher { + if x != nil { + return x.Routes + } + return nil +} + +func (x *RouteConfiguration) GetVirtualHosts() []*VirtualHost { + if x != nil { + return x.VirtualHosts + } + return nil +} + +var File_envoy_extensions_filters_network_generic_proxy_v3_route_proto protoreflect.FileDescriptor + +var file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDesc = []byte{ + 0x0a, 0x3d, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x76, 0x33, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x31, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x76, 0x33, 0x1a, 0x1f, 0x78, 0x64, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x78, 0x64, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8a, + 0x01, 0x0a, 0x0b, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x05, 0x68, + 0x6f, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, + 0x01, 0x02, 0x08, 0x01, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x3e, 0x0a, 0x06, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x64, + 0x73, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, + 0x33, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x12, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x34, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x78, 0x64, 0x73, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x06, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, + 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, + 0x2e, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x0c, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x42, 0xc9, 0x01, 0x0a, 0x3f, 0x69, + 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x42, 0x0a, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x68, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, 0x3b, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0xd2, 0xc6, + 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDescOnce sync.Once + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDescData = file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDesc +) + +func file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDescGZIP() []byte { + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDescOnce.Do(func() { + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDescData) + }) + return file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDescData +} + +var file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_goTypes = []interface{}{ + (*VirtualHost)(nil), // 0: envoy.extensions.filters.network.generic_proxy.v3.VirtualHost + (*RouteConfiguration)(nil), // 1: envoy.extensions.filters.network.generic_proxy.v3.RouteConfiguration + (*v3.Matcher)(nil), // 2: xds.type.matcher.v3.Matcher +} +var file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_depIdxs = []int32{ + 2, // 0: envoy.extensions.filters.network.generic_proxy.v3.VirtualHost.routes:type_name -> xds.type.matcher.v3.Matcher + 2, // 1: envoy.extensions.filters.network.generic_proxy.v3.RouteConfiguration.routes:type_name -> xds.type.matcher.v3.Matcher + 0, // 2: envoy.extensions.filters.network.generic_proxy.v3.RouteConfiguration.virtual_hosts:type_name -> envoy.extensions.filters.network.generic_proxy.v3.VirtualHost + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_init() } +func file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_init() { + if File_envoy_extensions_filters_network_generic_proxy_v3_route_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VirtualHost); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RouteConfiguration); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_goTypes, + DependencyIndexes: file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_depIdxs, + MessageInfos: file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_msgTypes, + }.Build() + File_envoy_extensions_filters_network_generic_proxy_v3_route_proto = out.File + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_rawDesc = nil + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_goTypes = nil + file_envoy_extensions_filters_network_generic_proxy_v3_route_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.go new file mode 100644 index 0000000000..1dbcc023db --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.go @@ -0,0 +1,373 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/filters/network/generic_proxy/v3/route.proto + +package generic_proxyv3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on VirtualHost with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *VirtualHost) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on VirtualHost with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in VirtualHostMultiError, or +// nil if none found. +func (m *VirtualHost) ValidateAll() error { + return m.validate(true) +} + +func (m *VirtualHost) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if utf8.RuneCountInString(m.GetName()) < 1 { + err := VirtualHostValidationError{ + field: "Name", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(m.GetHosts()) < 1 { + err := VirtualHostValidationError{ + field: "Hosts", + reason: "value must contain at least 1 item(s)", + } + if !all { + return err + } + errors = append(errors, err) + } + + if m.GetRoutes() == nil { + err := VirtualHostValidationError{ + field: "Routes", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetRoutes()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, VirtualHostValidationError{ + field: "Routes", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, VirtualHostValidationError{ + field: "Routes", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetRoutes()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return VirtualHostValidationError{ + field: "Routes", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return VirtualHostMultiError(errors) + } + + return nil +} + +// VirtualHostMultiError is an error wrapping multiple validation errors +// returned by VirtualHost.ValidateAll() if the designated constraints aren't met. +type VirtualHostMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m VirtualHostMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m VirtualHostMultiError) AllErrors() []error { return m } + +// VirtualHostValidationError is the validation error returned by +// VirtualHost.Validate if the designated constraints aren't met. +type VirtualHostValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e VirtualHostValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e VirtualHostValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e VirtualHostValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e VirtualHostValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e VirtualHostValidationError) ErrorName() string { return "VirtualHostValidationError" } + +// Error satisfies the builtin error interface +func (e VirtualHostValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sVirtualHost.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = VirtualHostValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = VirtualHostValidationError{} + +// Validate checks the field values on RouteConfiguration with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *RouteConfiguration) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RouteConfiguration with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// RouteConfigurationMultiError, or nil if none found. +func (m *RouteConfiguration) ValidateAll() error { + return m.validate(true) +} + +func (m *RouteConfiguration) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if utf8.RuneCountInString(m.GetName()) < 1 { + err := RouteConfigurationValidationError{ + field: "Name", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetRoutes()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RouteConfigurationValidationError{ + field: "Routes", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RouteConfigurationValidationError{ + field: "Routes", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetRoutes()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RouteConfigurationValidationError{ + field: "Routes", + reason: "embedded message failed validation", + cause: err, + } + } + } + + for idx, item := range m.GetVirtualHosts() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RouteConfigurationValidationError{ + field: fmt.Sprintf("VirtualHosts[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RouteConfigurationValidationError{ + field: fmt.Sprintf("VirtualHosts[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RouteConfigurationValidationError{ + field: fmt.Sprintf("VirtualHosts[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return RouteConfigurationMultiError(errors) + } + + return nil +} + +// RouteConfigurationMultiError is an error wrapping multiple validation errors +// returned by RouteConfiguration.ValidateAll() if the designated constraints +// aren't met. +type RouteConfigurationMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RouteConfigurationMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RouteConfigurationMultiError) AllErrors() []error { return m } + +// RouteConfigurationValidationError is the validation error returned by +// RouteConfiguration.Validate if the designated constraints aren't met. +type RouteConfigurationValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RouteConfigurationValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RouteConfigurationValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RouteConfigurationValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RouteConfigurationValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RouteConfigurationValidationError) ErrorName() string { + return "RouteConfigurationValidationError" +} + +// Error satisfies the builtin error interface +func (e RouteConfigurationValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRouteConfiguration.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RouteConfigurationValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RouteConfigurationValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go index 00774cba57..78a2efccfb 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.go @@ -53,9 +53,8 @@ const ( // (Envoy does not require HTTP/2 to take place over TLS or to use ALPN. // Prior knowledge is allowed). HttpConnectionManager_HTTP2 HttpConnectionManager_CodecType = 2 - // [#not-implemented-hide:] QUIC implementation is not production ready yet. Use this enum with - // caution to prevent accidental execution of QUIC code. I.e. `!= HTTP2` is no longer sufficient - // to distinguish HTTP1 and HTTP2 traffic. + // The connection manager will assume that the client is speaking HTTP/3. + // This needs to be consistent with listener and transport socket config. HttpConnectionManager_HTTP3 HttpConnectionManager_CodecType = 3 ) @@ -343,7 +342,7 @@ func (HttpConnectionManager_Tracing_OperationName) EnumDescriptor() ([]byte, []i return file_envoy_extensions_filters_network_http_connection_manager_v3_http_connection_manager_proto_rawDescGZIP(), []int{0, 0, 0} } -// [#next-free-field: 58] +// [#next-free-field: 59] type HttpConnectionManager struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -376,6 +375,20 @@ type HttpConnectionManager struct { // Additional settings for HTTP requests handled by the connection manager. These will be // applicable to both HTTP1 and HTTP2 requests. CommonHttpProtocolOptions *v3.HttpProtocolOptions `protobuf:"bytes,35,opt,name=common_http_protocol_options,json=commonHttpProtocolOptions,proto3" json:"common_http_protocol_options,omitempty"` + // If set to true, Envoy will not start a drain timer for downstream HTTP1 connections after + // :ref:`common_http_protocol_options.max_connection_duration + // ` passes. + // Instead, Envoy will wait for the next downstream request, add connection:close to the response + // headers, then close the connection after the stream ends. + // + // This behavior is compliant with `RFC 9112 section 9.6 `_ + // + // If set to false, “max_connection_duration“ will cause Envoy to enter the normal drain + // sequence for HTTP1 with Envoy eventually closing the connection (once there are no active + // streams). + // + // Has no effect if “max_connection_duration“ is unset. Defaults to false. + Http1SafeMaxConnectionDuration bool `protobuf:"varint,58,opt,name=http1_safe_max_connection_duration,json=http1SafeMaxConnectionDuration,proto3" json:"http1_safe_max_connection_duration,omitempty"` // Additional HTTP/1 settings that are passed to the HTTP/1 codec. // [#comment:TODO: The following fields are ignored when the // :ref:`header validation configuration ` @@ -385,7 +398,6 @@ type HttpConnectionManager struct { // Additional HTTP/2 settings that are passed directly to the HTTP/2 codec. Http2ProtocolOptions *v3.Http2ProtocolOptions `protobuf:"bytes,9,opt,name=http2_protocol_options,json=http2ProtocolOptions,proto3" json:"http2_protocol_options,omitempty"` // Additional HTTP/3 settings that are passed directly to the HTTP/3 codec. - // [#not-implemented-hide:] Http3ProtocolOptions *v3.Http3ProtocolOptions `protobuf:"bytes,44,opt,name=http3_protocol_options,json=http3ProtocolOptions,proto3" json:"http3_protocol_options,omitempty"` // An optional override that the connection manager will write to the server // header in responses. If not set, the default is “envoy“. @@ -400,7 +412,13 @@ type HttpConnectionManager struct { SchemeHeaderTransformation *v3.SchemeHeaderTransformation `protobuf:"bytes,48,opt,name=scheme_header_transformation,json=schemeHeaderTransformation,proto3" json:"scheme_header_transformation,omitempty"` // The maximum request headers size for incoming connections. // If unconfigured, the default max request headers allowed is 60 KiB. + // The default value can be overridden by setting runtime key “envoy.reloadable_features.max_request_headers_size_kb“. // Requests that exceed this limit will receive a 431 response. + // + // Note: currently some protocol codecs impose limits on the maximum size of a single header: + // + // HTTP/2 (when using nghttp2) limits a single header to around 100kb. + // HTTP/3 limits a single header to around 1024kb. MaxRequestHeadersKb *wrapperspb.UInt32Value `protobuf:"bytes,29,opt,name=max_request_headers_kb,json=maxRequestHeadersKb,proto3" json:"max_request_headers_kb,omitempty"` // The stream idle timeout for connections managed by the connection manager. // If not specified, this defaults to 5 minutes. The default value was selected @@ -498,23 +516,30 @@ type HttpConnectionManager struct { // Configuration for :ref:`HTTP access logs ` // emitted by the connection manager. AccessLog []*v31.AccessLog `protobuf:"bytes,13,rep,name=access_log,json=accessLog,proto3" json:"access_log,omitempty"` + // The interval to flush the above access logs. + // // .. attention:: - // This field is deprecated in favor of - // :ref:`access_log_flush_interval - // `. - // Note that if both this field and :ref:`access_log_flush_interval - // ` - // are specified, the former (deprecated field) is ignored. + // + // This field is deprecated in favor of + // :ref:`access_log_flush_interval + // `. + // Note that if both this field and :ref:`access_log_flush_interval + // ` + // are specified, the former (deprecated field) is ignored. // // Deprecated: Do not use. AccessLogFlushInterval *durationpb.Duration `protobuf:"bytes,54,opt,name=access_log_flush_interval,json=accessLogFlushInterval,proto3" json:"access_log_flush_interval,omitempty"` + // If set to true, HCM will flush an access log once when a new HTTP request is received, after the request + // headers have been evaluated, and before iterating through the HTTP filter chain. + // // .. attention:: - // This field is deprecated in favor of - // :ref:`flush_access_log_on_new_request - // `. - // Note that if both this field and :ref:`flush_access_log_on_new_request - // ` - // are specified, the former (deprecated field) is ignored. + // + // This field is deprecated in favor of + // :ref:`flush_access_log_on_new_request + // `. + // Note that if both this field and :ref:`flush_access_log_on_new_request + // ` + // are specified, the former (deprecated field) is ignored. // // Deprecated: Do not use. FlushAccessLogOnNewRequest bool `protobuf:"varint,55,opt,name=flush_access_log_on_new_request,json=flushAccessLogOnNewRequest,proto3" json:"flush_access_log_on_new_request,omitempty"` @@ -898,6 +923,13 @@ func (x *HttpConnectionManager) GetCommonHttpProtocolOptions() *v3.HttpProtocolO return nil } +func (x *HttpConnectionManager) GetHttp1SafeMaxConnectionDuration() bool { + if x != nil { + return x.Http1SafeMaxConnectionDuration + } + return false +} + func (x *HttpConnectionManager) GetHttpProtocolOptions() *v3.Http1ProtocolOptions { if x != nil { return x.HttpProtocolOptions @@ -3063,7 +3095,7 @@ var file_envoy_extensions_filters_network_http_connection_manager_v3_http_connec 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd2, 0x41, 0x0a, 0x15, 0x48, 0x74, + 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x42, 0x0a, 0x15, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x85, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x64, 0x65, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, @@ -3119,610 +3151,596 @@ var file_envoy_extensions_filters_network_http_connection_manager_v3_http_connec 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x07, 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, 0x01, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5e, 0x0a, 0x15, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, - 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x13, 0x68, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x69, 0x0a, 0x16, 0x68, 0x74, 0x74, 0x70, 0x32, 0x5f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, - 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x42, 0x07, 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, 0x01, 0x52, 0x14, 0x68, 0x74, 0x74, - 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x60, 0x0a, 0x16, 0x68, 0x74, 0x74, 0x70, 0x33, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2c, 0x20, 0x01, 0x28, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x22, 0x68, 0x74, 0x74, 0x70, 0x31, 0x5f, + 0x73, 0x61, 0x66, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x1e, 0x68, 0x74, 0x74, 0x70, 0x31, 0x53, 0x61, 0x66, 0x65, 0x4d, 0x61, 0x78, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x5e, 0x0a, 0x15, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x33, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x14, 0x68, - 0x74, 0x74, 0x70, 0x33, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, - 0x01, 0x02, 0xc8, 0x01, 0x00, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0xb9, 0x01, 0x0a, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x6d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x1a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x72, 0x0a, - 0x1c, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x30, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1a, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x48, 0x65, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x68, + 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x69, 0x0a, 0x16, 0x68, 0x74, 0x74, 0x70, 0x32, 0x5f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x07, + 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, 0x01, 0x52, 0x14, 0x68, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x60, 0x0a, + 0x16, 0x68, 0x74, 0x74, 0x70, 0x33, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x33, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x14, 0x68, 0x74, 0x74, 0x70, 0x33, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x2c, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x02, 0xc8, 0x01, + 0x00, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0xb9, 0x01, + 0x0a, 0x1c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x22, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x6d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, + 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x1a, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x72, 0x0a, 0x1c, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x5d, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x6b, 0x62, 0x18, 0x1d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, - 0x0a, 0xfa, 0x42, 0x07, 0x2a, 0x05, 0x18, 0x80, 0x40, 0x20, 0x00, 0x52, 0x13, 0x6d, 0x61, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4b, 0x62, - 0x12, 0x52, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, - 0x01, 0x52, 0x11, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4b, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x6e, 0x52, 0x1a, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, + 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x5f, 0x6b, 0x62, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, - 0x01, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x12, 0x62, 0x0a, 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x29, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0xfa, - 0x42, 0x05, 0xaa, 0x01, 0x02, 0x32, 0x00, 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, 0x01, 0x52, 0x15, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x4d, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, - 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x1a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x13, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, - 0x6f, 0x67, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x6f, - 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x52, 0x09, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x12, 0x6d, 0x0a, 0x19, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x17, 0x18, 0x01, 0xfa, 0x42, 0x09, 0xaa, 0x01, - 0x06, 0x32, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, - 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x46, 0x6c, 0x75, 0x73, 0x68, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x50, 0x0a, 0x1f, 0x66, 0x6c, 0x75, 0x73, - 0x68, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, - 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x37, 0x20, 0x01, 0x28, - 0x08, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x1a, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x6e, - 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x94, 0x01, 0x0a, 0x12, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x66, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x48, 0x63, 0x6d, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x51, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0x8a, 0x93, 0xb7, 0x2a, 0x02, - 0x08, 0x01, 0x52, 0x10, 0x75, 0x73, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x78, 0x66, 0x66, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, - 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x70, 0x73, 0x18, 0x13, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x11, 0x78, 0x66, 0x66, 0x4e, 0x75, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, - 0x64, 0x48, 0x6f, 0x70, 0x73, 0x12, 0x73, 0x0a, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, - 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2e, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x1d, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x73, 0x0a, 0x20, 0x65, 0x61, - 0x72, 0x6c, 0x79, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x34, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, - 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x1d, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0xa0, 0x01, 0x0a, 0x17, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x19, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x68, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0a, 0xfa, 0x42, 0x07, + 0x2a, 0x05, 0x18, 0x80, 0x40, 0x20, 0x00, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x4b, 0x62, 0x12, 0x52, 0x0a, 0x13, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, 0x01, 0x52, 0x11, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x4b, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, 0x01, 0x52, 0x0e, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x62, 0x0a, + 0x17, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0f, 0xfa, 0x42, 0x05, 0xaa, 0x01, + 0x02, 0x32, 0x00, 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, 0x01, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x64, 0x72, 0x61, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x4d, 0x0a, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x65, 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x0d, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x33, + 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x12, 0x6d, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x17, 0x18, 0x01, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x32, 0x04, 0x10, + 0xc0, 0x84, 0x3d, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x16, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x12, 0x50, 0x0a, 0x1f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x65, 0x77, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x37, 0x20, 0x01, 0x28, 0x08, 0x42, 0x0b, 0x18, + 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x1a, 0x66, 0x6c, 0x75, 0x73, + 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x6e, 0x4e, 0x65, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x94, 0x01, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x38, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x66, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, + 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x48, 0x63, 0x6d, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x51, 0x0a, + 0x12, 0x75, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0x8a, 0x93, 0xb7, 0x2a, 0x02, 0x08, 0x01, 0x52, 0x10, + 0x75, 0x73, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x2f, 0x0a, 0x14, 0x78, 0x66, 0x66, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x72, 0x75, 0x73, + 0x74, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x70, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, + 0x78, 0x66, 0x66, 0x4e, 0x75, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x48, 0x6f, 0x70, + 0x73, 0x12, 0x73, 0x0a, 0x20, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, + 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x1d, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, + 0x6c, 0x49, 0x70, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x73, 0x0a, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x34, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x1d, 0x65, 0x61, + 0x72, 0x6c, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xa0, 0x01, 0x0a, 0x17, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x68, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x15, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, + 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x78, 0x66, 0x66, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x58, 0x66, 0x66, + 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x03, 0x76, 0x69, 0x61, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, 0x02, 0xc8, 0x01, 0x00, + 0x52, 0x03, 0x76, 0x69, 0x61, 0x12, 0x4a, 0x0a, 0x13, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, + 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x5f, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x49, 0x64, 0x12, 0x47, 0x0a, 0x21, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x5f, 0x73, 0x65, 0x74, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x61, + 0x6c, 0x77, 0x61, 0x79, 0x73, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, + 0x64, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xb4, 0x01, 0x0a, 0x1b, + 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x65, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x6b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x15, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x78, 0x66, 0x66, 0x5f, 0x61, - 0x70, 0x70, 0x65, 0x6e, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x6b, 0x69, - 0x70, 0x58, 0x66, 0x66, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x03, 0x76, 0x69, - 0x61, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xc0, 0x01, - 0x02, 0xc8, 0x01, 0x00, 0x52, 0x03, 0x76, 0x69, 0x61, 0x12, 0x4a, 0x0a, 0x13, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x47, 0x0a, 0x21, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, - 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x5f, - 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x1c, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x53, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x49, 0x64, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0xb4, 0x01, 0x0a, 0x1b, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x6b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x18, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x18, 0x66, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0xb4, 0x01, 0x0a, 0x1f, 0x73, 0x65, 0x74, 0x5f, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, - 0x72, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x6e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6c, 0x73, 0x12, 0xb4, 0x01, 0x0a, 0x1f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x6e, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, + 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x2e, 0x53, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x1b, 0x73, 0x65, + 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, + 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x31, 0x30, 0x30, 0x43, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x12, 0x65, 0x0a, 0x31, 0x72, 0x65, 0x70, 0x72, 0x65, + 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x73, 0x5f, 0x69, 0x70, 0x76, 0x34, + 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x2a, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x49, 0x70, 0x76, + 0x34, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x41, 0x73, + 0x49, 0x70, 0x76, 0x34, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x49, 0x70, 0x76, 0x36, 0x12, 0x89, + 0x01, 0x0a, 0x0f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x60, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0e, 0x6e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x1e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, + 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x23, 0x0a, + 0x0d, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x21, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x6c, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x12, 0xb7, 0x01, 0x0a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x6f, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x57, 0x69, 0x74, 0x68, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, + 0x64, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1c, + 0x70, 0x61, 0x74, 0x68, 0x57, 0x69, 0x74, 0x68, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x53, + 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x81, 0x01, 0x0a, + 0x14, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4f, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, + 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x49, 0x44, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x7b, 0x0a, 0x12, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4d, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, + 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x50, 0x0a, + 0x18, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x5f, + 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x27, 0x20, 0x01, 0x28, 0x08, 0x42, + 0x17, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x11, 0x12, 0x0f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x52, 0x15, 0x73, 0x74, 0x72, 0x69, 0x70, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x2f, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x61, 0x6e, 0x79, 0x5f, 0x68, 0x6f, 0x73, + 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x10, + 0x73, 0x74, 0x72, 0x69, 0x70, 0x41, 0x6e, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x69, 0x0a, 0x24, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x5f, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4f, 0x6e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0xa9, 0x01, 0x0a, 0x1a, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x6b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x52, 0x1b, 0x73, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x2c, 0x0a, - 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x31, 0x30, 0x30, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, - 0x6e, 0x75, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x31, 0x30, 0x30, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x12, 0x65, 0x0a, 0x31, 0x72, - 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x73, 0x5f, - 0x69, 0x70, 0x76, 0x34, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x76, 0x36, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x2a, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, - 0x74, 0x49, 0x70, 0x76, 0x34, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x41, 0x73, 0x49, 0x70, 0x76, 0x34, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x49, 0x70, - 0x76, 0x36, 0x12, 0x89, 0x01, 0x0a, 0x0f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x60, 0x2e, 0x65, + 0x61, 0x67, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x18, 0x70, + 0x61, 0x74, 0x68, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x73, 0x74, 0x72, 0x69, 0x70, + 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x64, + 0x6f, 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x73, 0x74, 0x72, 0x69, 0x70, 0x54, + 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x73, 0x74, 0x44, 0x6f, 0x74, 0x12, 0x94, + 0x01, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x64, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, - 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x41, - 0x0a, 0x0e, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x0d, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x53, - 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0xb7, 0x01, 0x0a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x5f, - 0x77, 0x69, 0x74, 0x68, 0x5f, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2d, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, - 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x57, 0x69, 0x74, 0x68, 0x45, 0x73, - 0x63, 0x61, 0x70, 0x65, 0x64, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x1c, 0x70, 0x61, 0x74, 0x68, 0x57, 0x69, 0x74, 0x68, 0x45, 0x73, 0x63, 0x61, - 0x70, 0x65, 0x64, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x81, 0x01, 0x0a, 0x14, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x5f, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x4f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7b, 0x0a, 0x12, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x72, 0x65, - 0x70, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x4d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x6f, 0x0a, 0x1e, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x1b, 0x74, 0x79, 0x70, 0x65, 0x64, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x0a, 0x17, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x5f, 0x78, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x58, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x32, 0x0a, + 0x15, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x6f, 0x76, + 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x68, 0x0a, 0x23, 0x61, 0x64, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1f, 0x61, 0x64, 0x64, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, 0xc2, 0x05, 0x0a, 0x07, + 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x3f, 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x3f, 0x0a, 0x0f, 0x72, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, + 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x10, 0x6f, 0x76, 0x65, + 0x72, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x6f, 0x76, 0x65, + 0x72, 0x61, 0x6c, 0x6c, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x50, 0x61, 0x74, 0x68, 0x54, 0x61, 0x67, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x41, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, 0x61, + 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x33, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x54, 0x61, 0x67, 0x73, 0x12, 0x3f, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x52, 0x08, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x13, 0x73, 0x70, 0x61, 0x77, 0x6e, + 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x11, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, + 0x70, 0x61, 0x6e, 0x22, 0x28, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, 0x3a, 0x5b, 0x9a, + 0xc5, 0x88, 0x1e, 0x56, 0x0a, 0x54, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x18, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x61, 0x67, 0x73, + 0x1a, 0xe7, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x6e, + 0x69, 0x78, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x78, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, + 0x0b, 0x63, 0x69, 0x64, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x69, 0x64, 0x72, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x63, 0x69, 0x64, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3a, + 0x69, 0x9a, 0xc5, 0x88, 0x1e, 0x64, 0x0a, 0x62, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x10, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x50, 0x0a, 0x18, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x27, 0x20, - 0x01, 0x28, 0x08, 0x42, 0x17, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x11, 0x12, 0x0f, 0x73, 0x74, 0x72, - 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x52, 0x15, 0x73, 0x74, - 0x72, 0x69, 0x70, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x73, 0x74, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x61, 0x6e, 0x79, - 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x01, 0x52, 0x10, 0x73, 0x74, 0x72, 0x69, 0x70, 0x41, 0x6e, 0x79, 0x48, 0x6f, 0x73, 0x74, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x69, 0x0a, 0x24, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x28, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1f, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x4f, 0x6e, 0x49, 0x6e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x48, 0x74, 0x74, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0xa9, 0x01, 0x0a, 0x1a, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x2b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x6b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, - 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x4e, 0x6f, 0x72, - 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x18, 0x70, 0x61, 0x74, 0x68, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x73, - 0x74, 0x72, 0x69, 0x70, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x6f, - 0x73, 0x74, 0x5f, 0x64, 0x6f, 0x74, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x73, 0x74, - 0x72, 0x69, 0x70, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x73, 0x74, 0x44, - 0x6f, 0x74, 0x12, 0x94, 0x01, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x64, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, + 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x6f, 0x0a, 0x1e, 0x74, 0x79, 0x70, - 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x32, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x1b, 0x74, - 0x79, 0x70, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x0a, 0x17, 0x61, 0x70, - 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x78, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, - 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x61, 0x70, 0x70, - 0x65, 0x6e, 0x64, 0x58, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, - 0x6c, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4f, 0x76, 0x65, - 0x72, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x68, 0x0a, 0x23, 0x61, 0x64, 0x64, 0x5f, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x35, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1f, - 0x61, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, - 0xc2, 0x05, 0x0a, 0x07, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x3f, 0x0a, 0x0f, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x3f, 0x0a, 0x0f, - 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x72, - 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, - 0x10, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, - 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, - 0x0f, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x6c, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x61, - 0x78, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x50, 0x61, 0x74, 0x68, 0x54, 0x61, - 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x41, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x69, 0x6e, - 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x61, 0x67, 0x52, 0x0a, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x54, 0x61, 0x67, 0x73, 0x12, 0x3f, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x2e, 0x48, 0x74, 0x74, - 0x70, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x13, 0x73, - 0x70, 0x61, 0x77, 0x6e, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x70, - 0x61, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x73, 0x70, 0x61, 0x77, 0x6e, 0x55, 0x70, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x70, 0x61, 0x6e, 0x22, 0x28, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x47, 0x52, - 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, - 0x01, 0x3a, 0x5b, 0x9a, 0xc5, 0x88, 0x1e, 0x56, 0x0a, 0x54, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, - 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x4a, 0x04, - 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x18, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, - 0x74, 0x61, 0x67, 0x73, 0x1a, 0xe7, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, - 0x0a, 0x0c, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x78, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x63, 0x69, 0x64, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x69, - 0x64, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x63, 0x69, 0x64, 0x72, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x3a, 0x69, 0x9a, 0xc5, 0x88, 0x1e, 0x64, 0x0a, 0x62, 0x65, 0x6e, 0x76, 0x6f, + 0x61, 0x67, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x98, 0x02, 0x0a, 0x1b, 0x53, + 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, + 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x75, + 0x62, 0x6a, 0x65, 0x63, 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, 0x42, 0x6f, + 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x63, 0x65, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x64, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x75, 0x72, 0x69, 0x3a, 0x6f, + 0x9a, 0xc5, 0x88, 0x1e, 0x6a, 0x0a, 0x68, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, + 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0xae, 0x02, 0x0a, 0x0d, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x75, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x61, 0x0a, 0x07, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, + 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 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, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x3a, 0x61, 0x9a, 0xc5, 0x88, 0x1e, 0x5c, 0x0a, 0x5a, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x98, - 0x02, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x34, - 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 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, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x65, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x63, 0x65, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x10, - 0x0a, 0x03, 0x64, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x64, 0x6e, 0x73, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x75, - 0x72, 0x69, 0x3a, 0x6f, 0x9a, 0xc5, 0x88, 0x1e, 0x6a, 0x0a, 0x68, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, - 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x1a, 0xae, 0x02, 0x0a, 0x0d, 0x55, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x75, - 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x61, - 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x47, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, - 0x74, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x34, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 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, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x61, 0x9a, 0xc5, 0x88, 0x1e, 0x5c, 0x0a, 0x5a, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xe5, 0x01, 0x0a, 0x18, 0x50, - 0x61, 0x74, 0x68, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x63, 0x0a, 0x19, 0x66, 0x6f, 0x72, 0x77, 0x61, - 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x33, 0x2e, - 0x50, 0x61, 0x74, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x18, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x1a, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x74, - 0x74, 0x70, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x68, 0x74, 0x74, 0x70, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x1a, 0xe4, 0x02, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, - 0x51, 0x0a, 0x25, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x22, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x13, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x73, - 0x65, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x73, 0x65, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x09, 0x75, 0x73, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x6c, - 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x6c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x9d, 0x02, 0x0a, 0x13, 0x48, 0x63, - 0x6d, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x62, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x0c, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x32, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x16, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x43, 0x0a, 0x1f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x65, 0x77, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x6e, - 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x2c, 0x66, 0x6c, - 0x75, 0x73, 0x68, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x74, 0x75, 0x6e, 0x6e, 0x65, - 0x6c, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x65, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x27, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x4c, 0x6f, 0x67, 0x4f, 0x6e, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x45, 0x73, - 0x74, 0x61, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x22, 0x36, 0x0a, 0x09, 0x43, 0x6f, 0x64, - 0x65, 0x63, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x00, - 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x31, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, - 0x54, 0x54, 0x50, 0x32, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x33, 0x10, - 0x03, 0x22, 0x53, 0x0a, 0x1a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x0d, 0x0a, 0x09, 0x4f, 0x56, 0x45, 0x52, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x14, - 0x0a, 0x10, 0x41, 0x50, 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x49, 0x46, 0x5f, 0x41, 0x42, 0x53, 0x45, - 0x4e, 0x54, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x41, 0x53, 0x53, 0x5f, 0x54, 0x48, 0x52, - 0x4f, 0x55, 0x47, 0x48, 0x10, 0x02, 0x22, 0x79, 0x0a, 0x18, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, - 0x64, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x41, 0x4e, 0x49, 0x54, 0x49, 0x5a, 0x45, 0x10, 0x00, - 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, - 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x50, 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x4f, 0x52, - 0x57, 0x41, 0x52, 0x44, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x41, 0x4e, 0x49, 0x54, 0x49, - 0x5a, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x57, 0x41, - 0x59, 0x53, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, - 0x04, 0x22, 0xa0, 0x01, 0x0a, 0x1c, 0x50, 0x61, 0x74, 0x68, 0x57, 0x69, 0x74, 0x68, 0x45, 0x73, - 0x63, 0x61, 0x70, 0x65, 0x64, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x43, 0x5f, 0x44, 0x45, - 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x45, 0x45, 0x50, 0x5f, - 0x55, 0x4e, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, - 0x45, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x02, 0x12, - 0x19, 0x0a, 0x15, 0x55, 0x4e, 0x45, 0x53, 0x43, 0x41, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x52, 0x45, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x55, 0x4e, - 0x45, 0x53, 0x43, 0x41, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, - 0x52, 0x44, 0x10, 0x04, 0x3a, 0x53, 0x9a, 0xc5, 0x88, 0x1e, 0x4e, 0x0a, 0x4c, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x42, 0x16, 0x0a, 0x0f, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x03, 0xf8, 0x42, - 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x4a, 0x04, 0x08, 0x1b, 0x10, 0x1c, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, - 0x52, 0x0c, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xca, - 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x65, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xe5, 0x01, 0x0a, 0x18, 0x50, 0x61, 0x74, 0x68, 0x4e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x63, 0x0a, 0x19, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x61, 0x74, 0x68, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, + 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x1a, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, + 0x33, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x68, 0x74, 0x74, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xe4, + 0x02, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x51, 0x0a, 0x25, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x22, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x32, + 0x0a, 0x15, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x46, 0x6c, 0x61, + 0x67, 0x73, 0x12, 0x41, 0x0a, 0x1d, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x73, 0x65, 0x74, 0x52, 0x65, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x09, 0x75, 0x73, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0x9d, 0x02, 0x0a, 0x13, 0x48, 0x63, 0x6d, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x62, 0x0a, + 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x6c, 0x75, 0x73, + 0x68, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, + 0xaa, 0x01, 0x06, 0x32, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4c, 0x6f, 0x67, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x12, 0x43, 0x0a, 0x1f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x66, 0x6c, 0x75, 0x73, + 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x6e, 0x4e, 0x65, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5d, 0x0a, 0x2c, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, + 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x65, 0x73, 0x74, 0x61, 0x62, + 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x27, 0x66, 0x6c, + 0x75, 0x73, 0x68, 0x4c, 0x6f, 0x67, 0x4f, 0x6e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x45, 0x73, 0x74, 0x61, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x22, 0x36, 0x0a, 0x09, 0x43, 0x6f, 0x64, 0x65, 0x63, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x48, 0x54, 0x54, 0x50, 0x31, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x32, + 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x33, 0x10, 0x03, 0x22, 0x53, 0x0a, + 0x1a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x0a, 0x09, 0x4f, + 0x56, 0x45, 0x52, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x50, + 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x49, 0x46, 0x5f, 0x41, 0x42, 0x53, 0x45, 0x4e, 0x54, 0x10, 0x01, + 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x41, 0x53, 0x53, 0x5f, 0x54, 0x48, 0x52, 0x4f, 0x55, 0x47, 0x48, + 0x10, 0x02, 0x22, 0x79, 0x0a, 0x18, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x43, 0x65, 0x72, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x0c, + 0x0a, 0x08, 0x53, 0x41, 0x4e, 0x49, 0x54, 0x49, 0x5a, 0x45, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, + 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x12, + 0x0a, 0x0e, 0x41, 0x50, 0x50, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, + 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x41, 0x4e, 0x49, 0x54, 0x49, 0x5a, 0x45, 0x5f, 0x53, + 0x45, 0x54, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x5f, 0x46, + 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x04, 0x22, 0xa0, 0x01, + 0x0a, 0x1c, 0x50, 0x61, 0x74, 0x68, 0x57, 0x69, 0x74, 0x68, 0x45, 0x73, 0x63, 0x61, 0x70, 0x65, + 0x64, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x65, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, + 0x0a, 0x1f, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x43, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, + 0x54, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x4b, 0x45, 0x45, 0x50, 0x5f, 0x55, 0x4e, 0x43, 0x48, + 0x41, 0x4e, 0x47, 0x45, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x55, + 0x4e, 0x45, 0x53, 0x43, 0x41, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x44, 0x49, + 0x52, 0x45, 0x43, 0x54, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x55, 0x4e, 0x45, 0x53, 0x43, 0x41, + 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x10, 0x04, + 0x3a, 0x53, 0x9a, 0xc5, 0x88, 0x1e, 0x4e, 0x0a, 0x4c, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, + 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x72, 0x42, 0x16, 0x0a, 0x0f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x42, 0x11, 0x0a, + 0x0f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x4a, 0x04, 0x08, 0x1b, 0x10, 0x1c, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x0c, 0x69, 0x64, + 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0xca, 0x01, 0x0a, 0x10, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x65, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x4b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x52, 0x07, 0x6d, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x0b, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x33, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x62, 0x6f, 0x64, + 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x9c, 0x03, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x4c, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0b, 0xfa, 0x42, 0x08, + 0x2a, 0x06, 0x10, 0xd8, 0x04, 0x28, 0xc8, 0x01, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x60, 0x0a, 0x14, 0x62, 0x6f, + 0x64, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x12, 0x62, 0x6f, 0x64, 0x79, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x12, 0x58, 0x0a, 0x0e, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0xfa, + 0x42, 0x06, 0x92, 0x01, 0x03, 0x10, 0xe8, 0x07, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x54, 0x6f, 0x41, 0x64, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x03, 0x52, 0x64, 0x73, 0x12, 0x51, + 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x41, 0x9a, + 0xc5, 0x88, 0x1e, 0x3c, 0x0a, 0x3a, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x64, 0x73, + 0x22, 0xf7, 0x01, 0x0a, 0x1d, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x79, 0x0a, 0x1b, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x76, 0x33, 0x2e, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, + 0x08, 0x01, 0x52, 0x19, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x5b, 0x9a, + 0xc5, 0x88, 0x1e, 0x56, 0x0a, 0x54, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, + 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xe5, 0x0e, 0x0a, 0x0c, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x8f, 0x01, 0x0a, 0x11, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x59, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, - 0x76, 0x33, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, - 0x72, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x0b, 0x62, 0x6f, - 0x64, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x0a, 0x62, 0x6f, 0x64, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x9c, 0x03, 0x0a, 0x0e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x4c, - 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x0b, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, - 0x0b, 0xfa, 0x42, 0x08, 0x2a, 0x06, 0x10, 0xd8, 0x04, 0x28, 0xc8, 0x01, 0x52, 0x0a, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x60, - 0x0a, 0x14, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x6f, 0x76, - 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x12, 0x62, 0x6f, - 0x64, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, - 0x12, 0x58, 0x0a, 0x0e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x61, - 0x64, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x92, 0x01, 0x03, 0x10, 0xe8, 0x07, 0x52, 0x0c, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x54, 0x6f, 0x41, 0x64, 0x64, 0x22, 0xc7, 0x01, 0x0a, 0x03, 0x52, - 0x64, 0x73, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, - 0x65, 0x3a, 0x41, 0x9a, 0xc5, 0x88, 0x1e, 0x3c, 0x0a, 0x3a, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, - 0x2e, 0x52, 0x64, 0x73, 0x22, 0xf7, 0x01, 0x0a, 0x1d, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x79, 0x0a, 0x1b, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, - 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x11, 0x72, 0x64, + 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0f, 0x72, 0x64, 0x73, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0xa5, 0x01, 0x0a, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x5a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x19, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x3a, 0x5b, 0x9a, 0xc5, 0x88, 0x1e, 0x56, 0x0a, 0x54, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, - 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xe5, - 0x0e, 0x0a, 0x0c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, - 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x8f, 0x01, 0x0a, - 0x11, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x59, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, - 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x4e, - 0x0a, 0x11, 0x72, 0x64, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0f, 0x72, - 0x64, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0xa5, - 0x01, 0x0a, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, - 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x5a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, - 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x67, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, - 0x5f, 0x72, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, - 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, - 0x64, 0x73, 0x48, 0x00, 0x52, 0x09, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x1a, - 0xdf, 0x09, 0x0a, 0x0f, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x12, 0x91, 0x01, 0x0a, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x69, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x09, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0xdb, 0x07, 0x0a, 0x0f, 0x46, 0x72, 0x61, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0xb6, 0x01, 0x0a, 0x16, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x65, 0x78, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x7e, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x14, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x1a, 0x95, 0x05, 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xfa, 0x42, 0x0a, - 0x72, 0x08, 0x10, 0x01, 0xc0, 0x01, 0x01, 0xc8, 0x01, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x70, 0x61, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0xa5, 0x01, 0x0a, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x88, 0x01, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x1d, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x67, 0x0a, 0x0a, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x5f, 0x72, 0x64, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x48, 0x00, + 0x52, 0x09, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x1a, 0xdf, 0x09, 0x0a, 0x0f, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, + 0x91, 0x01, 0x0a, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x69, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, + 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x1a, 0xdb, 0x07, 0x0a, 0x0f, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0xb6, 0x01, 0x0a, 0x16, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x7e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, @@ -3730,124 +3748,142 @@ var file_envoy_extensions_filters_network_http_connection_manager_v3_http_connec 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, - 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4b, 0x76, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0xdb, 0x01, - 0x0a, 0x09, 0x4b, 0x76, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x09, 0x73, - 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x3a, 0x8b, 0x01, - 0x9a, 0xc5, 0x88, 0x1e, 0x85, 0x01, 0x0a, 0x82, 0x01, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, - 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, - 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x2e, 0x4b, 0x76, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x7f, 0x9a, 0xc5, 0x88, - 0x1e, 0x7a, 0x0a, 0x78, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0e, 0x0a, 0x0c, - 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x6a, 0x9a, 0xc5, - 0x88, 0x1e, 0x65, 0x0a, 0x63, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x14, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x1a, 0x95, 0x05, 0x0a, 0x14, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0d, 0xfa, 0x42, 0x0a, 0x72, 0x08, 0x10, 0x01, + 0xc0, 0x01, 0x01, 0xc8, 0x01, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0xa5, 0x01, 0x0a, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x88, 0x01, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, + 0x76, 0x33, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, + 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, + 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4b, 0x76, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0xdb, 0x01, 0x0a, 0x09, 0x4b, 0x76, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x09, 0x73, 0x65, 0x70, 0x61, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x19, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x3a, 0x8b, 0x01, 0x9a, 0xc5, 0x88, 0x1e, + 0x85, 0x01, 0x0a, 0x82, 0x01, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x03, 0xf8, 0x42, 0x01, 0x3a, 0x5a, 0x9a, 0xc5, 0x88, 0x1e, 0x55, 0x0a, 0x53, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, - 0x72, 0x3a, 0x4a, 0x9a, 0xc5, 0x88, 0x1e, 0x45, 0x0a, 0x43, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x45, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4b, 0x76, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x7f, 0x9a, 0xc5, 0x88, 0x1e, 0x7a, 0x0a, 0x78, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0e, 0x0a, 0x0c, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x6a, 0x9a, 0xc5, 0x88, 0x1e, 0x65, 0x0a, + 0x63, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, + 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x2e, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x03, 0xf8, 0x42, + 0x01, 0x3a, 0x5a, 0x9a, 0xc5, 0x88, 0x1e, 0x55, 0x0a, 0x53, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, - 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x42, 0x17, 0x0a, - 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x22, 0xf1, 0x01, 0x0a, 0x09, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x64, 0x52, 0x64, 0x73, 0x12, 0x65, 0x0a, 0x18, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x5f, 0x72, - 0x64, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x15, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x73, - 0x72, 0x64, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x72, 0x64, - 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, - 0x72, 0x3a, 0x47, 0x9a, 0xc5, 0x88, 0x1e, 0x42, 0x0a, 0x40, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x3a, 0x4a, 0x9a, + 0xc5, 0x88, 0x1e, 0x45, 0x0a, 0x43, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, + 0x70, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x42, 0x17, 0x0a, 0x10, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x03, 0xf8, + 0x42, 0x01, 0x22, 0xf1, 0x01, 0x0a, 0x09, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, + 0x12, 0x65, 0x0a, 0x18, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x5f, 0x72, 0x64, 0x73, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x15, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x72, 0x64, 0x73, 0x5f, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x3a, 0x47, 0x9a, + 0xc5, 0x88, 0x1e, 0x42, 0x0a, 0x40, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x63, 0x6f, + 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x22, 0xe8, 0x02, 0x0a, 0x0a, 0x48, 0x74, 0x74, 0x70, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, + 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x58, 0x0a, + 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x48, 0x9a, 0xc5, 0x88, 0x1e, 0x43, 0x0a, 0x41, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, + 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x0d, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, + 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0x9f, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x3a, 0x50, 0x9a, 0xc5, 0x88, 0x1e, 0x4b, 0x0a, 0x49, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, - 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x52, 0x64, 0x73, 0x22, 0xe8, 0x02, 0x0a, 0x0a, 0x48, - 0x74, 0x74, 0x70, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, - 0x6e, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x58, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x33, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x69, - 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x69, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x48, 0x9a, 0xc5, 0x88, 0x1e, 0x43, 0x0a, - 0x41, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, - 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x06, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x9f, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x49, 0x44, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, - 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x3a, 0x50, 0x9a, 0xc5, 0x88, 0x1e, 0x4b, 0x0a, 0x49, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x72, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8e, 0x01, 0x0a, 0x20, 0x45, 0x6e, 0x76, 0x6f, - 0x79, 0x4d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x6a, 0x0a, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x52, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, - 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0xef, 0x01, 0x0a, 0x49, 0x69, 0x6f, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x8e, 0x01, 0x0a, 0x20, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4d, 0x6f, 0x62, + 0x69, 0x6c, 0x65, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x12, 0x6a, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x52, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x42, 0x1a, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x7c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x3b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, - 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x67, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x52, 0x06, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x42, 0xef, 0x01, 0x0a, 0x49, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x2e, + 0x76, 0x33, 0x42, 0x1a, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x7c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x72, 0x2f, 0x76, 0x33, 0x3b, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x76, 0x33, 0xba, 0x80, + 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go index f8ee5fcbb9..8242740326 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.pb.validate.go @@ -200,6 +200,8 @@ func (m *HttpConnectionManager) validate(all bool) error { } } + // no validation rules for Http1SafeMaxConnectionDuration + if all { switch v := interface{}(m.GetHttpProtocolOptions()).(type) { case interface{ ValidateAll() error }: diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/redis_proxy/v3/redis_proxy.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/redis_proxy/v3/redis_proxy.pb.go index 16ff7d44af..e57410da76 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/redis_proxy/v3/redis_proxy.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/redis_proxy/v3/redis_proxy.pb.go @@ -147,7 +147,7 @@ func (RedisProxy_RedisFault_RedisFaultType) EnumDescriptor() ([]byte, []int) { return file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_rawDescGZIP(), []int{0, 2, 0} } -// [#next-free-field: 10] +// [#next-free-field: 11] type RedisProxy struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -252,6 +252,14 @@ type RedisProxy struct { // client. If an AUTH command is received when the password is not set, then an "ERR Client sent // AUTH, but no ACL is set" error will be returned. DownstreamAuthUsername *v3.DataSource `protobuf:"bytes,7,opt,name=downstream_auth_username,json=downstreamAuthUsername,proto3" json:"downstream_auth_username,omitempty"` + // External authentication configuration. If set, instead of validating username and password against “downstream_auth_username“ and “downstream_auth_password“, + // the filter will call an external gRPC service to authenticate the client. + // A typical usage of this feature is for situations where the password is a one-time token that needs to be validated against a remote service, like a sidecar. + // Expiration is also supported, which will disable any further commands from the client after the expiration time, unless a new AUTH command is received and the external auth service returns a new expiration time. + // If the external auth service returns an error, authentication is considered failed. + // If this setting is set together with “downstream_auth_username“ and “downstream_auth_password“, the external auth service will be source of truth, but those fields will still be used for downstream authentication to the cluster. + // The API is defined by :ref:`RedisProxyExternalAuthRequest `. + ExternalAuthProvider *RedisExternalAuthProvider `protobuf:"bytes,10,opt,name=external_auth_provider,json=externalAuthProvider,proto3" json:"external_auth_provider,omitempty"` } func (x *RedisProxy) Reset() { @@ -343,6 +351,13 @@ func (x *RedisProxy) GetDownstreamAuthUsername() *v3.DataSource { return nil } +func (x *RedisProxy) GetExternalAuthProvider() *RedisExternalAuthProvider { + if x != nil { + return x.ExternalAuthProvider + } + return nil +} + // RedisProtocolOptions specifies Redis upstream protocol options. This object is used in // :ref:`typed_extension_protocol_options`, // keyed by the name “envoy.filters.network.redis_proxy“. @@ -405,6 +420,74 @@ func (x *RedisProtocolOptions) GetAuthUsername() *v3.DataSource { return nil } +// RedisExternalAuthProvider specifies a gRPC service that can be used to authenticate Redis clients. +// This service will be called every time an AUTH command is received from a client. +// If the service returns an error, authentication is considered failed. +// If the service returns a success, the client is considered authenticated. +// The service can also return an expiration timestamp, which will be used to disable any further +// commands from the client after it passes, unless a new AUTH command is received and the +// external auth service returns a new expiration timestamp. +type RedisExternalAuthProvider struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // External auth gRPC service configuration. + // It will be called every time an AUTH command is received from a client. + GrpcService *v3.GrpcService `protobuf:"bytes,1,opt,name=grpc_service,json=grpcService,proto3" json:"grpc_service,omitempty"` + // If set to true, the filter will expect an expiration timestamp in the response from the external + // auth service. This timestamp will be used to disable any further commands from the client after + // the expiration time, unless a new AUTH command is received and the external auth service returns + // a new expiration timestamp. + EnableAuthExpiration bool `protobuf:"varint,2,opt,name=enable_auth_expiration,json=enableAuthExpiration,proto3" json:"enable_auth_expiration,omitempty"` +} + +func (x *RedisExternalAuthProvider) Reset() { + *x = RedisExternalAuthProvider{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RedisExternalAuthProvider) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RedisExternalAuthProvider) ProtoMessage() {} + +func (x *RedisExternalAuthProvider) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RedisExternalAuthProvider.ProtoReflect.Descriptor instead. +func (*RedisExternalAuthProvider) Descriptor() ([]byte, []int) { + return file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_rawDescGZIP(), []int{2} +} + +func (x *RedisExternalAuthProvider) GetGrpcService() *v3.GrpcService { + if x != nil { + return x.GrpcService + } + return nil +} + +func (x *RedisExternalAuthProvider) GetEnableAuthExpiration() bool { + if x != nil { + return x.EnableAuthExpiration + } + return false +} + // Redis connection pool settings. // [#next-free-field: 11] type RedisProxy_ConnPoolSettings struct { @@ -480,7 +563,7 @@ type RedisProxy_ConnPoolSettings struct { func (x *RedisProxy_ConnPoolSettings) Reset() { *x = RedisProxy_ConnPoolSettings{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[2] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -493,7 +576,7 @@ func (x *RedisProxy_ConnPoolSettings) String() string { func (*RedisProxy_ConnPoolSettings) ProtoMessage() {} func (x *RedisProxy_ConnPoolSettings) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[2] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -596,7 +679,7 @@ type RedisProxy_PrefixRoutes struct { func (x *RedisProxy_PrefixRoutes) Reset() { *x = RedisProxy_PrefixRoutes{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[3] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -609,7 +692,7 @@ func (x *RedisProxy_PrefixRoutes) String() string { func (*RedisProxy_PrefixRoutes) ProtoMessage() {} func (x *RedisProxy_PrefixRoutes) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[3] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -666,7 +749,7 @@ type RedisProxy_RedisFault struct { func (x *RedisProxy_RedisFault) Reset() { *x = RedisProxy_RedisFault{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[4] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -679,7 +762,7 @@ func (x *RedisProxy_RedisFault) String() string { func (*RedisProxy_RedisFault) ProtoMessage() {} func (x *RedisProxy_RedisFault) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[4] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -737,7 +820,7 @@ type RedisProxy_ConnectionRateLimit struct { func (x *RedisProxy_ConnectionRateLimit) Reset() { *x = RedisProxy_ConnectionRateLimit{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[5] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -750,7 +833,7 @@ func (x *RedisProxy_ConnectionRateLimit) String() string { func (*RedisProxy_ConnectionRateLimit) ProtoMessage() {} func (x *RedisProxy_ConnectionRateLimit) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[5] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -798,7 +881,7 @@ type RedisProxy_PrefixRoutes_Route struct { func (x *RedisProxy_PrefixRoutes_Route) Reset() { *x = RedisProxy_PrefixRoutes_Route{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[6] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -811,7 +894,7 @@ func (x *RedisProxy_PrefixRoutes_Route) String() string { func (*RedisProxy_PrefixRoutes_Route) ProtoMessage() {} func (x *RedisProxy_PrefixRoutes_Route) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[6] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -895,7 +978,7 @@ type RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy struct { func (x *RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy) Reset() { *x = RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[7] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -908,7 +991,7 @@ func (x *RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy) String() string { func (*RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy) ProtoMessage() {} func (x *RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[7] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -957,7 +1040,7 @@ type RedisProxy_PrefixRoutes_Route_ReadCommandPolicy struct { func (x *RedisProxy_PrefixRoutes_Route_ReadCommandPolicy) Reset() { *x = RedisProxy_PrefixRoutes_Route_ReadCommandPolicy{} if protoimpl.UnsafeEnabled { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[8] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -970,7 +1053,7 @@ func (x *RedisProxy_PrefixRoutes_Route_ReadCommandPolicy) String() string { func (*RedisProxy_PrefixRoutes_Route_ReadCommandPolicy) ProtoMessage() {} func (x *RedisProxy_PrefixRoutes_Route_ReadCommandPolicy) ProtoReflect() protoreflect.Message { - mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[8] + mi := &file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1005,281 +1088,301 @@ var file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_rawDe 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x40, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x64, - 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, - 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, 0x2f, 0x64, 0x6e, 0x73, 0x5f, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x75, 0x64, - 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x75, 0x64, - 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, - 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, - 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x75, - 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x90, 0x1c, 0x0a, 0x0a, 0x52, 0x65, - 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x28, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, - 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x12, 0x72, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x67, 0x72, 0x70, 0x63, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x40, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, + 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, + 0x2f, 0x64, 0x6e, 0x73, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x93, 0x1d, 0x0a, 0x0a, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x12, 0x28, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x0a, 0x73, 0x74, 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x72, 0x0a, 0x08, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, + 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x50, + 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x6d, 0x69, + 0x63, 0x72, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6c, 0x61, 0x74, 0x65, + 0x6e, 0x63, 0x79, 0x49, 0x6e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x52, 0x0c, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x18, 0x64, 0x6f, + 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x11, + 0x18, 0x01, 0xb8, 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, + 0x30, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x75, 0x74, + 0x68, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x64, 0x0a, 0x19, 0x64, 0x6f, 0x77, + 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, + 0xb8, 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x52, 0x17, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x41, 0x75, 0x74, 0x68, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x12, + 0x5e, 0x0a, 0x06, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x46, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, + 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x52, 0x65, 0x64, + 0x69, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x62, 0x0a, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x61, 0x75, + 0x74, 0x68, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x42, 0x06, 0xb8, 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x52, 0x16, 0x64, 0x6f, 0x77, + 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x75, 0x74, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x16, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x52, 0x14, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0xa0, 0x08, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x6e, 0x50, + 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x42, 0x0a, 0x0a, 0x6f, + 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xaa, + 0x01, 0x02, 0x08, 0x01, 0x52, 0x09, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x74, 0x61, + 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x2d, + 0x0a, 0x12, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6a, 0x0a, + 0x10, 0x64, 0x6e, 0x73, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x6e, 0x73, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x64, 0x6e, 0x73, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3e, 0x0a, 0x1c, 0x6d, 0x61, 0x78, + 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x18, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x12, 0x4b, 0x0a, 0x14, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x12, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x65, 0x0a, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x70, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1d, + 0x6d, 0x61, 0x78, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, + 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x82, 0x01, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x57, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x12, 0x83, 0x01, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, - 0x79, 0x5f, 0x69, 0x6e, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x49, 0x6e, 0x4d, 0x69, 0x63, 0x72, - 0x6f, 0x73, 0x12, 0x6d, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x5f, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, - 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, - 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x73, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x73, 0x12, 0x6d, 0x0a, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, - 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x11, 0x18, 0x01, 0xb8, 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x92, - 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x41, 0x75, 0x74, 0x68, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x64, 0x0a, 0x19, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x61, - 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, 0xb8, 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x52, 0x17, 0x64, - 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x75, 0x74, 0x68, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x5e, 0x0a, 0x06, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x06, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x62, 0x0a, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, 0xb8, 0xb7, 0x8b, 0xa4, - 0x02, 0x01, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x41, 0x75, - 0x74, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x1a, 0xa0, 0x08, 0x0a, 0x10, 0x43, - 0x6f, 0x6e, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x42, 0x0a, 0x0a, 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x01, 0x52, 0x09, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x74, 0x61, 0x67, 0x67, 0x69, - 0x6e, 0x67, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x64, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x6a, 0x0a, 0x10, 0x64, 0x6e, 0x73, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x5f, 0x66, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x44, - 0x6e, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0e, 0x64, - 0x6e, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3e, 0x0a, - 0x1c, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, - 0x7a, 0x65, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x12, 0x4b, 0x0a, - 0x14, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x65, 0x0a, 0x20, 0x6d, 0x61, - 0x78, 0x5f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x1d, 0x6d, 0x61, 0x78, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x55, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x82, 0x01, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x57, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, - 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, - 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x72, 0x65, - 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x83, 0x01, 0x0a, 0x15, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, - 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x7e, - 0x0a, 0x0a, 0x52, 0x65, 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x06, - 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x10, 0x00, 0x1a, 0x0f, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x09, - 0x0a, 0x07, 0x50, 0x52, 0x49, 0x4d, 0x41, 0x52, 0x59, 0x12, 0x29, 0x0a, 0x0d, 0x50, 0x52, 0x45, - 0x46, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x10, 0x01, 0x1a, 0x16, 0xf2, 0x98, - 0xfe, 0x8f, 0x05, 0x10, 0x0a, 0x0e, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x49, - 0x4d, 0x41, 0x52, 0x59, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x10, - 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x50, 0x4c, - 0x49, 0x43, 0x41, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x04, 0x3a, 0x4d, - 0x9a, 0xc5, 0x88, 0x1e, 0x48, 0x0a, 0x46, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, - 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x43, 0x6f, 0x6e, - 0x6e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0xfa, 0x09, - 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x66, - 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4e, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, - 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x69, - 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x63, 0x61, 0x73, 0x65, 0x49, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, - 0x65, 0x12, 0x76, 0x0a, 0x0f, 0x63, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x65, 0x6e, 0x76, + 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x7e, 0x0a, 0x0a, 0x52, 0x65, + 0x61, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1b, 0x0a, 0x06, 0x4d, 0x41, 0x53, 0x54, + 0x45, 0x52, 0x10, 0x00, 0x1a, 0x0f, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x09, 0x0a, 0x07, 0x50, 0x52, + 0x49, 0x4d, 0x41, 0x52, 0x59, 0x12, 0x29, 0x0a, 0x0d, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x5f, + 0x4d, 0x41, 0x53, 0x54, 0x45, 0x52, 0x10, 0x01, 0x1a, 0x16, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x10, + 0x0a, 0x0e, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x49, 0x4d, 0x41, 0x52, 0x59, + 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x10, 0x02, 0x12, 0x12, 0x0a, + 0x0e, 0x50, 0x52, 0x45, 0x46, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x04, 0x3a, 0x4d, 0x9a, 0xc5, 0x88, 0x1e, + 0x48, 0x0a, 0x46, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, + 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, + 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x50, 0x6f, 0x6f, + 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0xfa, 0x09, 0x0a, 0x0c, 0x50, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x66, 0x0a, 0x06, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x0d, 0x63, 0x61, 0x74, 0x63, - 0x68, 0x41, 0x6c, 0x6c, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x1a, 0xfa, 0x06, 0x0a, 0x05, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0xe8, 0x07, 0x52, 0x06, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x0a, 0x07, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x96, 0x01, - 0x0a, 0x15, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, - 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x62, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, - 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x52, 0x13, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6b, - 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x12, 0x90, 0x01, 0x0a, 0x13, - 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x60, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x75, 0x74, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x61, + 0x73, 0x65, 0x49, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x12, 0x76, 0x0a, + 0x0f, 0x63, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, + 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x0d, 0x63, 0x61, 0x74, 0x63, 0x68, 0x41, 0x6c, 0x6c, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x1a, 0xfa, 0x06, 0x0a, 0x05, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, + 0x20, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0xe8, 0x07, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, + 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x96, 0x01, 0x0a, 0x15, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x62, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x11, 0x72, 0x65, 0x61, - 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0xac, - 0x02, 0x0a, 0x13, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x10, 0x72, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x63, - 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, - 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x61, 0x64, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x63, 0x9a, 0xc5, 0x88, 0x1e, 0x5e, 0x0a, - 0x5c, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, - 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, - 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x36, 0x0a, - 0x11, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x6f, 0x6c, 0x69, + 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x13, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6b, 0x65, 0x79, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x12, 0x90, 0x01, 0x0a, 0x13, 0x72, 0x65, 0x61, 0x64, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x60, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x11, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0xac, 0x02, 0x0a, 0x13, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x21, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x4f, 0x9a, 0xc5, 0x88, 0x1e, 0x4a, 0x0a, 0x48, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, - 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x3a, 0x49, 0x9a, 0xc5, 0x88, 0x1e, 0x44, 0x0a, 0x42, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, - 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x52, 0x11, 0x63, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x61, - 0x6c, 0x6c, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0xe0, 0x02, 0x0a, 0x0a, 0x52, - 0x65, 0x64, 0x69, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x7e, 0x0a, 0x0a, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x55, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, - 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, - 0x46, 0x61, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5d, 0x0a, 0x0d, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, - 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x46, 0x61, - 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x4c, 0x41, 0x59, - 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x1a, 0x60, 0x0a, - 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x12, 0x49, 0x0a, 0x1d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x2a, 0x02, 0x20, 0x00, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x3a, - 0x3c, 0x9a, 0xc5, 0x88, 0x1e, 0x37, 0x0a, 0x35, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x59, 0x0a, 0x10, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x52, + 0x0f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x73, 0x3a, 0x63, 0x9a, 0xc5, 0x88, 0x1e, 0x5e, 0x0a, 0x5c, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x69, 0x72, + 0x72, 0x6f, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x1a, 0x36, 0x0a, 0x11, 0x52, 0x65, 0x61, + 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x21, + 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x3a, 0x4f, 0x9a, 0xc5, 0x88, 0x1e, 0x4a, 0x0a, 0x48, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x3a, 0x49, 0x9a, 0xc5, 0x88, 0x1e, 0x44, 0x0a, 0x42, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x2e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x4a, 0x04, 0x08, + 0x03, 0x10, 0x04, 0x52, 0x11, 0x63, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x1a, 0xe0, 0x02, 0x0a, 0x0a, 0x52, 0x65, 0x64, 0x69, 0x73, + 0x46, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x7e, 0x0a, 0x0a, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x55, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, + 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, + 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x46, 0x61, 0x75, 0x6c, + 0x74, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5d, 0x0a, 0x0d, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x1a, 0x60, 0x0a, 0x13, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x49, 0x0a, 0x1d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, + 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x20, 0x00, + 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x3a, 0x3c, 0x9a, 0xc5, 0x88, + 0x1e, 0x37, 0x0a, 0x35, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, + 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x32, 0x2e, 0x52, + 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, + 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xfc, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x64, + 0x69, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x4d, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, 0xb8, 0xb7, 0x8b, 0xa4, + 0x02, 0x01, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x4d, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, 0xb8, 0xb7, 0x8b, 0xa4, 0x02, + 0x01, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3a, + 0x46, 0x9a, 0xc5, 0x88, 0x1e, 0x41, 0x0a, 0x3f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, - 0x76, 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x03, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0xfc, 0x01, 0x0a, - 0x14, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, - 0xb8, 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x4d, 0x0a, 0x0d, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, + 0x76, 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x64, 0x69, + 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0c, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, 0xb8, - 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x68, 0x55, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x3a, 0x46, 0x9a, 0xc5, 0x88, 0x1e, 0x41, 0x0a, 0x3f, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0xc0, 0x01, 0x0a, 0x3d, - 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, - 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x42, 0x0f, 0x52, - 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x64, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, 0x3b, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, - 0x72, 0x6f, 0x78, 0x79, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x33, 0x2e, 0x47, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0b, + 0x67, 0x72, 0x70, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x68, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0xc0, 0x01, 0x0a, 0x3d, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2e, 0x76, 0x33, 0x42, 0x0f, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x64, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, + 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, + 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, 0x3b, 0x72, + 0x65, 0x64, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, + 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1295,53 +1398,57 @@ func file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_rawD } var file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_goTypes = []interface{}{ (RedisProxy_ConnPoolSettings_ReadPolicy)(0), // 0: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.ReadPolicy (RedisProxy_RedisFault_RedisFaultType)(0), // 1: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault.RedisFaultType (*RedisProxy)(nil), // 2: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy (*RedisProtocolOptions)(nil), // 3: envoy.extensions.filters.network.redis_proxy.v3.RedisProtocolOptions - (*RedisProxy_ConnPoolSettings)(nil), // 4: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings - (*RedisProxy_PrefixRoutes)(nil), // 5: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes - (*RedisProxy_RedisFault)(nil), // 6: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault - (*RedisProxy_ConnectionRateLimit)(nil), // 7: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnectionRateLimit - (*RedisProxy_PrefixRoutes_Route)(nil), // 8: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route - (*RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy)(nil), // 9: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.RequestMirrorPolicy - (*RedisProxy_PrefixRoutes_Route_ReadCommandPolicy)(nil), // 10: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.ReadCommandPolicy - (*v3.DataSource)(nil), // 11: envoy.config.core.v3.DataSource - (*durationpb.Duration)(nil), // 12: google.protobuf.Duration - (*v31.DnsCacheConfig)(nil), // 13: envoy.extensions.common.dynamic_forward_proxy.v3.DnsCacheConfig - (*wrapperspb.UInt32Value)(nil), // 14: google.protobuf.UInt32Value - (*v3.RuntimeFractionalPercent)(nil), // 15: envoy.config.core.v3.RuntimeFractionalPercent + (*RedisExternalAuthProvider)(nil), // 4: envoy.extensions.filters.network.redis_proxy.v3.RedisExternalAuthProvider + (*RedisProxy_ConnPoolSettings)(nil), // 5: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings + (*RedisProxy_PrefixRoutes)(nil), // 6: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes + (*RedisProxy_RedisFault)(nil), // 7: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault + (*RedisProxy_ConnectionRateLimit)(nil), // 8: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnectionRateLimit + (*RedisProxy_PrefixRoutes_Route)(nil), // 9: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route + (*RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy)(nil), // 10: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.RequestMirrorPolicy + (*RedisProxy_PrefixRoutes_Route_ReadCommandPolicy)(nil), // 11: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.ReadCommandPolicy + (*v3.DataSource)(nil), // 12: envoy.config.core.v3.DataSource + (*v3.GrpcService)(nil), // 13: envoy.config.core.v3.GrpcService + (*durationpb.Duration)(nil), // 14: google.protobuf.Duration + (*v31.DnsCacheConfig)(nil), // 15: envoy.extensions.common.dynamic_forward_proxy.v3.DnsCacheConfig + (*wrapperspb.UInt32Value)(nil), // 16: google.protobuf.UInt32Value + (*v3.RuntimeFractionalPercent)(nil), // 17: envoy.config.core.v3.RuntimeFractionalPercent } var file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_depIdxs = []int32{ - 4, // 0: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.settings:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings - 5, // 1: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.prefix_routes:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes - 11, // 2: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.downstream_auth_password:type_name -> envoy.config.core.v3.DataSource - 11, // 3: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.downstream_auth_passwords:type_name -> envoy.config.core.v3.DataSource - 6, // 4: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.faults:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault - 11, // 5: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.downstream_auth_username:type_name -> envoy.config.core.v3.DataSource - 11, // 6: envoy.extensions.filters.network.redis_proxy.v3.RedisProtocolOptions.auth_password:type_name -> envoy.config.core.v3.DataSource - 11, // 7: envoy.extensions.filters.network.redis_proxy.v3.RedisProtocolOptions.auth_username:type_name -> envoy.config.core.v3.DataSource - 12, // 8: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.op_timeout:type_name -> google.protobuf.Duration - 13, // 9: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.dns_cache_config:type_name -> envoy.extensions.common.dynamic_forward_proxy.v3.DnsCacheConfig - 12, // 10: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.buffer_flush_timeout:type_name -> google.protobuf.Duration - 14, // 11: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.max_upstream_unknown_connections:type_name -> google.protobuf.UInt32Value - 0, // 12: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.read_policy:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.ReadPolicy - 7, // 13: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.connection_rate_limit:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnectionRateLimit - 8, // 14: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.routes:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route - 8, // 15: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.catch_all_route:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route - 1, // 16: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault.fault_type:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault.RedisFaultType - 15, // 17: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault.fault_enabled:type_name -> envoy.config.core.v3.RuntimeFractionalPercent - 12, // 18: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault.delay:type_name -> google.protobuf.Duration - 9, // 19: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.request_mirror_policy:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.RequestMirrorPolicy - 10, // 20: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.read_command_policy:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.ReadCommandPolicy - 15, // 21: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.RequestMirrorPolicy.runtime_fraction:type_name -> envoy.config.core.v3.RuntimeFractionalPercent - 22, // [22:22] is the sub-list for method output_type - 22, // [22:22] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 5, // 0: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.settings:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings + 6, // 1: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.prefix_routes:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes + 12, // 2: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.downstream_auth_password:type_name -> envoy.config.core.v3.DataSource + 12, // 3: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.downstream_auth_passwords:type_name -> envoy.config.core.v3.DataSource + 7, // 4: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.faults:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault + 12, // 5: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.downstream_auth_username:type_name -> envoy.config.core.v3.DataSource + 4, // 6: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.external_auth_provider:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisExternalAuthProvider + 12, // 7: envoy.extensions.filters.network.redis_proxy.v3.RedisProtocolOptions.auth_password:type_name -> envoy.config.core.v3.DataSource + 12, // 8: envoy.extensions.filters.network.redis_proxy.v3.RedisProtocolOptions.auth_username:type_name -> envoy.config.core.v3.DataSource + 13, // 9: envoy.extensions.filters.network.redis_proxy.v3.RedisExternalAuthProvider.grpc_service:type_name -> envoy.config.core.v3.GrpcService + 14, // 10: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.op_timeout:type_name -> google.protobuf.Duration + 15, // 11: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.dns_cache_config:type_name -> envoy.extensions.common.dynamic_forward_proxy.v3.DnsCacheConfig + 14, // 12: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.buffer_flush_timeout:type_name -> google.protobuf.Duration + 16, // 13: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.max_upstream_unknown_connections:type_name -> google.protobuf.UInt32Value + 0, // 14: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.read_policy:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.ReadPolicy + 8, // 15: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnPoolSettings.connection_rate_limit:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.ConnectionRateLimit + 9, // 16: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.routes:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route + 9, // 17: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.catch_all_route:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route + 1, // 18: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault.fault_type:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault.RedisFaultType + 17, // 19: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault.fault_enabled:type_name -> envoy.config.core.v3.RuntimeFractionalPercent + 14, // 20: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.RedisFault.delay:type_name -> google.protobuf.Duration + 10, // 21: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.request_mirror_policy:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.RequestMirrorPolicy + 11, // 22: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.read_command_policy:type_name -> envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.ReadCommandPolicy + 17, // 23: envoy.extensions.filters.network.redis_proxy.v3.RedisProxy.PrefixRoutes.Route.RequestMirrorPolicy.runtime_fraction:type_name -> envoy.config.core.v3.RuntimeFractionalPercent + 24, // [24:24] is the sub-list for method output_type + 24, // [24:24] is the sub-list for method input_type + 24, // [24:24] is the sub-list for extension type_name + 24, // [24:24] is the sub-list for extension extendee + 0, // [0:24] is the sub-list for field type_name } func init() { file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_init() } @@ -1375,7 +1482,7 @@ func file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_init } } file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RedisProxy_ConnPoolSettings); i { + switch v := v.(*RedisExternalAuthProvider); i { case 0: return &v.state case 1: @@ -1387,7 +1494,7 @@ func file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_init } } file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RedisProxy_PrefixRoutes); i { + switch v := v.(*RedisProxy_ConnPoolSettings); i { case 0: return &v.state case 1: @@ -1399,7 +1506,7 @@ func file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_init } } file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RedisProxy_RedisFault); i { + switch v := v.(*RedisProxy_PrefixRoutes); i { case 0: return &v.state case 1: @@ -1411,7 +1518,7 @@ func file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_init } } file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RedisProxy_ConnectionRateLimit); i { + switch v := v.(*RedisProxy_RedisFault); i { case 0: return &v.state case 1: @@ -1423,7 +1530,7 @@ func file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_init } } file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RedisProxy_PrefixRoutes_Route); i { + switch v := v.(*RedisProxy_ConnectionRateLimit); i { case 0: return &v.state case 1: @@ -1435,7 +1542,7 @@ func file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_init } } file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy); i { + switch v := v.(*RedisProxy_PrefixRoutes_Route); i { case 0: return &v.state case 1: @@ -1447,6 +1554,18 @@ func file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_init } } file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RedisProxy_PrefixRoutes_Route_RequestMirrorPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RedisProxy_PrefixRoutes_Route_ReadCommandPolicy); i { case 0: return &v.state @@ -1465,7 +1584,7 @@ func file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_init GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_envoy_extensions_filters_network_redis_proxy_v3_redis_proxy_proto_rawDesc, NumEnums: 2, - NumMessages: 9, + NumMessages: 10, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/redis_proxy/v3/redis_proxy.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/redis_proxy/v3/redis_proxy.pb.validate.go index 50462e9ea7..356d0bb772 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/redis_proxy/v3/redis_proxy.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/network/redis_proxy/v3/redis_proxy.pb.validate.go @@ -265,6 +265,35 @@ func (m *RedisProxy) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetExternalAuthProvider()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RedisProxyValidationError{ + field: "ExternalAuthProvider", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RedisProxyValidationError{ + field: "ExternalAuthProvider", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetExternalAuthProvider()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RedisProxyValidationError{ + field: "ExternalAuthProvider", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return RedisProxyMultiError(errors) } @@ -502,6 +531,139 @@ var _ interface { ErrorName() string } = RedisProtocolOptionsValidationError{} +// Validate checks the field values on RedisExternalAuthProvider with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *RedisExternalAuthProvider) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RedisExternalAuthProvider with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// RedisExternalAuthProviderMultiError, or nil if none found. +func (m *RedisExternalAuthProvider) ValidateAll() error { + return m.validate(true) +} + +func (m *RedisExternalAuthProvider) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetGrpcService()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RedisExternalAuthProviderValidationError{ + field: "GrpcService", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RedisExternalAuthProviderValidationError{ + field: "GrpcService", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetGrpcService()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RedisExternalAuthProviderValidationError{ + field: "GrpcService", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for EnableAuthExpiration + + if len(errors) > 0 { + return RedisExternalAuthProviderMultiError(errors) + } + + return nil +} + +// RedisExternalAuthProviderMultiError is an error wrapping multiple validation +// errors returned by RedisExternalAuthProvider.ValidateAll() if the +// designated constraints aren't met. +type RedisExternalAuthProviderMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RedisExternalAuthProviderMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RedisExternalAuthProviderMultiError) AllErrors() []error { return m } + +// RedisExternalAuthProviderValidationError is the validation error returned by +// RedisExternalAuthProvider.Validate if the designated constraints aren't met. +type RedisExternalAuthProviderValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RedisExternalAuthProviderValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RedisExternalAuthProviderValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RedisExternalAuthProviderValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RedisExternalAuthProviderValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RedisExternalAuthProviderValidationError) ErrorName() string { + return "RedisExternalAuthProviderValidationError" +} + +// Error satisfies the builtin error interface +func (e RedisExternalAuthProviderValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRedisExternalAuthProvider.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RedisExternalAuthProviderValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RedisExternalAuthProviderValidationError{} + // Validate checks the field values on RedisProxy_ConnPoolSettings with the // rules defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.pb.go index a18cd42417..9de2faa78e 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.pb.go @@ -349,6 +349,7 @@ type UdpProxyConfig_SessionFilter struct { // Types that are assignable to ConfigType: // // *UdpProxyConfig_SessionFilter_TypedConfig + // *UdpProxyConfig_SessionFilter_ConfigDiscovery ConfigType isUdpProxyConfig_SessionFilter_ConfigType `protobuf_oneof:"config_type"` } @@ -405,6 +406,13 @@ func (x *UdpProxyConfig_SessionFilter) GetTypedConfig() *anypb.Any { return nil } +func (x *UdpProxyConfig_SessionFilter) GetConfigDiscovery() *v3.ExtensionConfigSource { + if x, ok := x.GetConfigType().(*UdpProxyConfig_SessionFilter_ConfigDiscovery); ok { + return x.ConfigDiscovery + } + return nil +} + type isUdpProxyConfig_SessionFilter_ConfigType interface { isUdpProxyConfig_SessionFilter_ConfigType() } @@ -415,8 +423,17 @@ type UdpProxyConfig_SessionFilter_TypedConfig struct { TypedConfig *anypb.Any `protobuf:"bytes,2,opt,name=typed_config,json=typedConfig,proto3,oneof"` } +type UdpProxyConfig_SessionFilter_ConfigDiscovery struct { + // Configuration source specifier for an extension configuration discovery + // service. In case of a failure and without the default configuration, the + // UDP session will be removed. + ConfigDiscovery *v3.ExtensionConfigSource `protobuf:"bytes,3,opt,name=config_discovery,json=configDiscovery,proto3,oneof"` +} + func (*UdpProxyConfig_SessionFilter_TypedConfig) isUdpProxyConfig_SessionFilter_ConfigType() {} +func (*UdpProxyConfig_SessionFilter_ConfigDiscovery) isUdpProxyConfig_SessionFilter_ConfigType() {} + // Configuration for tunneling UDP over other transports or application layers. // Tunneling is currently supported over HTTP/2. // [#next-free-field: 12] @@ -790,203 +807,211 @@ var file_envoy_extensions_filters_udp_udp_proxy_v3_udp_proxy_proto_rawDesc = []b 0x33, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x2c, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x75, 0x64, 0x70, 0x5f, 0x73, 0x6f, 0x63, - 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, - 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x78, 0x64, 0x73, - 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x78, 0x64, - 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, - 0x33, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0xbd, 0x14, 0x0a, 0x0e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x28, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x2e, 0x0a, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0x18, - 0x01, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, - 0x30, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x07, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x78, 0x64, 0x73, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, - 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0xd2, 0xc6, 0xa4, - 0xe1, 0x06, 0x02, 0x08, 0x01, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, - 0x12, 0x3c, 0x0a, 0x0c, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x69, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2d, - 0x0a, 0x13, 0x75, 0x73, 0x65, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, - 0x72, 0x63, 0x5f, 0x69, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x73, 0x65, - 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x53, 0x72, 0x63, 0x49, 0x70, 0x12, 0x73, 0x0a, - 0x0d, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, - 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, - 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, - 0x65, 0x73, 0x12, 0x5b, 0x0a, 0x16, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, 0x53, 0x6f, 0x63, - 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x14, 0x75, 0x70, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, - 0x74, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x75, 0x73, 0x65, 0x50, 0x65, 0x72, 0x50, 0x61, - 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, - 0x67, 0x12, 0x43, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x6f, 0x67, 0x2e, 0x76, - 0x33, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x52, 0x09, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x12, 0x4e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x12, 0x70, 0x0a, 0x0f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x47, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, - 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x74, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, - 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x55, - 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x64, - 0x70, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x0f, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x7b, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4d, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, - 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, - 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x64, 0x70, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x6a, - 0x0a, 0x0a, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x09, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x6a, 0x02, 0x08, 0x01, 0x48, 0x00, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x49, 0x70, 0x12, 0x1b, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x48, 0x00, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x42, 0x17, 0x0a, 0x10, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x1a, 0x76, 0x0a, 0x0d, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, - 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x74, 0x6f, 0x1a, 0x28, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x76, 0x33, 0x2f, 0x75, 0x64, 0x70, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x78, 0x64, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x78, 0x64, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, + 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, + 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x75, + 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x98, 0x15, 0x0a, 0x0e, 0x55, 0x64, + 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x28, 0x0a, 0x0b, + 0x73, 0x74, 0x61, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0x18, 0x01, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x48, 0x00, 0x52, 0x07, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x78, 0x64, 0x73, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, 0x01, 0x48, + 0x00, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0c, 0x69, 0x64, + 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x64, 0x6c, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x5f, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x69, 0x70, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x75, 0x73, 0x65, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x61, 0x6c, 0x53, 0x72, 0x63, 0x49, 0x70, 0x12, 0x73, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x68, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, + 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, + 0x68, 0x61, 0x73, 0x68, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x5b, 0x0a, 0x16, + 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x14, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x40, 0x0a, 0x1d, 0x75, 0x73, 0x65, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x61, 0x64, + 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x19, 0x75, 0x73, 0x65, 0x50, 0x65, 0x72, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x4c, 0x6f, + 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x43, 0x0a, 0x0a, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, + 0x12, 0x4e, 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6c, 0x6f, 0x67, 0x2e, 0x76, 0x33, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, + 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, + 0x12, 0x70, 0x0a, 0x0f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x52, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x77, 0x0a, 0x10, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x64, 0x70, 0x54, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0f, 0x74, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x7b, 0x0a, 0x12, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x55, 0x64, 0x70, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, + 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x6a, 0x0a, 0x0a, 0x48, 0x61, 0x73, 0x68, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x26, 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x6a, 0x02, + 0x08, 0x01, 0x48, 0x00, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x70, 0x12, 0x1b, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x48, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x42, 0x17, 0x0a, 0x10, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, + 0x03, 0xf8, 0x42, 0x01, 0x1a, 0xd0, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, + 0x00, 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x58, + 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x42, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x1a, 0x86, 0x08, 0x0a, 0x12, 0x55, 0x64, 0x70, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, + 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, + 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x68, 0x6f, + 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3b, 0x0a, + 0x13, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x2a, + 0x06, 0x18, 0xff, 0xff, 0x03, 0x20, 0x00, 0x52, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x75, 0x73, + 0x65, 0x50, 0x6f, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x7e, 0x0a, 0x0d, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x59, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x64, 0x70, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x6f, + 0x5f, 0x61, 0x64, 0x64, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, + 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x92, 0x01, 0x03, 0x10, 0xe8, 0x07, 0x52, 0x0c, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x54, 0x6f, 0x41, 0x64, 0x64, 0x12, 0x81, 0x01, 0x0a, + 0x0e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x5a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, + 0x33, 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x55, 0x64, 0x70, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x0d, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x3c, 0x0a, 0x1a, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x3e, + 0x0a, 0x1b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x1a, 0xaf, + 0x01, 0x0a, 0x0d, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, + 0x6d, 0x61, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x67, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, + 0x6d, 0x61, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x1a, 0x5e, 0x0a, 0x0c, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x4e, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x42, 0x0d, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x1a, 0x86, 0x08, 0x0a, 0x12, 0x55, 0x64, 0x70, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x48, 0x6f, 0x73, - 0x74, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, - 0x0a, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x13, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x2a, 0x06, 0x18, 0xff, 0xff, 0x03, - 0x20, 0x00, 0x52, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x73, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x75, 0x73, 0x65, 0x50, 0x6f, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x7e, 0x0a, - 0x0d, 0x72, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x59, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x6d, 0x61, + 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, + 0x1a, 0xc8, 0x01, 0x0a, 0x13, 0x55, 0x64, 0x70, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, + 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x62, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x32, 0x04, + 0x10, 0xc0, 0x84, 0x3d, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x46, + 0x6c, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x4d, 0x0a, 0x24, + 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, + 0x5f, 0x6f, 0x6e, 0x5f, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x66, 0x6c, 0x75, 0x73, + 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x6e, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x3a, 0x3f, 0x9a, 0xc5, 0x88, + 0x1e, 0x3a, 0x0a, 0x38, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x64, + 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x16, 0x0a, 0x0f, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, + 0x03, 0xf8, 0x42, 0x01, 0x42, 0xb0, 0x01, 0x0a, 0x37, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, - 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, - 0x55, 0x64, 0x70, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x0c, 0x72, 0x65, 0x74, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, - 0x0e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x64, 0x64, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, - 0xfa, 0x42, 0x06, 0x92, 0x01, 0x03, 0x10, 0xe8, 0x07, 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x54, 0x6f, 0x41, 0x64, 0x64, 0x12, 0x81, 0x01, 0x0a, 0x0e, 0x62, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x5a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, - 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x64, 0x70, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x55, 0x64, 0x70, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x62, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x70, - 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x18, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x3e, 0x0a, 0x1b, 0x70, 0x72, 0x6f, - 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, - 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, - 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x54, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x1a, 0xaf, 0x01, 0x0a, 0x0d, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x52, 0x0a, 0x16, 0x6d, - 0x61, 0x78, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x67, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, - 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x67, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x4a, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x5f, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, - 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x1a, 0x5e, 0x0a, 0x0c, 0x52, - 0x65, 0x74, 0x72, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4e, 0x0a, 0x14, 0x6d, - 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x1a, 0xc8, 0x01, 0x0a, 0x13, - 0x55, 0x64, 0x70, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x62, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, - 0x67, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x0c, 0xfa, 0x42, 0x09, 0xaa, 0x01, 0x06, 0x32, 0x04, 0x10, 0xc0, 0x84, 0x3d, 0x52, - 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x4d, 0x0a, 0x24, 0x66, 0x6c, 0x75, 0x73, 0x68, - 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x74, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4c, 0x6f, 0x67, 0x4f, 0x6e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x3a, 0x3f, 0x9a, 0xc5, 0x88, 0x1e, 0x3a, 0x0a, 0x38, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x2e, 0x76, 0x32, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x16, 0x0a, 0x0f, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x42, - 0xb0, 0x01, 0x0a, 0x37, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x75, 0x64, 0x70, 0x2e, 0x75, - 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, 0x33, 0x42, 0x0d, 0x55, 0x64, 0x70, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5c, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, - 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x75, 0x64, - 0x70, 0x2f, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, 0x3b, 0x75, - 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, - 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x42, 0x0d, 0x55, 0x64, 0x70, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x5c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x2f, 0x75, 0x64, 0x70, 0x2f, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x2f, 0x76, 0x33, 0x3b, 0x75, 0x64, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x76, 0x33, 0xba, + 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1015,9 +1040,10 @@ var file_envoy_extensions_filters_udp_udp_proxy_v3_udp_proxy_proto_goTypes = []i (*v3.UdpSocketConfig)(nil), // 9: envoy.config.core.v3.UdpSocketConfig (*v31.AccessLog)(nil), // 10: envoy.config.accesslog.v3.AccessLog (*anypb.Any)(nil), // 11: google.protobuf.Any - (*wrapperspb.UInt32Value)(nil), // 12: google.protobuf.UInt32Value - (*v3.HeaderValueOption)(nil), // 13: envoy.config.core.v3.HeaderValueOption - (*wrapperspb.UInt64Value)(nil), // 14: google.protobuf.UInt64Value + (*v3.ExtensionConfigSource)(nil), // 12: envoy.config.core.v3.ExtensionConfigSource + (*wrapperspb.UInt32Value)(nil), // 13: google.protobuf.UInt32Value + (*v3.HeaderValueOption)(nil), // 14: envoy.config.core.v3.HeaderValueOption + (*wrapperspb.UInt64Value)(nil), // 15: google.protobuf.UInt64Value } var file_envoy_extensions_filters_udp_udp_proxy_v3_udp_proxy_proto_depIdxs = []int32{ 7, // 0: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.matcher:type_name -> xds.type.matcher.v3.Matcher @@ -1030,19 +1056,20 @@ var file_envoy_extensions_filters_udp_udp_proxy_v3_udp_proxy_proto_depIdxs = []i 3, // 7: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.tunneling_config:type_name -> envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig 4, // 8: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.access_log_options:type_name -> envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpAccessLogOptions 11, // 9: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.SessionFilter.typed_config:type_name -> google.protobuf.Any - 12, // 10: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.proxy_port:type_name -> google.protobuf.UInt32Value - 6, // 11: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.retry_options:type_name -> envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.RetryOptions - 13, // 12: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.headers_to_add:type_name -> envoy.config.core.v3.HeaderValueOption - 5, // 13: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.buffer_options:type_name -> envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.BufferOptions - 8, // 14: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpAccessLogOptions.access_log_flush_interval:type_name -> google.protobuf.Duration - 12, // 15: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.BufferOptions.max_buffered_datagrams:type_name -> google.protobuf.UInt32Value - 14, // 16: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.BufferOptions.max_buffered_bytes:type_name -> google.protobuf.UInt64Value - 12, // 17: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.RetryOptions.max_connect_attempts:type_name -> google.protobuf.UInt32Value - 18, // [18:18] is the sub-list for method output_type - 18, // [18:18] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 12, // 10: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.SessionFilter.config_discovery:type_name -> envoy.config.core.v3.ExtensionConfigSource + 13, // 11: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.proxy_port:type_name -> google.protobuf.UInt32Value + 6, // 12: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.retry_options:type_name -> envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.RetryOptions + 14, // 13: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.headers_to_add:type_name -> envoy.config.core.v3.HeaderValueOption + 5, // 14: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.buffer_options:type_name -> envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.BufferOptions + 8, // 15: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpAccessLogOptions.access_log_flush_interval:type_name -> google.protobuf.Duration + 13, // 16: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.BufferOptions.max_buffered_datagrams:type_name -> google.protobuf.UInt32Value + 15, // 17: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.BufferOptions.max_buffered_bytes:type_name -> google.protobuf.UInt64Value + 13, // 18: envoy.extensions.filters.udp.udp_proxy.v3.UdpProxyConfig.UdpTunnelingConfig.RetryOptions.max_connect_attempts:type_name -> google.protobuf.UInt32Value + 19, // [19:19] is the sub-list for method output_type + 19, // [19:19] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_envoy_extensions_filters_udp_udp_proxy_v3_udp_proxy_proto_init() } @@ -1146,6 +1173,7 @@ func file_envoy_extensions_filters_udp_udp_proxy_v3_udp_proxy_proto_init() { } file_envoy_extensions_filters_udp_udp_proxy_v3_udp_proxy_proto_msgTypes[2].OneofWrappers = []interface{}{ (*UdpProxyConfig_SessionFilter_TypedConfig)(nil), + (*UdpProxyConfig_SessionFilter_ConfigDiscovery)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.pb.validate.go index c8d48d0079..c146fd0c6d 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/filters/udp/udp_proxy/v3/udp_proxy.pb.validate.go @@ -736,6 +736,47 @@ func (m *UdpProxyConfig_SessionFilter) validate(all bool) error { } } + case *UdpProxyConfig_SessionFilter_ConfigDiscovery: + if v == nil { + err := UdpProxyConfig_SessionFilterValidationError{ + field: "ConfigType", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetConfigDiscovery()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, UdpProxyConfig_SessionFilterValidationError{ + field: "ConfigDiscovery", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, UdpProxyConfig_SessionFilterValidationError{ + field: "ConfigDiscovery", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetConfigDiscovery()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return UdpProxyConfig_SessionFilterValidationError{ + field: "ConfigDiscovery", + reason: "embedded message failed validation", + cause: err, + } + } + } + default: _ = v // ensures v is used } diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/http/original_ip_detection/xff/v3/xff.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/http/original_ip_detection/xff/v3/xff.pb.go index 386671572f..7ca237836e 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/http/original_ip_detection/xff/v3/xff.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/http/original_ip_detection/xff/v3/xff.pb.go @@ -7,10 +7,12 @@ package xffv3 import ( + v3 "github.com/cilium/proxy/go/envoy/config/core/v3" _ "github.com/cncf/xds/go/udpa/annotations" proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" ) @@ -40,7 +42,39 @@ type XffConfig struct { // determining the origin client's IP address. The default is zero if this option // is not specified. See the documentation for // :ref:`config_http_conn_man_headers_x-forwarded-for` for more information. + // + // Only one of “xff_num_trusted_hops“ and “xff_trusted_cidrs“ can be set. XffNumTrustedHops uint32 `protobuf:"varint,1,opt,name=xff_num_trusted_hops,json=xffNumTrustedHops,proto3" json:"xff_num_trusted_hops,omitempty"` + // The `CIDR `_ ranges to trust when + // evaluating the remote IP address to determine the original client's IP address. + // This is used instead of + // :ref:`use_remote_address `. + // When the remote IP address matches a trusted CIDR and the + // :ref:`config_http_conn_man_headers_x-forwarded-for` header was sent, each entry + // in the “x-forwarded-for“ header is evaluated from right to left and the first + // public non-trusted address is used as the original client address. If all + // addresses in “x-forwarded-for“ are within the trusted list, the first (leftmost) + // entry is used. + // + // This is typically used when requests are proxied by a + // `CDN `_. + // + // Only one of “xff_num_trusted_hops“ and “xff_trusted_cidrs“ can be set. + XffTrustedCidrs *XffTrustedCidrs `protobuf:"bytes,2,opt,name=xff_trusted_cidrs,json=xffTrustedCidrs,proto3" json:"xff_trusted_cidrs,omitempty"` + // If set, Envoy will not append the remote address to the + // :ref:`config_http_conn_man_headers_x-forwarded-for` HTTP header. + // + // .. attention:: + // + // For proper proxy behaviour it is not recommended to set this option. + // For backwards compatibility, if this option is unset it defaults to true. + // + // This only applies when :ref:`use_remote_address + // ` + // is false, otherwise :ref:`skip_xff_append + // ` + // applies. + SkipXffAppend *wrapperspb.BoolValue `protobuf:"bytes,3,opt,name=skip_xff_append,json=skipXffAppend,proto3" json:"skip_xff_append,omitempty"` } func (x *XffConfig) Reset() { @@ -82,6 +116,69 @@ func (x *XffConfig) GetXffNumTrustedHops() uint32 { return 0 } +func (x *XffConfig) GetXffTrustedCidrs() *XffTrustedCidrs { + if x != nil { + return x.XffTrustedCidrs + } + return nil +} + +func (x *XffConfig) GetSkipXffAppend() *wrapperspb.BoolValue { + if x != nil { + return x.SkipXffAppend + } + return nil +} + +type XffTrustedCidrs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of `CIDRs `_ from which remote + // connections are considered trusted. + Cidrs []*v3.CidrRange `protobuf:"bytes,1,rep,name=cidrs,proto3" json:"cidrs,omitempty"` +} + +func (x *XffTrustedCidrs) Reset() { + *x = XffTrustedCidrs{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *XffTrustedCidrs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*XffTrustedCidrs) ProtoMessage() {} + +func (x *XffTrustedCidrs) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use XffTrustedCidrs.ProtoReflect.Descriptor instead. +func (*XffTrustedCidrs) Descriptor() ([]byte, []int) { + return file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_rawDescGZIP(), []int{1} +} + +func (x *XffTrustedCidrs) GetCidrs() []*v3.CidrRange { + if x != nil { + return x.Cidrs + } + return nil +} + var File_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto protoreflect.FileDescriptor var file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_rawDesc = []byte{ @@ -92,25 +189,45 @@ var file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_rawDesc = 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x66, 0x66, 0x2e, - 0x76, 0x33, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x3c, 0x0a, 0x09, 0x58, 0x66, 0x66, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, - 0x0a, 0x14, 0x78, 0x66, 0x66, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, - 0x64, 0x5f, 0x68, 0x6f, 0x70, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x78, 0x66, - 0x66, 0x4e, 0x75, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x48, 0x6f, 0x70, 0x73, 0x42, - 0xb7, 0x01, 0x0a, 0x40, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x76, 0x33, 0x1a, 0x22, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf1, 0x01, 0x0a, 0x09, 0x58, 0x66, 0x66, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x14, 0x78, 0x66, 0x66, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x70, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x78, 0x66, 0x66, 0x4e, 0x75, 0x6d, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x48, 0x6f, 0x70, 0x73, 0x12, 0x6f, 0x0a, 0x11, 0x78, 0x66, 0x66, 0x5f, 0x74, 0x72, 0x75, 0x73, + 0x74, 0x65, 0x64, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x43, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x66, - 0x66, 0x2e, 0x76, 0x33, 0x42, 0x08, 0x58, 0x66, 0x66, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x2f, 0x6f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x66, 0x66, 0x2f, 0x76, 0x33, 0x3b, 0x78, 0x66, 0x66, 0x76, - 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x66, 0x2e, 0x76, 0x33, 0x2e, 0x58, 0x66, 0x66, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, + 0x69, 0x64, 0x72, 0x73, 0x52, 0x0f, 0x78, 0x66, 0x66, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x43, 0x69, 0x64, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x0f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x78, 0x66, + 0x66, 0x5f, 0x61, 0x70, 0x70, 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, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x73, 0x6b, 0x69, 0x70, + 0x58, 0x66, 0x66, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x22, 0x48, 0x0a, 0x0f, 0x58, 0x66, 0x66, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x69, 0x64, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x05, + 0x63, 0x69, 0x64, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, + 0x76, 0x33, 0x2e, 0x43, 0x69, 0x64, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x05, 0x63, 0x69, + 0x64, 0x72, 0x73, 0x42, 0xb7, 0x01, 0x0a, 0x40, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x78, 0x66, 0x66, 0x2e, 0x76, 0x33, 0x42, 0x08, 0x58, 0x66, 0x66, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x68, 0x74, + 0x74, 0x70, 0x2f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x66, 0x66, 0x2f, 0x76, 0x33, 0x3b, + 0x78, 0x66, 0x66, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -125,16 +242,22 @@ func file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_rawDescGZ return file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_rawDescData } -var file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_goTypes = []interface{}{ - (*XffConfig)(nil), // 0: envoy.extensions.http.original_ip_detection.xff.v3.XffConfig + (*XffConfig)(nil), // 0: envoy.extensions.http.original_ip_detection.xff.v3.XffConfig + (*XffTrustedCidrs)(nil), // 1: envoy.extensions.http.original_ip_detection.xff.v3.XffTrustedCidrs + (*wrapperspb.BoolValue)(nil), // 2: google.protobuf.BoolValue + (*v3.CidrRange)(nil), // 3: envoy.config.core.v3.CidrRange } var file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 1, // 0: envoy.extensions.http.original_ip_detection.xff.v3.XffConfig.xff_trusted_cidrs:type_name -> envoy.extensions.http.original_ip_detection.xff.v3.XffTrustedCidrs + 2, // 1: envoy.extensions.http.original_ip_detection.xff.v3.XffConfig.skip_xff_append:type_name -> google.protobuf.BoolValue + 3, // 2: envoy.extensions.http.original_ip_detection.xff.v3.XffTrustedCidrs.cidrs:type_name -> envoy.config.core.v3.CidrRange + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_init() } @@ -155,6 +278,18 @@ func file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_init() { return nil } } + file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*XffTrustedCidrs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -162,7 +297,7 @@ func file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_envoy_extensions_http_original_ip_detection_xff_v3_xff_proto_rawDesc, NumEnums: 0, - NumMessages: 1, + NumMessages: 2, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/http/original_ip_detection/xff/v3/xff.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/http/original_ip_detection/xff/v3/xff.pb.validate.go index 41afbdc1ad..fc9811b011 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/http/original_ip_detection/xff/v3/xff.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/http/original_ip_detection/xff/v3/xff.pb.validate.go @@ -59,6 +59,64 @@ func (m *XffConfig) validate(all bool) error { // no validation rules for XffNumTrustedHops + if all { + switch v := interface{}(m.GetXffTrustedCidrs()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, XffConfigValidationError{ + field: "XffTrustedCidrs", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, XffConfigValidationError{ + field: "XffTrustedCidrs", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetXffTrustedCidrs()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return XffConfigValidationError{ + field: "XffTrustedCidrs", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetSkipXffAppend()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, XffConfigValidationError{ + field: "SkipXffAppend", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, XffConfigValidationError{ + field: "SkipXffAppend", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetSkipXffAppend()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return XffConfigValidationError{ + field: "SkipXffAppend", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return XffConfigMultiError(errors) } @@ -135,3 +193,137 @@ var _ interface { Cause() error ErrorName() string } = XffConfigValidationError{} + +// Validate checks the field values on XffTrustedCidrs with the rules defined +// in the proto definition for this message. If any rules are violated, the +// first error encountered is returned, or nil if there are no violations. +func (m *XffTrustedCidrs) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on XffTrustedCidrs with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// XffTrustedCidrsMultiError, or nil if none found. +func (m *XffTrustedCidrs) ValidateAll() error { + return m.validate(true) +} + +func (m *XffTrustedCidrs) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + for idx, item := range m.GetCidrs() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, XffTrustedCidrsValidationError{ + field: fmt.Sprintf("Cidrs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, XffTrustedCidrsValidationError{ + field: fmt.Sprintf("Cidrs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return XffTrustedCidrsValidationError{ + field: fmt.Sprintf("Cidrs[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return XffTrustedCidrsMultiError(errors) + } + + return nil +} + +// XffTrustedCidrsMultiError is an error wrapping multiple validation errors +// returned by XffTrustedCidrs.ValidateAll() if the designated constraints +// aren't met. +type XffTrustedCidrsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m XffTrustedCidrsMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m XffTrustedCidrsMultiError) AllErrors() []error { return m } + +// XffTrustedCidrsValidationError is the validation error returned by +// XffTrustedCidrs.Validate if the designated constraints aren't met. +type XffTrustedCidrsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e XffTrustedCidrsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e XffTrustedCidrsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e XffTrustedCidrsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e XffTrustedCidrsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e XffTrustedCidrsValidationError) ErrorName() string { return "XffTrustedCidrsValidationError" } + +// Error satisfies the builtin error interface +func (e XffTrustedCidrsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sXffTrustedCidrs.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = XffTrustedCidrsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = XffTrustedCidrsValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.pb.go index 882328acac..a825bf599b 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.pb.go @@ -42,12 +42,12 @@ const _ = proto.ProtoPackageIsVersion4 // regardless of result. Only failed queries count toward eps. A config // parameter error_utilization_penalty controls the penalty to adjust endpoint // weights using eps and qps. The weight of a given endpoint is computed as: +// “qps / (utilization + eps/qps * error_utilization_penalty)“. // -// qps / (utilization + eps/qps * error_utilization_penalty) +// See the :ref:`load balancing architecture +// overview` for more information. // -// See the :ref:`load balancing architecture overview` for more information. -// -// [#next-free-field: 7] +// [#next-free-field: 8] type ClientSideWeightedRoundRobin struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -80,6 +80,11 @@ type ClientSideWeightedRoundRobin struct { // calculated as eps/qps. Configuration is rejected if this value is negative. // Default is 1.0. ErrorUtilizationPenalty *wrapperspb.FloatValue `protobuf:"bytes,6,opt,name=error_utilization_penalty,json=errorUtilizationPenalty,proto3" json:"error_utilization_penalty,omitempty"` + // By default, endpoint weight is computed based on the :ref:`application_utilization ` field reported by the endpoint. + // If that field is not set, then utilization will instead be computed by taking the max of the values of the metrics specified here. + // For map fields in the ORCA proto, the string will be of the form “.“. For example, the string “named_metrics.foo“ will mean to look for the key “foo“ in the ORCA :ref:`named_metrics ` field. + // If none of the specified metrics are present in the load report, then :ref:`cpu_utilization ` is used instead. + MetricNamesForComputingUtilization []string `protobuf:"bytes,7,rep,name=metric_names_for_computing_utilization,json=metricNamesForComputingUtilization,proto3" json:"metric_names_for_computing_utilization,omitempty"` } func (x *ClientSideWeightedRoundRobin) Reset() { @@ -156,6 +161,13 @@ func (x *ClientSideWeightedRoundRobin) GetErrorUtilizationPenalty() *wrapperspb. return nil } +func (x *ClientSideWeightedRoundRobin) GetMetricNamesForComputingUtilization() []string { + if x != nil { + return x.MetricNamesForComputingUtilization + } + return nil +} + var File_envoy_extensions_load_balancing_policies_client_side_weighted_round_robin_v3_client_side_weighted_round_robin_proto protoreflect.FileDescriptor var file_envoy_extensions_load_balancing_policies_client_side_weighted_round_robin_v3_client_side_weighted_round_robin_proto_rawDesc = []byte{ @@ -178,7 +190,7 @@ var file_envoy_extensions_load_balancing_policies_client_side_weighted_round_rob 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x87, 0x04, 0x0a, 0x1c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdb, 0x04, 0x0a, 0x1c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x12, 0x4f, 0x0a, 0x16, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x6f, 0x62, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, @@ -211,26 +223,31 @@ var file_envoy_extensions_load_balancing_policies_client_side_weighted_round_rob 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x0a, 0x05, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x52, 0x17, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, - 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x42, 0xa2, 0x02, 0x0a, 0x5a, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x72, 0x6f, 0x62, 0x69, - 0x6e, 0x2e, 0x76, 0x33, 0x42, 0x21, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x64, 0x65, - 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x62, - 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x96, 0x01, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, - 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, - 0x5f, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x72, 0x6f, 0x62, 0x69, 0x6e, 0x2f, 0x76, 0x33, 0x3b, + 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x52, 0x0a, 0x26, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x22, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4e, 0x61, 0x6d, + 0x65, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x55, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xa2, 0x02, 0x0a, 0x5a, 0x69, 0x6f, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x69, 0x65, 0x73, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x64, 0x65, + 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, + 0x72, 0x6f, 0x62, 0x69, 0x6e, 0x2e, 0x76, 0x33, 0x42, 0x21, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x53, 0x69, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x6e, + 0x64, 0x52, 0x6f, 0x62, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x96, 0x01, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x72, 0x6f, 0x62, 0x69, 0x6e, - 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x2f, 0x76, 0x33, 0x3b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x72, + 0x6f, 0x62, 0x69, 0x6e, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/network/v3/network_inputs.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/network/v3/network_inputs.pb.go index 8c0869348a..7520f7a666 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/network/v3/network_inputs.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/network/v3/network_inputs.pb.go @@ -478,6 +478,159 @@ func (x *FilterStateInput) GetKey() string { return "" } +// Input that matches dynamic metadata by key. +// DynamicMetadataInput provides a general interface using “filter“ and “path“ to retrieve value from +// :ref:`Metadata `. +// +// For example, for the following Metadata: +// +// .. code-block:: yaml +// +// filter_metadata: +// envoy.xxx: +// prop: +// foo: bar +// xyz: +// hello: envoy +// +// The following DynamicMetadataInput will retrieve a string value "bar" from the Metadata. +// +// .. code-block:: yaml +// +// filter: envoy.xxx +// path: +// - key: prop +// - key: foo +// +// [#extension: envoy.matching.inputs.dynamic_metadata] +type DynamicMetadataInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The filter name to retrieve the Struct from the Metadata. + Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` + // The path to retrieve the Value from the Struct. + Path []*DynamicMetadataInput_PathSegment `protobuf:"bytes,2,rep,name=path,proto3" json:"path,omitempty"` +} + +func (x *DynamicMetadataInput) Reset() { + *x = DynamicMetadataInput{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DynamicMetadataInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DynamicMetadataInput) ProtoMessage() {} + +func (x *DynamicMetadataInput) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DynamicMetadataInput.ProtoReflect.Descriptor instead. +func (*DynamicMetadataInput) Descriptor() ([]byte, []int) { + return file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_rawDescGZIP(), []int{10} +} + +func (x *DynamicMetadataInput) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + +func (x *DynamicMetadataInput) GetPath() []*DynamicMetadataInput_PathSegment { + if x != nil { + return x.Path + } + return nil +} + +// Specifies the segment in a path to retrieve value from Metadata. +// Note: Currently it's not supported to retrieve a value from a list in Metadata. This means that +// if the segment key refers to a list, it has to be the last segment in a path. +type DynamicMetadataInput_PathSegment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Segment: + // + // *DynamicMetadataInput_PathSegment_Key + Segment isDynamicMetadataInput_PathSegment_Segment `protobuf_oneof:"segment"` +} + +func (x *DynamicMetadataInput_PathSegment) Reset() { + *x = DynamicMetadataInput_PathSegment{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DynamicMetadataInput_PathSegment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DynamicMetadataInput_PathSegment) ProtoMessage() {} + +func (x *DynamicMetadataInput_PathSegment) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DynamicMetadataInput_PathSegment.ProtoReflect.Descriptor instead. +func (*DynamicMetadataInput_PathSegment) Descriptor() ([]byte, []int) { + return file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_rawDescGZIP(), []int{10, 0} +} + +func (m *DynamicMetadataInput_PathSegment) GetSegment() isDynamicMetadataInput_PathSegment_Segment { + if m != nil { + return m.Segment + } + return nil +} + +func (x *DynamicMetadataInput_PathSegment) GetKey() string { + if x, ok := x.GetSegment().(*DynamicMetadataInput_PathSegment_Key); ok { + return x.Key + } + return "" +} + +type isDynamicMetadataInput_PathSegment_Segment interface { + isDynamicMetadataInput_PathSegment_Segment() +} + +type DynamicMetadataInput_PathSegment_Key struct { + // If specified, use the key to retrieve the value in a Struct. + Key string `protobuf:"bytes,1,opt,name=key,proto3,oneof"` +} + +func (*DynamicMetadataInput_PathSegment_Key) isDynamicMetadataInput_PathSegment_Segment() {} + var File_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto protoreflect.FileDescriptor var file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_rawDesc = []byte{ @@ -507,20 +660,35 @@ var file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x2d, 0x0a, 0x10, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x19, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x42, 0xc5, 0x01, 0x0a, 0x40, 0x69, 0x6f, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x76, 0x33, 0x42, 0x12, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x63, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x76, 0x33, 0x3b, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, - 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0xe7, 0x01, 0x0a, 0x14, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x72, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x54, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x50, 0x61, 0x74, 0x68, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, + 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x3a, 0x0a, 0x0b, 0x50, 0x61, 0x74, 0x68, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x48, 0x00, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x42, 0x0e, 0x0a, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x03, + 0xf8, 0x42, 0x01, 0x42, 0xc5, 0x01, 0x0a, 0x40, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x76, 0x33, 0x42, 0x12, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x63, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2f, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x76, 0x33, 0x3b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -535,25 +703,28 @@ func file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_prot return file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_rawDescData } -var file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_goTypes = []interface{}{ - (*DestinationIPInput)(nil), // 0: envoy.extensions.matching.common_inputs.network.v3.DestinationIPInput - (*DestinationPortInput)(nil), // 1: envoy.extensions.matching.common_inputs.network.v3.DestinationPortInput - (*SourceIPInput)(nil), // 2: envoy.extensions.matching.common_inputs.network.v3.SourceIPInput - (*SourcePortInput)(nil), // 3: envoy.extensions.matching.common_inputs.network.v3.SourcePortInput - (*DirectSourceIPInput)(nil), // 4: envoy.extensions.matching.common_inputs.network.v3.DirectSourceIPInput - (*SourceTypeInput)(nil), // 5: envoy.extensions.matching.common_inputs.network.v3.SourceTypeInput - (*ServerNameInput)(nil), // 6: envoy.extensions.matching.common_inputs.network.v3.ServerNameInput - (*TransportProtocolInput)(nil), // 7: envoy.extensions.matching.common_inputs.network.v3.TransportProtocolInput - (*ApplicationProtocolInput)(nil), // 8: envoy.extensions.matching.common_inputs.network.v3.ApplicationProtocolInput - (*FilterStateInput)(nil), // 9: envoy.extensions.matching.common_inputs.network.v3.FilterStateInput + (*DestinationIPInput)(nil), // 0: envoy.extensions.matching.common_inputs.network.v3.DestinationIPInput + (*DestinationPortInput)(nil), // 1: envoy.extensions.matching.common_inputs.network.v3.DestinationPortInput + (*SourceIPInput)(nil), // 2: envoy.extensions.matching.common_inputs.network.v3.SourceIPInput + (*SourcePortInput)(nil), // 3: envoy.extensions.matching.common_inputs.network.v3.SourcePortInput + (*DirectSourceIPInput)(nil), // 4: envoy.extensions.matching.common_inputs.network.v3.DirectSourceIPInput + (*SourceTypeInput)(nil), // 5: envoy.extensions.matching.common_inputs.network.v3.SourceTypeInput + (*ServerNameInput)(nil), // 6: envoy.extensions.matching.common_inputs.network.v3.ServerNameInput + (*TransportProtocolInput)(nil), // 7: envoy.extensions.matching.common_inputs.network.v3.TransportProtocolInput + (*ApplicationProtocolInput)(nil), // 8: envoy.extensions.matching.common_inputs.network.v3.ApplicationProtocolInput + (*FilterStateInput)(nil), // 9: envoy.extensions.matching.common_inputs.network.v3.FilterStateInput + (*DynamicMetadataInput)(nil), // 10: envoy.extensions.matching.common_inputs.network.v3.DynamicMetadataInput + (*DynamicMetadataInput_PathSegment)(nil), // 11: envoy.extensions.matching.common_inputs.network.v3.DynamicMetadataInput.PathSegment } var file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 11, // 0: envoy.extensions.matching.common_inputs.network.v3.DynamicMetadataInput.path:type_name -> envoy.extensions.matching.common_inputs.network.v3.DynamicMetadataInput.PathSegment + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_init() } @@ -682,6 +853,33 @@ func file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_prot return nil } } + file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DynamicMetadataInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DynamicMetadataInput_PathSegment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_msgTypes[11].OneofWrappers = []interface{}{ + (*DynamicMetadataInput_PathSegment_Key)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -689,7 +887,7 @@ func file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_prot GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_envoy_extensions_matching_common_inputs_network_v3_network_inputs_proto_rawDesc, NumEnums: 0, - NumMessages: 10, + NumMessages: 12, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/network/v3/network_inputs.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/network/v3/network_inputs.pb.validate.go index cfcfb86d99..c96a03b193 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/network/v3/network_inputs.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/network/v3/network_inputs.pb.validate.go @@ -1055,3 +1055,306 @@ var _ interface { Cause() error ErrorName() string } = FilterStateInputValidationError{} + +// Validate checks the field values on DynamicMetadataInput with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *DynamicMetadataInput) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on DynamicMetadataInput with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// DynamicMetadataInputMultiError, or nil if none found. +func (m *DynamicMetadataInput) ValidateAll() error { + return m.validate(true) +} + +func (m *DynamicMetadataInput) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if utf8.RuneCountInString(m.GetFilter()) < 1 { + err := DynamicMetadataInputValidationError{ + field: "Filter", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(m.GetPath()) < 1 { + err := DynamicMetadataInputValidationError{ + field: "Path", + reason: "value must contain at least 1 item(s)", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetPath() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DynamicMetadataInputValidationError{ + field: fmt.Sprintf("Path[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DynamicMetadataInputValidationError{ + field: fmt.Sprintf("Path[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DynamicMetadataInputValidationError{ + field: fmt.Sprintf("Path[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return DynamicMetadataInputMultiError(errors) + } + + return nil +} + +// DynamicMetadataInputMultiError is an error wrapping multiple validation +// errors returned by DynamicMetadataInput.ValidateAll() if the designated +// constraints aren't met. +type DynamicMetadataInputMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m DynamicMetadataInputMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m DynamicMetadataInputMultiError) AllErrors() []error { return m } + +// DynamicMetadataInputValidationError is the validation error returned by +// DynamicMetadataInput.Validate if the designated constraints aren't met. +type DynamicMetadataInputValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DynamicMetadataInputValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DynamicMetadataInputValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DynamicMetadataInputValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DynamicMetadataInputValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DynamicMetadataInputValidationError) ErrorName() string { + return "DynamicMetadataInputValidationError" +} + +// Error satisfies the builtin error interface +func (e DynamicMetadataInputValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDynamicMetadataInput.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DynamicMetadataInputValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DynamicMetadataInputValidationError{} + +// Validate checks the field values on DynamicMetadataInput_PathSegment with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *DynamicMetadataInput_PathSegment) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on DynamicMetadataInput_PathSegment with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// DynamicMetadataInput_PathSegmentMultiError, or nil if none found. +func (m *DynamicMetadataInput_PathSegment) ValidateAll() error { + return m.validate(true) +} + +func (m *DynamicMetadataInput_PathSegment) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + oneofSegmentPresent := false + switch v := m.Segment.(type) { + case *DynamicMetadataInput_PathSegment_Key: + if v == nil { + err := DynamicMetadataInput_PathSegmentValidationError{ + field: "Segment", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + oneofSegmentPresent = true + + if utf8.RuneCountInString(m.GetKey()) < 1 { + err := DynamicMetadataInput_PathSegmentValidationError{ + field: "Key", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + default: + _ = v // ensures v is used + } + if !oneofSegmentPresent { + err := DynamicMetadataInput_PathSegmentValidationError{ + field: "Segment", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(errors) > 0 { + return DynamicMetadataInput_PathSegmentMultiError(errors) + } + + return nil +} + +// DynamicMetadataInput_PathSegmentMultiError is an error wrapping multiple +// validation errors returned by +// DynamicMetadataInput_PathSegment.ValidateAll() if the designated +// constraints aren't met. +type DynamicMetadataInput_PathSegmentMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m DynamicMetadataInput_PathSegmentMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m DynamicMetadataInput_PathSegmentMultiError) AllErrors() []error { return m } + +// DynamicMetadataInput_PathSegmentValidationError is the validation error +// returned by DynamicMetadataInput_PathSegment.Validate if the designated +// constraints aren't met. +type DynamicMetadataInput_PathSegmentValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DynamicMetadataInput_PathSegmentValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DynamicMetadataInput_PathSegmentValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DynamicMetadataInput_PathSegmentValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DynamicMetadataInput_PathSegmentValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DynamicMetadataInput_PathSegmentValidationError) ErrorName() string { + return "DynamicMetadataInput_PathSegmentValidationError" +} + +// Error satisfies the builtin error interface +func (e DynamicMetadataInput_PathSegmentValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDynamicMetadataInput_PathSegment.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DynamicMetadataInput_PathSegmentValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DynamicMetadataInput_PathSegmentValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3/metadata.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3/metadata.pb.go new file mode 100644 index 0000000000..e85588aa50 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3/metadata.pb.go @@ -0,0 +1,190 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/matching/input_matchers/metadata/v3/metadata.proto + +package metadatav3 + +import ( + v3 "github.com/cilium/proxy/go/envoy/type/matcher/v3" + _ "github.com/cncf/xds/go/udpa/annotations" + _ "github.com/envoyproxy/protoc-gen-validate/validate" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Metadata matcher for metadata from http matching input data. +type Metadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The Metadata is matched if the value retrieved by metadata matching input is matched to this value. + Value *v3.ValueMatcher `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + // If true, the match result will be inverted. + Invert bool `protobuf:"varint,4,opt,name=invert,proto3" json:"invert,omitempty"` +} + +func (x *Metadata) Reset() { + *x = Metadata{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Metadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Metadata) ProtoMessage() {} + +func (x *Metadata) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Metadata.ProtoReflect.Descriptor instead. +func (*Metadata) Descriptor() ([]byte, []int) { + return file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDescGZIP(), []int{0} +} + +func (x *Metadata) GetValue() *v3.ValueMatcher { + if x != nil { + return x.Value + } + return nil +} + +func (x *Metadata) GetInvert() bool { + if x != nil { + return x.Invert + } + return false +} + +var File_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto protoreflect.FileDescriptor + +var file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDesc = []byte{ + 0x0a, 0x43, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x34, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, + 0x2e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x2e, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x33, 0x1a, 0x21, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2f, + 0x76, 0x33, 0x2f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, + 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x67, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x43, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x42, + 0xc5, 0x01, 0x0a, 0x42, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x76, 0x33, 0x42, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x66, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, + 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x2f, 0x76, 0x33, 0x3b, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x76, 0x33, 0xba, + 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDescOnce sync.Once + file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDescData = file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDesc +) + +func file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDescGZIP() []byte { + file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDescOnce.Do(func() { + file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDescData) + }) + return file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDescData +} + +var file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_goTypes = []interface{}{ + (*Metadata)(nil), // 0: envoy.extensions.matching.input_matchers.metadata.v3.Metadata + (*v3.ValueMatcher)(nil), // 1: envoy.type.matcher.v3.ValueMatcher +} +var file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_depIdxs = []int32{ + 1, // 0: envoy.extensions.matching.input_matchers.metadata.v3.Metadata.value:type_name -> envoy.type.matcher.v3.ValueMatcher + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_init() } +func file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_init() { + if File_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Metadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_goTypes, + DependencyIndexes: file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_depIdxs, + MessageInfos: file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_msgTypes, + }.Build() + File_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto = out.File + file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_rawDesc = nil + file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_goTypes = nil + file_envoy_extensions_matching_input_matchers_metadata_v3_metadata_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3/metadata.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3/metadata.pb.validate.go new file mode 100644 index 0000000000..340e11121c --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3/metadata.pb.validate.go @@ -0,0 +1,177 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/matching/input_matchers/metadata/v3/metadata.proto + +package metadatav3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on Metadata with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Metadata) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Metadata with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in MetadataMultiError, or nil +// if none found. +func (m *Metadata) ValidateAll() error { + return m.validate(true) +} + +func (m *Metadata) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if m.GetValue() == nil { + err := MetadataValidationError{ + field: "Value", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetValue()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetadataValidationError{ + field: "Value", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetadataValidationError{ + field: "Value", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetValue()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetadataValidationError{ + field: "Value", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for Invert + + if len(errors) > 0 { + return MetadataMultiError(errors) + } + + return nil +} + +// MetadataMultiError is an error wrapping multiple validation errors returned +// by Metadata.ValidateAll() if the designated constraints aren't met. +type MetadataMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m MetadataMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m MetadataMultiError) AllErrors() []error { return m } + +// MetadataValidationError is the validation error returned by +// Metadata.Validate if the designated constraints aren't met. +type MetadataValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MetadataValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MetadataValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MetadataValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MetadataValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MetadataValidationError) ErrorName() string { return "MetadataValidationError" } + +// Error satisfies the builtin error interface +func (e MetadataValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMetadata.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MetadataValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MetadataValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/getaddrinfo/v3/getaddrinfo_dns_resolver.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/getaddrinfo/v3/getaddrinfo_dns_resolver.pb.go index 55dc03fb2f..890a53b64c 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/getaddrinfo/v3/getaddrinfo_dns_resolver.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/getaddrinfo/v3/getaddrinfo_dns_resolver.pb.go @@ -11,6 +11,7 @@ import ( proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" ) @@ -43,6 +44,10 @@ type GetAddrInfoDnsResolverConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + // Specifies the number of retries before the resolver gives up. If not specified, the resolver will + // retry indefinitely until it succeeds or the DNS query times out. + NumRetries *wrapperspb.UInt32Value `protobuf:"bytes,1,opt,name=num_retries,json=numRetries,proto3" json:"num_retries,omitempty"` } func (x *GetAddrInfoDnsResolverConfig) Reset() { @@ -77,6 +82,13 @@ func (*GetAddrInfoDnsResolverConfig) Descriptor() ([]byte, []int) { return file_envoy_extensions_network_dns_resolver_getaddrinfo_v3_getaddrinfo_dns_resolver_proto_rawDescGZIP(), []int{0} } +func (x *GetAddrInfoDnsResolverConfig) GetNumRetries() *wrapperspb.UInt32Value { + if x != nil { + return x.NumRetries + } + return nil +} + var File_envoy_extensions_network_dns_resolver_getaddrinfo_v3_getaddrinfo_dns_resolver_proto protoreflect.FileDescriptor var file_envoy_extensions_network_dns_resolver_getaddrinfo_v3_getaddrinfo_dns_resolver_proto_rawDesc = []byte{ @@ -88,25 +100,31 @@ var file_envoy_extensions_network_dns_resolver_getaddrinfo_v3_getaddrinfo_dns_re 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x34, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, - 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x76, 0x33, 0x1a, 0x1d, 0x75, 0x64, 0x70, + 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x76, 0x33, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1e, 0x0a, 0x1c, 0x47, 0x65, + 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5d, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x44, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x6f, - 0x6c, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0xd6, 0x01, 0x0a, 0x42, 0x69, - 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x72, 0x2e, 0x67, 0x65, 0x74, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x76, - 0x33, 0x42, 0x1b, 0x47, 0x65, 0x74, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x44, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x69, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x2f, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2f, 0x67, - 0x65, 0x74, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2f, 0x76, 0x33, 0x3b, 0x67, 0x65, - 0x74, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, - 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x0b, 0x6e, 0x75, + 0x6d, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x6e, + 0x75, 0x6d, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0xd6, 0x01, 0x0a, 0x42, 0x69, 0x6f, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2e, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x72, 0x2e, 0x67, 0x65, 0x74, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x76, 0x33, + 0x42, 0x1b, 0x47, 0x65, 0x74, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x44, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x69, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x2f, 0x64, 0x6e, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x72, 0x2f, 0x67, 0x65, + 0x74, 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x2f, 0x76, 0x33, 0x3b, 0x67, 0x65, 0x74, + 0x61, 0x64, 0x64, 0x72, 0x69, 0x6e, 0x66, 0x6f, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, + 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -124,13 +142,15 @@ func file_envoy_extensions_network_dns_resolver_getaddrinfo_v3_getaddrinfo_dns_r var file_envoy_extensions_network_dns_resolver_getaddrinfo_v3_getaddrinfo_dns_resolver_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_envoy_extensions_network_dns_resolver_getaddrinfo_v3_getaddrinfo_dns_resolver_proto_goTypes = []interface{}{ (*GetAddrInfoDnsResolverConfig)(nil), // 0: envoy.extensions.network.dns_resolver.getaddrinfo.v3.GetAddrInfoDnsResolverConfig + (*wrapperspb.UInt32Value)(nil), // 1: google.protobuf.UInt32Value } var file_envoy_extensions_network_dns_resolver_getaddrinfo_v3_getaddrinfo_dns_resolver_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 1, // 0: envoy.extensions.network.dns_resolver.getaddrinfo.v3.GetAddrInfoDnsResolverConfig.num_retries:type_name -> google.protobuf.UInt32Value + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/getaddrinfo/v3/getaddrinfo_dns_resolver.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/getaddrinfo/v3/getaddrinfo_dns_resolver.pb.validate.go index 9768fbf650..32c71f8528 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/getaddrinfo/v3/getaddrinfo_dns_resolver.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/getaddrinfo/v3/getaddrinfo_dns_resolver.pb.validate.go @@ -57,6 +57,35 @@ func (m *GetAddrInfoDnsResolverConfig) validate(all bool) error { var errors []error + if all { + switch v := interface{}(m.GetNumRetries()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, GetAddrInfoDnsResolverConfigValidationError{ + field: "NumRetries", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, GetAddrInfoDnsResolverConfigValidationError{ + field: "NumRetries", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetNumRetries()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return GetAddrInfoDnsResolverConfigValidationError{ + field: "NumRetries", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return GetAddrInfoDnsResolverConfigMultiError(errors) } diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/quic/server_preferred_address/v3/datasource.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/quic/server_preferred_address/v3/datasource.pb.go index be1fe14184..42884e1b70 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/quic/server_preferred_address/v3/datasource.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/quic/server_preferred_address/v3/datasource.pb.go @@ -9,7 +9,6 @@ package server_preferred_addressv3 import ( v3 "github.com/cilium/proxy/go/envoy/config/core/v3" _ "github.com/cncf/xds/go/udpa/annotations" - _ "github.com/cncf/xds/go/xds/annotations/v3" _ "github.com/envoyproxy/protoc-gen-validate/validate" proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -175,16 +174,23 @@ var file_envoy_extensions_quic_server_preferred_address_v3_datasource_proto_rawD 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x76, 0x33, 0x1a, 0x1f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x78, 0x64, 0x73, 0x2f, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xad, 0x04, 0x0a, 0x26, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0xa3, 0x04, 0x0a, 0x26, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x8e, 0x01, 0x0a, 0x0b, + 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x6d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x8e, 0x01, 0x0a, - 0x0b, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x0a, 0x69, 0x70, 0x76, 0x34, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x8e, 0x01, 0x0a, + 0x0b, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x6d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, @@ -192,44 +198,35 @@ var file_envoy_extensions_quic_server_preferred_address_v3_datasource_proto_rawD 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x0a, 0x69, 0x70, 0x76, 0x34, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x8e, 0x01, - 0x0a, 0x0b, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x6d, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, - 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x0a, 0x69, 0x70, 0x76, 0x36, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xd6, - 0x01, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x67, 0x52, 0x0a, 0x69, 0x70, 0x76, 0x36, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xd6, 0x01, + 0x0a, 0x13, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x34, 0x0a, 0x04, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x43, 0x0a, 0x0c, 0x64, 0x6e, 0x61, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, - 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x34, 0x0a, 0x04, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x43, 0x0a, 0x0c, 0x64, 0x6e, 0x61, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0b, 0x64, 0x6e, 0x61, 0x74, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x08, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, 0x02, 0x08, - 0x01, 0x42, 0xd1, 0x01, 0x0a, 0x3f, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x2e, 0x76, 0x33, 0x42, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x73, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, - 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x71, 0x75, 0x69, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, - 0x76, 0x33, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x76, 0x33, 0xba, 0x80, 0xc8, - 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0b, 0x64, 0x6e, 0x61, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0xd1, 0x01, 0x0a, 0x3f, 0x69, 0x6f, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x76, 0x33, 0x42, 0x0f, 0x44, 0x61, 0x74, 0x61, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x73, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x71, 0x75, 0x69, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x2f, 0x76, 0x33, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/quic/server_preferred_address/v3/fixed_server_preferred_address_config.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/quic/server_preferred_address/v3/fixed_server_preferred_address_config.pb.go index 6f60e67cf6..78e480b6f9 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/quic/server_preferred_address/v3/fixed_server_preferred_address_config.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/quic/server_preferred_address/v3/fixed_server_preferred_address_config.pb.go @@ -9,7 +9,6 @@ package server_preferred_addressv3 import ( v3 "github.com/cilium/proxy/go/envoy/config/core/v3" _ "github.com/cncf/xds/go/udpa/annotations" - _ "github.com/cncf/xds/go/xds/annotations/v3" proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -193,27 +192,14 @@ var file_envoy_extensions_quic_server_preferred_address_v3_fixed_server_preferre 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x76, 0x33, 0x1a, 0x22, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x78, 0x64, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xaa, 0x04, 0x0a, 0x21, 0x46, 0x69, 0x78, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, - 0x69, 0x70, 0x76, 0x34, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x69, 0x70, 0x76, 0x34, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x89, 0x01, 0x0a, 0x0b, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x68, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa0, 0x04, 0x0a, 0x21, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x0a, 0x69, 0x70, 0x76, 0x34, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x69, - 0x70, 0x76, 0x36, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x69, 0x70, 0x76, 0x36, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x89, - 0x01, 0x0a, 0x0b, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x69, + 0x70, 0x76, 0x34, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x69, 0x70, 0x76, 0x34, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x89, + 0x01, 0x0a, 0x0b, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x68, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, @@ -221,33 +207,43 @@ var file_envoy_extensions_quic_server_preferred_address_v3_fixed_server_preferre 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, - 0x69, 0x70, 0x76, 0x36, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x9c, 0x01, 0x0a, 0x13, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x3d, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x46, 0x0a, 0x0c, 0x64, 0x6e, 0x61, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x64, 0x6e, - 0x61, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x08, 0xd2, 0xc6, 0xa4, 0xe1, 0x06, - 0x02, 0x08, 0x01, 0x42, 0xe8, 0x01, 0x0a, 0x3f, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x69, 0x70, 0x76, 0x34, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x70, + 0x76, 0x36, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x69, 0x70, 0x76, 0x36, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x89, 0x01, + 0x0a, 0x0b, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x68, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x69, 0x63, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x2e, 0x76, 0x33, 0x42, 0x26, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x73, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x71, 0x75, 0x69, 0x63, 0x2f, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x76, 0x33, 0x3b, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x65, 0x73, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x46, 0x69, 0x78, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0a, 0x69, + 0x70, 0x76, 0x36, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x9c, 0x01, 0x0a, 0x13, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x3d, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x46, 0x0a, 0x0c, 0x64, 0x6e, 0x61, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x64, 0x6e, 0x61, + 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0xe8, 0x01, 0x0a, 0x3f, 0x69, 0x6f, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x71, 0x75, 0x69, 0x63, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x76, 0x33, 0x42, 0x26, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x65, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x73, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, + 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, + 0x71, 0x75, 0x69, 0x63, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2f, 0x76, 0x33, + 0x3b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, + 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.go new file mode 100644 index 0000000000..551da8df97 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.go @@ -0,0 +1,161 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.proto + +package cpu_utilizationv3 + +import ( + _ "github.com/cncf/xds/go/udpa/annotations" + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// The CPU utilization resource monitor reports the Envoy process the CPU Utilization of the entire host. +// Today, this only works on Linux and is calculated using the stats in the /proc/stat file. +type CpuUtilizationConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *CpuUtilizationConfig) Reset() { + *x = CpuUtilizationConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CpuUtilizationConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CpuUtilizationConfig) ProtoMessage() {} + +func (x *CpuUtilizationConfig) ProtoReflect() protoreflect.Message { + mi := &file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CpuUtilizationConfig.ProtoReflect.Descriptor instead. +func (*CpuUtilizationConfig) Descriptor() ([]byte, []int) { + return file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDescGZIP(), []int{0} +} + +var File_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto protoreflect.FileDescriptor + +var file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDesc = []byte{ + 0x0a, 0x4b, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x33, 0x2f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x35, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x73, 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x33, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x16, 0x0a, 0x14, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0xd4, 0x01, 0x0a, 0x43, + 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x73, + 0x2e, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x33, 0x42, 0x13, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x6e, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x33, 0x3b, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, + 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDescOnce sync.Once + file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDescData = file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDesc +) + +func file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDescGZIP() []byte { + file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDescOnce.Do(func() { + file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDescData) + }) + return file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDescData +} + +var file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_goTypes = []interface{}{ + (*CpuUtilizationConfig)(nil), // 0: envoy.extensions.resource_monitors.cpu_utilization.v3.CpuUtilizationConfig +} +var file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_init() } +func file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_init() { + if File_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CpuUtilizationConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_goTypes, + DependencyIndexes: file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_depIdxs, + MessageInfos: file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_msgTypes, + }.Build() + File_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto = out.File + file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_rawDesc = nil + file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_goTypes = nil + file_envoy_extensions_resource_monitors_cpu_utilization_v3_cpu_utilization_proto_depIdxs = nil +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.validate.go new file mode 100644 index 0000000000..0878117008 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.pb.validate.go @@ -0,0 +1,138 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/extensions/resource_monitors/cpu_utilization/v3/cpu_utilization.proto + +package cpu_utilizationv3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on CpuUtilizationConfig with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *CpuUtilizationConfig) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on CpuUtilizationConfig with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// CpuUtilizationConfigMultiError, or nil if none found. +func (m *CpuUtilizationConfig) ValidateAll() error { + return m.validate(true) +} + +func (m *CpuUtilizationConfig) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return CpuUtilizationConfigMultiError(errors) + } + + return nil +} + +// CpuUtilizationConfigMultiError is an error wrapping multiple validation +// errors returned by CpuUtilizationConfig.ValidateAll() if the designated +// constraints aren't met. +type CpuUtilizationConfigMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m CpuUtilizationConfigMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m CpuUtilizationConfigMultiError) AllErrors() []error { return m } + +// CpuUtilizationConfigValidationError is the validation error returned by +// CpuUtilizationConfig.Validate if the designated constraints aren't met. +type CpuUtilizationConfigValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e CpuUtilizationConfigValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e CpuUtilizationConfigValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e CpuUtilizationConfigValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e CpuUtilizationConfigValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e CpuUtilizationConfigValidationError) ErrorName() string { + return "CpuUtilizationConfigValidationError" +} + +// Error satisfies the builtin error interface +func (e CpuUtilizationConfigValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sCpuUtilizationConfig.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = CpuUtilizationConfigValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = CpuUtilizationConfigValidationError{} diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.go index 487e2e8158..0622f12e56 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.go @@ -9,7 +9,6 @@ package http_11_proxyv3 import ( v3 "github.com/cilium/proxy/go/envoy/config/core/v3" _ "github.com/cncf/xds/go/udpa/annotations" - _ "github.com/envoyproxy/protoc-gen-validate/validate" proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -28,26 +27,28 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 -// Configuration for HTTP/1.1 proxy transport sockets. -// This is intended for use in Envoy Mobile, though may eventually be extended -// for upstream Envoy use. -// If this transport socket is configured, and an intermediate filter adds the -// stream info necessary for proxying to the stream info (as the test filter -// does :repo:`here `) then +// HTTP/1.1 proxy transport socket establishes an upstream connection to a proxy address +// instead of the target host's address. This behavior is triggered when the transport +// socket is configured and proxy information is provided. // -// - Upstream connections will be directed to the specified proxy address rather -// than the host's address -// - Upstream TLS connections will have a raw HTTP/1.1 CONNECT header prefaced -// to the payload, and 200 response stripped (if less than 200 bytes) -// - Plaintext HTTP/1.1 connections will be sent with a fully qualified URL. +// Behavior when proxying: +// ======================= +// When an upstream connection is established, instead of connecting directly to the endpoint +// address, the client will connect to the specified proxy address, send an HTTP/1.1 “CONNECT“ request +// indicating the endpoint address, and process the response. If the response has HTTP status 200, +// the connection will be passed down to the underlying transport socket. // -// This transport socket is not compatible with HTTP/3, plaintext HTTP/2, or raw TCP. +// Configuring proxy information: +// ============================== +// Set “typed_filter_metadata“ in :ref:`LbEndpoint.Metadata ` or :ref:`LocalityLbEndpoints.Metadata `. +// using the key “envoy.http11_proxy_transport_socket.proxy_address“ and the +// proxy address in “config::core::v3::Address“ format. type Http11ProxyUpstreamTransport struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The underlying transport socket being wrapped. + // The underlying transport socket being wrapped. Defaults to plaintext (raw_buffer) if unset. TransportSocket *v3.TransportSocket `protobuf:"bytes,1,opt,name=transport_socket,json=transportSocket,proto3" json:"transport_socket,omitempty"` } @@ -105,30 +106,28 @@ var file_envoy_extensions_transport_sockets_http_11_proxy_v3_upstream_http_11_co 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x7a, 0x0a, 0x1c, 0x48, 0x74, 0x74, 0x70, 0x31, 0x31, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x5a, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, - 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, - 0x6b, 0x65, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x42, 0xd5, - 0x01, 0x0a, 0x41, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x31, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x2e, 0x76, 0x33, 0x42, 0x1a, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, - 0x74, 0x70, 0x31, 0x31, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x6a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x68, 0x74, - 0x74, 0x70, 0x5f, 0x31, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, 0x3b, 0x68, - 0x74, 0x74, 0x70, 0x5f, 0x31, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x76, 0x33, 0xba, 0x80, - 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x70, 0x0a, 0x1c, 0x48, 0x74, 0x74, + 0x70, 0x31, 0x31, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x50, 0x0a, 0x10, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x42, 0xd5, 0x01, 0x0a, 0x41, + 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x2e, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x31, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x76, + 0x33, 0x42, 0x1a, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, 0x74, 0x70, 0x31, + 0x31, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x6a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, + 0x31, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x76, 0x33, 0x3b, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x31, 0x31, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, + 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.validate.go index 043cef2baf..80352cffdd 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.pb.validate.go @@ -57,17 +57,6 @@ func (m *Http11ProxyUpstreamTransport) validate(all bool) error { var errors []error - if m.GetTransportSocket() == nil { - err := Http11ProxyUpstreamTransportValidationError{ - field: "TransportSocket", - reason: "value is required", - } - if !all { - return err - } - errors = append(errors, err) - } - if all { switch v := interface{}(m.GetTransportSocket()).(type) { case interface{ ValidateAll() error }: diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/common.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/common.pb.go index 187788df05..e6ab4f570c 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/common.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/common.pb.go @@ -710,7 +710,7 @@ type CertificateProviderPluginInstance struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Provider instance name. If not present, defaults to "default". + // Provider instance name. // // Instance names should generally be defined not in terms of the underlying provider // implementation (e.g., "file_watcher") but rather in terms of the function of the @@ -1350,153 +1350,153 @@ var file_envoy_extensions_transport_sockets_tls_v3_common_proto_rawDesc = []byte 0xb7, 0x8b, 0xa4, 0x02, 0x01, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x3a, 0x2d, 0x9a, 0xc5, 0x88, 0x1e, 0x28, 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x54, 0x6c, 0x73, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x73, 0x0a, 0x21, 0x43, 0x65, + 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x7c, 0x0a, 0x21, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0xc6, 0x02, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x08, 0x73, 0x61, 0x6e, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x48, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, - 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, - 0x6c, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x53, 0x61, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, 0x20, - 0x00, 0x52, 0x07, 0x73, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x48, 0x0a, 0x07, 0x6d, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, - 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6f, 0x69, 0x64, 0x22, 0x60, 0x0a, 0x07, 0x53, 0x61, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x41, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, - 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x4e, 0x53, 0x10, 0x02, 0x12, - 0x07, 0x0a, 0x03, 0x55, 0x52, 0x49, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x50, 0x5f, 0x41, - 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x54, 0x48, 0x45, - 0x52, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x05, 0x22, 0xa9, 0x0d, 0x0a, 0x1c, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x57, 0x0a, 0x0a, 0x74, 0x72, 0x75, - 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, - 0x16, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x10, 0x12, 0x0e, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, - 0x43, 0x61, 0x12, 0xad, 0x01, 0x0a, 0x20, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, - 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x16, 0xf2, 0x98, 0xfe, - 0x8f, 0x05, 0x10, 0x12, 0x0e, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x52, 0x1d, 0x63, 0x61, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x11, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x6f, - 0x6f, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, + 0x2c, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, + 0x10, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc6, 0x02, 0x0a, 0x15, 0x53, 0x75, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x08, 0x73, 0x61, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x48, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, + 0x2e, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x53, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0a, + 0xfa, 0x42, 0x07, 0x82, 0x01, 0x04, 0x10, 0x01, 0x20, 0x00, 0x52, 0x07, 0x73, 0x61, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x48, 0x0a, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x10, 0x0a, + 0x03, 0x6f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6f, 0x69, 0x64, 0x22, + 0x60, 0x0a, 0x07, 0x53, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x41, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x01, 0x12, + 0x07, 0x0a, 0x03, 0x44, 0x4e, 0x53, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x52, 0x49, 0x10, + 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x50, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, + 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, + 0x05, 0x22, 0xa9, 0x0d, 0x0a, 0x1c, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x57, 0x0a, 0x0a, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x16, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x10, + 0x12, 0x0e, 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x09, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x61, 0x12, 0xad, 0x01, 0x0a, 0x20, + 0x63, 0x61, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, + 0x76, 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x42, 0x16, 0xf2, 0x98, 0xfe, 0x8f, 0x05, 0x10, 0x12, 0x0e, 0x63, 0x61, + 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x1d, 0x63, 0x61, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x11, + 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, + 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, + 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, + 0x52, 0x0f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, + 0x73, 0x12, 0x53, 0x0a, 0x11, 0x77, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x10, 0x77, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x46, 0x0a, 0x17, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x6b, + 0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0x92, 0x01, 0x08, 0x22, + 0x06, 0x72, 0x04, 0x10, 0x2c, 0x28, 0x2c, 0x52, 0x15, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6b, 0x69, 0x12, 0x46, + 0x0a, 0x17, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, + 0x0e, 0xfa, 0x42, 0x0b, 0x92, 0x01, 0x08, 0x22, 0x06, 0x72, 0x04, 0x10, 0x40, 0x28, 0x5f, 0x52, + 0x15, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x82, 0x01, 0x0a, 0x1d, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, + 0x6c, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x6f, - 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x52, 0x0f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, - 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x11, 0x77, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x64, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x10, 0x77, 0x61, 0x74, - 0x63, 0x68, 0x65, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x46, 0x0a, - 0x17, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x6b, 0x69, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0e, - 0xfa, 0x42, 0x0b, 0x92, 0x01, 0x08, 0x22, 0x06, 0x72, 0x04, 0x10, 0x2c, 0x28, 0x2c, 0x52, 0x15, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x53, 0x70, 0x6b, 0x69, 0x12, 0x46, 0x0a, 0x17, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, - 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0e, 0xfa, 0x42, 0x0b, 0x92, 0x01, 0x08, 0x22, 0x06, - 0x72, 0x04, 0x10, 0x40, 0x28, 0x5f, 0x52, 0x15, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x82, 0x01, - 0x0a, 0x1d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x73, 0x75, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x6c, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x75, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, + 0x52, 0x19, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x68, 0x0a, 0x17, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x6c, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, + 0x14, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x6b, 0x0a, 0x24, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x21, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x32, 0x0a, 0x03, 0x63, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x03, 0x63, 0x72, 0x6c, 0x12, 0x3a, 0x0a, 0x19, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x12, 0xa2, 0x01, 0x0a, 0x18, 0x74, 0x72, 0x75, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5e, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, - 0x33, 0x2e, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x19, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, - 0x70, 0x65, 0x64, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x68, 0x0a, 0x17, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x75, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x61, 0x6c, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, - 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x14, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x53, 0x75, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x41, 0x6c, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x6b, 0x0a, 0x24, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x63, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, - 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x21, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x53, - 0x69, 0x67, 0x6e, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x32, 0x0a, 0x03, 0x63, 0x72, 0x6c, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x03, 0x63, 0x72, 0x6c, 0x12, 0x3a, 0x0a, - 0x19, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x63, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0xa2, 0x01, 0x0a, 0x18, 0x74, 0x72, - 0x75, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x5e, 0x2e, 0x65, - 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x16, 0x74, 0x72, 0x75, 0x73, 0x74, 0x43, 0x68, 0x61, - 0x69, 0x6e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, - 0x0a, 0x17, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x15, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x38, 0x0a, 0x19, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x72, 0x6c, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x6f, 0x6e, 0x6c, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x4c, 0x65, 0x61, 0x66, 0x43, 0x65, 0x72, 0x74, 0x43, 0x72, 0x6c, 0x12, 0x4f, 0x0a, 0x10, - 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x18, 0x64, 0x52, 0x0e, 0x6d, - 0x61, 0x78, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x44, 0x65, 0x70, 0x74, 0x68, 0x1a, 0x11, 0x0a, - 0x0f, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, - 0x22, 0x46, 0x0a, 0x16, 0x54, 0x72, 0x75, 0x73, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x45, - 0x52, 0x49, 0x46, 0x59, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x49, 0x4e, - 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x54, - 0x52, 0x55, 0x53, 0x54, 0x45, 0x44, 0x10, 0x01, 0x3a, 0x35, 0x9a, 0xc5, 0x88, 0x1e, 0x30, 0x0a, - 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x61, 0x75, - 0x74, 0x68, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, - 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x52, 0x17, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x5f, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x6c, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x42, 0xa8, 0x01, 0x0a, 0x37, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, - 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x56, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x76, - 0x33, 0x3b, 0x74, 0x6c, 0x73, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, + 0x16, 0x74, 0x72, 0x75, 0x73, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x17, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, + 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x15, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x38, 0x0a, 0x19, 0x6f, + 0x6e, 0x6c, 0x79, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, + 0x6f, 0x6e, 0x6c, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x4c, 0x65, 0x61, 0x66, 0x43, 0x65, + 0x72, 0x74, 0x43, 0x72, 0x6c, 0x12, 0x4f, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x5f, 0x64, 0x65, 0x70, 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x2a, 0x02, 0x18, 0x64, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x44, 0x65, 0x70, 0x74, 0x68, 0x1a, 0x11, 0x0a, 0x0f, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x65, 0x72, 0x74, 0x73, 0x22, 0x46, 0x0a, 0x16, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x5f, 0x54, 0x52, + 0x55, 0x53, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x41, + 0x43, 0x43, 0x45, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x54, 0x52, 0x55, 0x53, 0x54, 0x45, 0x44, 0x10, + 0x01, 0x3a, 0x35, 0x9a, 0xc5, 0x88, 0x1e, 0x30, 0x0a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, + 0x08, 0x05, 0x10, 0x06, 0x52, 0x17, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x73, 0x75, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x61, 0x6c, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0xa8, 0x01, + 0x0a, 0x37, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x42, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x56, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, + 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x76, 0x33, 0x3b, 0x74, 0x6c, 0x73, 0x76, 0x33, + 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/common.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/common.pb.validate.go index 229d797100..9f633f9aca 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/common.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/common.pb.validate.go @@ -825,7 +825,16 @@ func (m *CertificateProviderPluginInstance) validate(all bool) error { var errors []error - // no validation rules for InstanceName + if utf8.RuneCountInString(m.GetInstanceName()) < 1 { + err := CertificateProviderPluginInstanceValidationError{ + field: "InstanceName", + reason: "value length must be at least 1 runes", + } + if !all { + return err + } + errors = append(errors, err) + } // no validation rules for CertificateName diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/tls.pb.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/tls.pb.go index 953c802372..b8495a0f6a 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/tls.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/tls.pb.go @@ -196,7 +196,7 @@ func (x *UpstreamTlsContext) GetEnforceRsaKeyUsage() *wrapperspb.BoolValue { return nil } -// [#next-free-field: 11] +// [#next-free-field: 12] type DownstreamTlsContext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -231,6 +231,10 @@ type DownstreamTlsContext struct { // If the client provides SNI but no such cert matched, it will decide to full scan certificates or not based on this config. // Defaults to false. See more details in :ref:`Multiple TLS certificates `. FullScanCertsOnSniMismatch *wrapperspb.BoolValue `protobuf:"bytes,9,opt,name=full_scan_certs_on_sni_mismatch,json=fullScanCertsOnSniMismatch,proto3" json:"full_scan_certs_on_sni_mismatch,omitempty"` + // By default, Envoy as a server uses its preferred cipher during the handshake. + // Setting this to true would allow the downstream client's preferred cipher to be used instead. + // Has no effect when using TLSv1_3. + PreferClientCiphers bool `protobuf:"varint,11,opt,name=prefer_client_ciphers,json=preferClientCiphers,proto3" json:"prefer_client_ciphers,omitempty"` } func (x *DownstreamTlsContext) Reset() { @@ -342,6 +346,13 @@ func (x *DownstreamTlsContext) GetFullScanCertsOnSniMismatch() *wrapperspb.BoolV return nil } +func (x *DownstreamTlsContext) GetPreferClientCiphers() bool { + if x != nil { + return x.PreferClientCiphers + } + return false +} + type isDownstreamTlsContext_SessionTicketKeysType interface { isDownstreamTlsContext_SessionTicketKeysType() } @@ -447,7 +458,7 @@ func (x *TlsKeyLog) GetRemoteAddressRange() []*v3.CidrRange { } // TLS context shared by both client and server TLS contexts. -// [#next-free-field: 16] +// [#next-free-field: 17] type CommonTlsContext struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -477,6 +488,12 @@ type CommonTlsContext struct { // are ignored. // [#not-implemented-hide:] TlsCertificateProviderInstance *CertificateProviderPluginInstance `protobuf:"bytes,14,opt,name=tls_certificate_provider_instance,json=tlsCertificateProviderInstance,proto3" json:"tls_certificate_provider_instance,omitempty"` + // Custom TLS certificate selector. + // + // Select TLS certificate based on TLS client hello. + // If empty, defaults to native TLS certificate selection behavior: + // DNS SANs or Subject Common Name in TLS certificates is extracted as server name pattern to match SNI. + CustomTlsCertificateSelector *v3.TypedExtensionConfig `protobuf:"bytes,16,opt,name=custom_tls_certificate_selector,json=customTlsCertificateSelector,proto3" json:"custom_tls_certificate_selector,omitempty"` // Certificate provider for fetching TLS certificates. // [#not-implemented-hide:] // @@ -573,6 +590,13 @@ func (x *CommonTlsContext) GetTlsCertificateProviderInstance() *CertificateProvi return nil } +func (x *CommonTlsContext) GetCustomTlsCertificateSelector() *v3.TypedExtensionConfig { + if x != nil { + return x.CustomTlsCertificateSelector + } + return nil +} + // Deprecated: Do not use. func (x *CommonTlsContext) GetTlsCertificateCertificateProvider() *CommonTlsContext_CertificateProvider { if x != nil { @@ -1019,7 +1043,7 @@ var file_envoy_extensions_transport_sockets_tls_v3_tls_proto_rawDesc = []byte{ 0x66, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x73, 0x61, 0x4b, 0x65, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x2b, 0x9a, 0xc5, 0x88, 0x1e, 0x26, 0x0a, 0x24, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x9a, 0x09, + 0x65, 0x61, 0x6d, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0xce, 0x09, 0x0a, 0x14, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x69, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, @@ -1083,232 +1107,242 @@ var file_envoy_extensions_transport_sockets_tls_v3_tls_proto_rawDesc = []byte{ 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x66, 0x75, 0x6c, 0x6c, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x65, 0x72, - 0x74, 0x73, 0x4f, 0x6e, 0x53, 0x6e, 0x69, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x22, - 0x4e, 0x0a, 0x10, 0x4f, 0x63, 0x73, 0x70, 0x53, 0x74, 0x61, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x45, 0x4e, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x53, - 0x54, 0x41, 0x50, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x52, - 0x49, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x50, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, - 0x0a, 0x0b, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x50, 0x4c, 0x45, 0x10, 0x02, 0x3a, - 0x2d, 0x9a, 0xc5, 0x88, 0x1e, 0x28, 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x42, 0x1a, - 0x0a, 0x18, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xcc, 0x01, 0x0a, 0x09, 0x54, - 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x67, 0x12, 0x1b, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x4f, 0x0a, 0x13, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x69, 0x64, 0x72, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x14, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x69, 0x64, 0x72, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x12, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xea, 0x17, 0x0a, 0x10, 0x43, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x57, - 0x0a, 0x0a, 0x74, 0x6c, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, - 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x54, - 0x6c, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x09, 0x74, 0x6c, - 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x64, 0x0a, 0x10, 0x74, 0x6c, 0x73, 0x5f, 0x63, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x6c, - 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x52, 0x0f, 0x74, 0x6c, - 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x12, 0x86, 0x01, - 0x0a, 0x22, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x5f, 0x73, 0x64, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, - 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x1e, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, - 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x52, 0x1e, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0xad, 0x01, 0x0a, 0x24, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x4f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x74, 0x73, 0x4f, 0x6e, 0x53, 0x6e, 0x69, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, + 0x32, 0x0a, 0x15, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x69, 0x70, 0x68, + 0x65, 0x72, 0x73, 0x22, 0x4e, 0x0a, 0x10, 0x4f, 0x63, 0x73, 0x70, 0x53, 0x74, 0x61, 0x70, 0x6c, + 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x45, 0x4e, 0x49, 0x45, + 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x50, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x13, 0x0a, + 0x0f, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x50, 0x4c, 0x49, 0x4e, 0x47, + 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x50, 0x4c, + 0x45, 0x10, 0x02, 0x3a, 0x2d, 0x9a, 0xc5, 0x88, 0x1e, 0x28, 0x0a, 0x26, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x44, 0x6f, + 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x42, 0x1a, 0x0a, 0x18, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, + 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xcc, + 0x01, 0x0a, 0x09, 0x54, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x67, 0x12, 0x1b, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x4f, 0x0a, 0x13, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x69, + 0x64, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x11, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x51, 0x0a, 0x14, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, + 0x43, 0x69, 0x64, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x12, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xdd, 0x18, + 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x57, 0x0a, 0x0a, 0x74, 0x6c, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, + 0x76, 0x33, 0x2e, 0x54, 0x6c, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x52, 0x09, 0x74, 0x6c, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x64, 0x0a, 0x10, 0x74, + 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, + 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, + 0x33, 0x2e, 0x54, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x52, 0x0f, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x12, 0x86, 0x01, 0x0a, 0x22, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x64, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x64, 0x73, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x1e, 0x74, 0x6c, 0x73, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x97, 0x01, 0x0a, 0x21, 0x74, + 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4c, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, + 0x76, 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x52, 0x1e, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x71, 0x0a, 0x1f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x74, + 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x1c, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x54, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0xad, 0x01, 0x0a, 0x24, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, + 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, + 0x03, 0x33, 0x2e, 0x30, 0x52, 0x21, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0xc6, 0x01, 0x0a, 0x2d, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x57, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x21, 0x74, - 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x12, 0xc6, 0x01, 0x0a, 0x2d, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, + 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x29, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x12, 0x78, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x65, + 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x8c, 0x01, 0x0a, 0x24, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x5f, 0x73, 0x64, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, + 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xa2, 0x01, 0x0a, 0x1b, 0x63, 0x6f, + 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x60, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x62, 0x69, 0x6e, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x48, 0x00, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0xb5, + 0x01, 0x0a, 0x27, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x4f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x48, 0x00, + 0x52, 0x24, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0xce, 0x01, 0x0a, 0x30, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x57, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, + 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x48, 0x00, 0x52, 0x2c, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x70, 0x6e, 0x5f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x61, 0x6c, 0x70, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x57, + 0x0a, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, + 0x6b, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, + 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x61, 0x6e, + 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6c, + 0x6f, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, - 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x29, - 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x78, 0x0a, 0x12, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, - 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, - 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x48, 0x00, - 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x12, 0x8c, 0x01, 0x0a, 0x24, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x64, 0x73, 0x5f, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, - 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x53, - 0x64, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, - 0x52, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0xa2, 0x01, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x5f, + 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x67, 0x52, 0x06, + 0x6b, 0x65, 0x79, 0x4c, 0x6f, 0x67, 0x1a, 0x92, 0x01, 0x0a, 0x13, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1b, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x0c, 0x74, + 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, + 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0d, 0x0a, 0x06, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x1a, 0x6d, 0x0a, 0x1b, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x29, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0xa4, 0x06, 0x0a, 0x24, 0x43, + 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x12, 0x8f, 0x01, 0x0a, 0x1a, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x60, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, - 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x48, 0x00, 0x52, 0x19, 0x63, 0x6f, - 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0xb5, 0x01, 0x0a, 0x27, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, - 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, - 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x48, 0x00, 0x52, 0x24, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, - 0xce, 0x01, 0x0a, 0x30, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, - 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, - 0x48, 0x00, 0x52, 0x2c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x70, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x70, 0x6e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x12, 0x57, 0x0a, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x72, - 0x12, 0x4d, 0x0a, 0x07, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x34, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x54, 0x6c, - 0x73, 0x4b, 0x65, 0x79, 0x4c, 0x6f, 0x67, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x4c, 0x6f, 0x67, 0x1a, - 0x92, 0x01, 0x0a, 0x13, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4f, 0x0a, 0x0c, 0x74, 0x79, 0x70, 0x65, 0x64, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, - 0x33, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x64, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x79, 0x70, 0x65, 0x64, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0d, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x03, 0xf8, 0x42, 0x01, 0x1a, 0x6d, 0x0a, 0x1b, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x1a, 0xa4, 0x06, 0x0a, 0x24, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, - 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x8f, 0x01, 0x0a, - 0x1a, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x47, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x18, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x94, - 0x01, 0x0a, 0x24, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x64, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x18, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x94, 0x01, 0x0a, 0x24, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x64, 0x73, + 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, + 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, + 0x2e, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x20, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x53, 0x64, 0x73, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xb3, 0x01, 0x0a, + 0x27, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4f, + 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, 0x72, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, + 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x24, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, + 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0xcc, 0x01, 0x0a, 0x30, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, - 0x02, 0x10, 0x01, 0x52, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x53, 0x64, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0xb3, 0x01, 0x0a, 0x27, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, - 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, - 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x24, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0xcc, 0x01, 0x0a, 0x30, + 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, + 0x33, 0x2e, 0x30, 0x52, 0x2c, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x3a, 0x4e, 0x9a, 0xc5, 0x88, 0x1e, 0x49, 0x0a, 0x47, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x62, 0x69, 0x6e, 0x65, 0x64, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x3a, 0x29, 0x9a, 0xc5, 0x88, 0x1e, 0x24, 0x0a, 0x22, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x57, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, - 0x76, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x42, - 0x0b, 0x18, 0x01, 0x92, 0xc7, 0x86, 0xd8, 0x04, 0x03, 0x33, 0x2e, 0x30, 0x52, 0x2c, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x3a, 0x4e, 0x9a, 0xc5, 0x88, 0x1e, - 0x49, 0x0a, 0x47, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x61, 0x75, 0x74, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x65, 0x64, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x3a, 0x29, 0x9a, 0xc5, 0x88, 0x1e, - 0x24, 0x0a, 0x22, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x61, 0x75, 0x74, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x54, 0x6c, 0x73, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x42, 0x19, 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x42, 0xa5, 0x01, 0x0a, 0x37, 0x69, 0x6f, 0x2e, 0x65, 0x6e, - 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, - 0x76, 0x33, 0x42, 0x08, 0x54, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x56, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, - 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x76, 0x33, - 0x3b, 0x74, 0x6c, 0x73, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x78, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x42, 0xa5, 0x01, + 0x0a, 0x37, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, + 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x2e, 0x74, 0x6c, 0x73, 0x2e, 0x76, 0x33, 0x42, 0x08, 0x54, 0x6c, 0x73, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x56, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x67, 0x6f, 0x2d, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x73, + 0x2f, 0x74, 0x6c, 0x73, 0x2f, 0x76, 0x33, 0x3b, 0x74, 0x6c, 0x73, 0x76, 0x33, 0xba, 0x80, 0xc8, + 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1343,8 +1377,8 @@ var file_envoy_extensions_transport_sockets_tls_v3_tls_proto_goTypes = []interfa (*TlsParameters)(nil), // 14: envoy.extensions.transport_sockets.tls.v3.TlsParameters (*TlsCertificate)(nil), // 15: envoy.extensions.transport_sockets.tls.v3.TlsCertificate (*CertificateProviderPluginInstance)(nil), // 16: envoy.extensions.transport_sockets.tls.v3.CertificateProviderPluginInstance - (*CertificateValidationContext)(nil), // 17: envoy.extensions.transport_sockets.tls.v3.CertificateValidationContext - (*v3.TypedExtensionConfig)(nil), // 18: envoy.config.core.v3.TypedExtensionConfig + (*v3.TypedExtensionConfig)(nil), // 17: envoy.config.core.v3.TypedExtensionConfig + (*CertificateValidationContext)(nil), // 18: envoy.extensions.transport_sockets.tls.v3.CertificateValidationContext } var file_envoy_extensions_transport_sockets_tls_v3_tls_proto_depIdxs = []int32{ 4, // 0: envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext.common_tls_context:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext @@ -1364,25 +1398,26 @@ var file_envoy_extensions_transport_sockets_tls_v3_tls_proto_depIdxs = []int32{ 15, // 14: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.tls_certificates:type_name -> envoy.extensions.transport_sockets.tls.v3.TlsCertificate 11, // 15: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.tls_certificate_sds_secret_configs:type_name -> envoy.extensions.transport_sockets.tls.v3.SdsSecretConfig 16, // 16: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.tls_certificate_provider_instance:type_name -> envoy.extensions.transport_sockets.tls.v3.CertificateProviderPluginInstance - 5, // 17: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.tls_certificate_certificate_provider:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProvider - 6, // 18: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.tls_certificate_certificate_provider_instance:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProviderInstance - 17, // 19: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.validation_context:type_name -> envoy.extensions.transport_sockets.tls.v3.CertificateValidationContext - 11, // 20: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.validation_context_sds_secret_config:type_name -> envoy.extensions.transport_sockets.tls.v3.SdsSecretConfig - 7, // 21: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.combined_validation_context:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext - 5, // 22: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.validation_context_certificate_provider:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProvider - 6, // 23: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.validation_context_certificate_provider_instance:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProviderInstance - 18, // 24: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.custom_handshaker:type_name -> envoy.config.core.v3.TypedExtensionConfig - 3, // 25: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.key_log:type_name -> envoy.extensions.transport_sockets.tls.v3.TlsKeyLog - 18, // 26: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProvider.typed_config:type_name -> envoy.config.core.v3.TypedExtensionConfig - 17, // 27: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext.default_validation_context:type_name -> envoy.extensions.transport_sockets.tls.v3.CertificateValidationContext - 11, // 28: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext.validation_context_sds_secret_config:type_name -> envoy.extensions.transport_sockets.tls.v3.SdsSecretConfig - 5, // 29: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext.validation_context_certificate_provider:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProvider - 6, // 30: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext.validation_context_certificate_provider_instance:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProviderInstance - 31, // [31:31] is the sub-list for method output_type - 31, // [31:31] is the sub-list for method input_type - 31, // [31:31] is the sub-list for extension type_name - 31, // [31:31] is the sub-list for extension extendee - 0, // [0:31] is the sub-list for field type_name + 17, // 17: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.custom_tls_certificate_selector:type_name -> envoy.config.core.v3.TypedExtensionConfig + 5, // 18: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.tls_certificate_certificate_provider:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProvider + 6, // 19: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.tls_certificate_certificate_provider_instance:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProviderInstance + 18, // 20: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.validation_context:type_name -> envoy.extensions.transport_sockets.tls.v3.CertificateValidationContext + 11, // 21: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.validation_context_sds_secret_config:type_name -> envoy.extensions.transport_sockets.tls.v3.SdsSecretConfig + 7, // 22: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.combined_validation_context:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext + 5, // 23: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.validation_context_certificate_provider:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProvider + 6, // 24: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.validation_context_certificate_provider_instance:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProviderInstance + 17, // 25: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.custom_handshaker:type_name -> envoy.config.core.v3.TypedExtensionConfig + 3, // 26: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.key_log:type_name -> envoy.extensions.transport_sockets.tls.v3.TlsKeyLog + 17, // 27: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProvider.typed_config:type_name -> envoy.config.core.v3.TypedExtensionConfig + 18, // 28: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext.default_validation_context:type_name -> envoy.extensions.transport_sockets.tls.v3.CertificateValidationContext + 11, // 29: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext.validation_context_sds_secret_config:type_name -> envoy.extensions.transport_sockets.tls.v3.SdsSecretConfig + 5, // 30: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext.validation_context_certificate_provider:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProvider + 6, // 31: envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CombinedCertificateValidationContext.validation_context_certificate_provider_instance:type_name -> envoy.extensions.transport_sockets.tls.v3.CommonTlsContext.CertificateProviderInstance + 32, // [32:32] is the sub-list for method output_type + 32, // [32:32] is the sub-list for method input_type + 32, // [32:32] is the sub-list for extension type_name + 32, // [32:32] is the sub-list for extension extendee + 0, // [0:32] is the sub-list for field type_name } func init() { file_envoy_extensions_transport_sockets_tls_v3_tls_proto_init() } diff --git a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/tls.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/tls.pb.validate.go index 89b8fd11e8..df03802b19 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/tls.pb.validate.go +++ b/vendor/github.com/cilium/proxy/go/envoy/extensions/transport_sockets/tls/v3/tls.pb.validate.go @@ -419,6 +419,8 @@ func (m *DownstreamTlsContext) validate(all bool) error { } } + // no validation rules for PreferClientCiphers + switch v := m.SessionTicketKeysType.(type) { case *DownstreamTlsContext_SessionTicketKeys: if v == nil { @@ -924,6 +926,35 @@ func (m *CommonTlsContext) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetCustomTlsCertificateSelector()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CommonTlsContextValidationError{ + field: "CustomTlsCertificateSelector", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CommonTlsContextValidationError{ + field: "CustomTlsCertificateSelector", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetCustomTlsCertificateSelector()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CommonTlsContextValidationError{ + field: "CustomTlsCertificateSelector", + reason: "embedded message failed validation", + cause: err, + } + } + } + if all { switch v := interface{}(m.GetTlsCertificateCertificateProvider()).(type) { case interface{ ValidateAll() error }: diff --git a/vendor/github.com/cilium/proxy/go/envoy/service/ext_proc/v3/external_processor.pb.go b/vendor/github.com/cilium/proxy/go/envoy/service/ext_proc/v3/external_processor.pb.go index cab6c80632..05a554823d 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/service/ext_proc/v3/external_processor.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/service/ext_proc/v3/external_processor.pb.go @@ -332,7 +332,10 @@ type ProcessingResponse struct { // It is also ignored by Envoy when the ext_proc filter config // :ref:`allow_mode_override // ` - // is set to false. + // is set to false, or + // :ref:`send_body_without_waiting_for_header_response + // ` + // is set to true. ModeOverride *v31.ProcessingMode `protobuf:"bytes,9,opt,name=mode_override,json=modeOverride,proto3" json:"mode_override,omitempty"` // When ext_proc server receives a request message, in case it needs more // time to process the message, it sends back a ProcessingResponse message @@ -533,12 +536,8 @@ type HttpHeaders struct { // The HTTP request headers. All header keys will be // lower-cased, because HTTP header keys are case-insensitive. - // The “headers“ encoding is based on the runtime guard - // envoy_reloadable_features_send_header_raw_value setting. - // When it is true, the header value is encoded in the + // The header value is encoded in the // :ref:`raw_value ` field. - // When it is false, the header value is encoded in the - // :ref:`value ` field. Headers *v3.HeaderMap `protobuf:"bytes,1,opt,name=headers,proto3" json:"headers,omitempty"` // [#not-implemented-hide:] // This field is deprecated and not implemented. Attributes will be sent in @@ -668,12 +667,8 @@ type HttpTrailers struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The “trailers“ encoding is based on the runtime guard - // envoy_reloadable_features_send_header_raw_value setting. - // When it is true, the header value is encoded in the + // The header value is encoded in the // :ref:`raw_value ` field. - // When it is false, the header value is encoded in the - // :ref:`value ` field. Trailers *v3.HeaderMap `protobuf:"bytes,1,opt,name=trailers,proto3" json:"trailers,omitempty"` } @@ -887,12 +882,8 @@ type CommonResponse struct { // Add new trailers to the message. This may be used when responding to either a // HttpHeaders or HttpBody message, but only if this message is returned // along with the CONTINUE_AND_REPLACE status. - // The “trailers“ encoding is based on the runtime guard - // envoy_reloadable_features_send_header_raw_value setting. - // When it is true, the header value is encoded in the + // The header value is encoded in the // :ref:`raw_value ` field. - // When it is false, the header value is encoded in the - // :ref:`value ` field. Trailers *v3.HeaderMap `protobuf:"bytes,4,opt,name=trailers,proto3" json:"trailers,omitempty"` // Clear the route cache for the current client request. This is necessary // if the remote server modified headers that are used to calculate the route. @@ -1121,12 +1112,8 @@ type HeaderMutation struct { // Add or replace HTTP headers. Attempts to set the value of // any “x-envoy“ header, and attempts to set the “:method“, // “:authority“, “:scheme“, or “host“ headers will be ignored. - // The “set_headers“ encoding is based on the runtime guard - // envoy_reloadable_features_send_header_raw_value setting. - // When it is true, the header value is encoded in the + // The header value is encoded in the // :ref:`raw_value ` field. - // When it is false, the header value is encoded in the - // :ref:`value ` field. SetHeaders []*v3.HeaderValueOption `protobuf:"bytes,1,rep,name=set_headers,json=setHeaders,proto3" json:"set_headers,omitempty"` // Remove these HTTP headers. Attempts to remove system headers -- // any header starting with “:“, plus “host“ -- will be ignored. diff --git a/vendor/github.com/cilium/proxy/go/envoy/service/ratelimit/v3/rls.pb.go b/vendor/github.com/cilium/proxy/go/envoy/service/ratelimit/v3/rls.pb.go index ff5ad9dbe7..86353c3a71 100644 --- a/vendor/github.com/cilium/proxy/go/envoy/service/ratelimit/v3/rls.pb.go +++ b/vendor/github.com/cilium/proxy/go/envoy/service/ratelimit/v3/rls.pb.go @@ -179,6 +179,8 @@ type RateLimitRequest struct { Descriptors []*v3.RateLimitDescriptor `protobuf:"bytes,2,rep,name=descriptors,proto3" json:"descriptors,omitempty"` // Rate limit requests can optionally specify the number of hits a request adds to the matched // limit. If the value is not set in the message, a request increases the matched limit by 1. + // This value can be overridden by setting filter state value “envoy.ratelimit.hits_addend“ + // to the desired number. Invalid number (< 0) or number will be ignored. HitsAddend uint32 `protobuf:"varint,3,opt,name=hits_addend,json=hitsAddend,proto3" json:"hits_addend,omitempty"` } diff --git a/vendor/github.com/cilium/proxy/go/envoy/service/redis_auth/v3/redis_external_auth.pb.go b/vendor/github.com/cilium/proxy/go/envoy/service/redis_auth/v3/redis_external_auth.pb.go new file mode 100644 index 0000000000..6f777549c3 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/service/redis_auth/v3/redis_external_auth.pb.go @@ -0,0 +1,377 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v5.26.1 +// source: envoy/service/redis_auth/v3/redis_external_auth.proto + +package redis_authv3 + +import ( + context "context" + _ "github.com/cncf/xds/go/udpa/annotations" + proto "github.com/golang/protobuf/proto" + status "google.golang.org/genproto/googleapis/rpc/status" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status1 "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type RedisProxyExternalAuthRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Username, if applicable. Otherwise, empty. + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + // Password sent with the AUTH command. + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` +} + +func (x *RedisProxyExternalAuthRequest) Reset() { + *x = RedisProxyExternalAuthRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_service_redis_auth_v3_redis_external_auth_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RedisProxyExternalAuthRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RedisProxyExternalAuthRequest) ProtoMessage() {} + +func (x *RedisProxyExternalAuthRequest) ProtoReflect() protoreflect.Message { + mi := &file_envoy_service_redis_auth_v3_redis_external_auth_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RedisProxyExternalAuthRequest.ProtoReflect.Descriptor instead. +func (*RedisProxyExternalAuthRequest) Descriptor() ([]byte, []int) { + return file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDescGZIP(), []int{0} +} + +func (x *RedisProxyExternalAuthRequest) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *RedisProxyExternalAuthRequest) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +type RedisProxyExternalAuthResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Status of the authentication check. + Status *status.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + // Optional expiration time for the authentication. + // If set, the authentication will be valid until this time. + // If not set, the authentication will be valid indefinitely. + Expiration *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=expiration,proto3" json:"expiration,omitempty"` + // Optional message to be sent back to the client. + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *RedisProxyExternalAuthResponse) Reset() { + *x = RedisProxyExternalAuthResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_envoy_service_redis_auth_v3_redis_external_auth_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RedisProxyExternalAuthResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RedisProxyExternalAuthResponse) ProtoMessage() {} + +func (x *RedisProxyExternalAuthResponse) ProtoReflect() protoreflect.Message { + mi := &file_envoy_service_redis_auth_v3_redis_external_auth_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RedisProxyExternalAuthResponse.ProtoReflect.Descriptor instead. +func (*RedisProxyExternalAuthResponse) Descriptor() ([]byte, []int) { + return file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDescGZIP(), []int{1} +} + +func (x *RedisProxyExternalAuthResponse) GetStatus() *status.Status { + if x != nil { + return x.Status + } + return nil +} + +func (x *RedisProxyExternalAuthResponse) GetExpiration() *timestamppb.Timestamp { + if x != nil { + return x.Expiration + } + return nil +} + +func (x *RedisProxyExternalAuthResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +var File_envoy_service_redis_auth_v3_redis_external_auth_proto protoreflect.FileDescriptor + +var file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDesc = []byte{ + 0x0a, 0x35, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, + 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x33, 0x2f, 0x72, 0x65, + 0x64, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1b, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x2e, 0x76, 0x33, 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, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, + 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, + 0x75, 0x64, 0x70, 0x61, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x57, 0x0a, + 0x1d, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0xa2, 0x01, 0x0a, 0x1e, 0x52, 0x65, 0x64, 0x69, 0x73, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 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, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0xa4, 0x01, 0x0a, 0x16, + 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x12, 0x89, 0x01, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x3a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x61, 0x75, + 0x74, 0x68, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, + 0x33, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x9e, 0x01, 0x0a, 0x29, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x33, + 0x42, 0x16, 0x52, 0x65, 0x64, 0x69, 0x73, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, + 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x2f, 0x67, 0x6f, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2d, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x2f, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2f, 0x72, 0x65, 0x64, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x33, 0x3b, 0x72, + 0x65, 0x64, 0x69, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x76, 0x33, 0xba, 0x80, 0xc8, 0xd1, 0x06, + 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDescOnce sync.Once + file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDescData = file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDesc +) + +func file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDescGZIP() []byte { + file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDescOnce.Do(func() { + file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDescData) + }) + return file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDescData +} + +var file_envoy_service_redis_auth_v3_redis_external_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_envoy_service_redis_auth_v3_redis_external_auth_proto_goTypes = []interface{}{ + (*RedisProxyExternalAuthRequest)(nil), // 0: envoy.service.redis_auth.v3.RedisProxyExternalAuthRequest + (*RedisProxyExternalAuthResponse)(nil), // 1: envoy.service.redis_auth.v3.RedisProxyExternalAuthResponse + (*status.Status)(nil), // 2: google.rpc.Status + (*timestamppb.Timestamp)(nil), // 3: google.protobuf.Timestamp +} +var file_envoy_service_redis_auth_v3_redis_external_auth_proto_depIdxs = []int32{ + 2, // 0: envoy.service.redis_auth.v3.RedisProxyExternalAuthResponse.status:type_name -> google.rpc.Status + 3, // 1: envoy.service.redis_auth.v3.RedisProxyExternalAuthResponse.expiration:type_name -> google.protobuf.Timestamp + 0, // 2: envoy.service.redis_auth.v3.RedisProxyExternalAuth.Authenticate:input_type -> envoy.service.redis_auth.v3.RedisProxyExternalAuthRequest + 1, // 3: envoy.service.redis_auth.v3.RedisProxyExternalAuth.Authenticate:output_type -> envoy.service.redis_auth.v3.RedisProxyExternalAuthResponse + 3, // [3:4] is the sub-list for method output_type + 2, // [2:3] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_envoy_service_redis_auth_v3_redis_external_auth_proto_init() } +func file_envoy_service_redis_auth_v3_redis_external_auth_proto_init() { + if File_envoy_service_redis_auth_v3_redis_external_auth_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_envoy_service_redis_auth_v3_redis_external_auth_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RedisProxyExternalAuthRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_envoy_service_redis_auth_v3_redis_external_auth_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RedisProxyExternalAuthResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_envoy_service_redis_auth_v3_redis_external_auth_proto_goTypes, + DependencyIndexes: file_envoy_service_redis_auth_v3_redis_external_auth_proto_depIdxs, + MessageInfos: file_envoy_service_redis_auth_v3_redis_external_auth_proto_msgTypes, + }.Build() + File_envoy_service_redis_auth_v3_redis_external_auth_proto = out.File + file_envoy_service_redis_auth_v3_redis_external_auth_proto_rawDesc = nil + file_envoy_service_redis_auth_v3_redis_external_auth_proto_goTypes = nil + file_envoy_service_redis_auth_v3_redis_external_auth_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// RedisProxyExternalAuthClient is the client API for RedisProxyExternalAuth service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type RedisProxyExternalAuthClient interface { + // Performs authentication check based on the data sent with the AUTH request. + // Returns either an OK status or an error status. + Authenticate(ctx context.Context, in *RedisProxyExternalAuthRequest, opts ...grpc.CallOption) (*RedisProxyExternalAuthResponse, error) +} + +type redisProxyExternalAuthClient struct { + cc grpc.ClientConnInterface +} + +func NewRedisProxyExternalAuthClient(cc grpc.ClientConnInterface) RedisProxyExternalAuthClient { + return &redisProxyExternalAuthClient{cc} +} + +func (c *redisProxyExternalAuthClient) Authenticate(ctx context.Context, in *RedisProxyExternalAuthRequest, opts ...grpc.CallOption) (*RedisProxyExternalAuthResponse, error) { + out := new(RedisProxyExternalAuthResponse) + err := c.cc.Invoke(ctx, "/envoy.service.redis_auth.v3.RedisProxyExternalAuth/Authenticate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RedisProxyExternalAuthServer is the server API for RedisProxyExternalAuth service. +type RedisProxyExternalAuthServer interface { + // Performs authentication check based on the data sent with the AUTH request. + // Returns either an OK status or an error status. + Authenticate(context.Context, *RedisProxyExternalAuthRequest) (*RedisProxyExternalAuthResponse, error) +} + +// UnimplementedRedisProxyExternalAuthServer can be embedded to have forward compatible implementations. +type UnimplementedRedisProxyExternalAuthServer struct { +} + +func (*UnimplementedRedisProxyExternalAuthServer) Authenticate(context.Context, *RedisProxyExternalAuthRequest) (*RedisProxyExternalAuthResponse, error) { + return nil, status1.Errorf(codes.Unimplemented, "method Authenticate not implemented") +} + +func RegisterRedisProxyExternalAuthServer(s *grpc.Server, srv RedisProxyExternalAuthServer) { + s.RegisterService(&_RedisProxyExternalAuth_serviceDesc, srv) +} + +func _RedisProxyExternalAuth_Authenticate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RedisProxyExternalAuthRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RedisProxyExternalAuthServer).Authenticate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/envoy.service.redis_auth.v3.RedisProxyExternalAuth/Authenticate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RedisProxyExternalAuthServer).Authenticate(ctx, req.(*RedisProxyExternalAuthRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _RedisProxyExternalAuth_serviceDesc = grpc.ServiceDesc{ + ServiceName: "envoy.service.redis_auth.v3.RedisProxyExternalAuth", + HandlerType: (*RedisProxyExternalAuthServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Authenticate", + Handler: _RedisProxyExternalAuth_Authenticate_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "envoy/service/redis_auth/v3/redis_external_auth.proto", +} diff --git a/vendor/github.com/cilium/proxy/go/envoy/service/redis_auth/v3/redis_external_auth.pb.validate.go b/vendor/github.com/cilium/proxy/go/envoy/service/redis_auth/v3/redis_external_auth.pb.validate.go new file mode 100644 index 0000000000..35ce849423 --- /dev/null +++ b/vendor/github.com/cilium/proxy/go/envoy/service/redis_auth/v3/redis_external_auth.pb.validate.go @@ -0,0 +1,306 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: envoy/service/redis_auth/v3/redis_external_auth.proto + +package redis_authv3 + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on RedisProxyExternalAuthRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *RedisProxyExternalAuthRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RedisProxyExternalAuthRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// RedisProxyExternalAuthRequestMultiError, or nil if none found. +func (m *RedisProxyExternalAuthRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *RedisProxyExternalAuthRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Username + + // no validation rules for Password + + if len(errors) > 0 { + return RedisProxyExternalAuthRequestMultiError(errors) + } + + return nil +} + +// RedisProxyExternalAuthRequestMultiError is an error wrapping multiple +// validation errors returned by RedisProxyExternalAuthRequest.ValidateAll() +// if the designated constraints aren't met. +type RedisProxyExternalAuthRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RedisProxyExternalAuthRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RedisProxyExternalAuthRequestMultiError) AllErrors() []error { return m } + +// RedisProxyExternalAuthRequestValidationError is the validation error +// returned by RedisProxyExternalAuthRequest.Validate if the designated +// constraints aren't met. +type RedisProxyExternalAuthRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RedisProxyExternalAuthRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RedisProxyExternalAuthRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RedisProxyExternalAuthRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RedisProxyExternalAuthRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RedisProxyExternalAuthRequestValidationError) ErrorName() string { + return "RedisProxyExternalAuthRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e RedisProxyExternalAuthRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRedisProxyExternalAuthRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RedisProxyExternalAuthRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RedisProxyExternalAuthRequestValidationError{} + +// Validate checks the field values on RedisProxyExternalAuthResponse with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *RedisProxyExternalAuthResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RedisProxyExternalAuthResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// RedisProxyExternalAuthResponseMultiError, or nil if none found. +func (m *RedisProxyExternalAuthResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *RedisProxyExternalAuthResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetStatus()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RedisProxyExternalAuthResponseValidationError{ + field: "Status", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RedisProxyExternalAuthResponseValidationError{ + field: "Status", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetStatus()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RedisProxyExternalAuthResponseValidationError{ + field: "Status", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetExpiration()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RedisProxyExternalAuthResponseValidationError{ + field: "Expiration", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RedisProxyExternalAuthResponseValidationError{ + field: "Expiration", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetExpiration()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RedisProxyExternalAuthResponseValidationError{ + field: "Expiration", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for Message + + if len(errors) > 0 { + return RedisProxyExternalAuthResponseMultiError(errors) + } + + return nil +} + +// RedisProxyExternalAuthResponseMultiError is an error wrapping multiple +// validation errors returned by RedisProxyExternalAuthResponse.ValidateAll() +// if the designated constraints aren't met. +type RedisProxyExternalAuthResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RedisProxyExternalAuthResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RedisProxyExternalAuthResponseMultiError) AllErrors() []error { return m } + +// RedisProxyExternalAuthResponseValidationError is the validation error +// returned by RedisProxyExternalAuthResponse.Validate if the designated +// constraints aren't met. +type RedisProxyExternalAuthResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RedisProxyExternalAuthResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RedisProxyExternalAuthResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RedisProxyExternalAuthResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RedisProxyExternalAuthResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RedisProxyExternalAuthResponseValidationError) ErrorName() string { + return "RedisProxyExternalAuthResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e RedisProxyExternalAuthResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRedisProxyExternalAuthResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RedisProxyExternalAuthResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RedisProxyExternalAuthResponseValidationError{} diff --git a/vendor/github.com/cilium/statedb/script.go b/vendor/github.com/cilium/statedb/script.go index 6e94b277bd..c0e805f967 100644 --- a/vendor/github.com/cilium/statedb/script.go +++ b/vendor/github.com/cilium/statedb/script.go @@ -6,7 +6,6 @@ package statedb import ( "bytes" "encoding/json" - "flag" "fmt" "io" "iter" @@ -19,6 +18,7 @@ import ( "github.com/cilium/hive" "github.com/cilium/hive/script" "github.com/liggitt/tabwriter" + "github.com/spf13/pflag" "golang.org/x/time/rate" "gopkg.in/yaml.v3" ) @@ -90,17 +90,14 @@ func DBCmd(db *DB) script.Cmd { ) } -func newCmdFlagSet(w io.Writer) *flag.FlagSet { - fs := flag.NewFlagSet("", flag.ContinueOnError) - fs.SetOutput(w) - return fs -} - func InitializedCmd(db *DB) script.Cmd { return script.Command( script.CmdUsage{ Summary: "Wait until all or specific tables have been initialized", - Args: "[-timeout=] table...", + Args: "table...", + Flags: func(fs *pflag.FlagSet) { + fs.Duration("timeout", 5*time.Second, "Maximum amount of time to wait for the table contents to match") + }, Detail: []string{ "Waits until all or specific tables have been marked", "initialized. The default timeout is 5 seconds.", @@ -111,15 +108,13 @@ func InitializedCmd(db *DB) script.Cmd { }, }, func(s *script.State, args ...string) (script.WaitFunc, error) { - flags := newCmdFlagSet(s.LogWriter()) - timeout := flags.Duration("timeout", 5*time.Second, "Maximum amount of time to wait for the table contents to match") - if err := flags.Parse(args); err != nil { - return nil, fmt.Errorf("%w: %w", script.ErrUsage, err) + timeout, err := s.Flags.GetDuration("timeout") + if err != nil { + return nil, err } - args = flags.Args() txn := db.ReadTxn() - timeoutChan := time.After(*timeout) + timeoutChan := time.After(timeout) allTbls := db.GetTables(txn) tbls := allTbls @@ -166,7 +161,12 @@ func ShowCmd(db *DB) script.Cmd { return script.Command( script.CmdUsage{ Summary: "Show the contents of a table", - Args: "[-o=] [-columns=col1,...] [-format={table,yaml,json}] table", + Args: "table", + Flags: func(fs *pflag.FlagSet) { + fs.StringP("out", "o", "", "File to write to instead of stdout") + fs.StringSlice("columns", nil, "Columns to write") + fs.StringP("format", "f", "table", "Format to write in (table, yaml or json)") + }, Detail: []string{ "Show the contents of a table.", "", @@ -182,20 +182,19 @@ func ShowCmd(db *DB) script.Cmd { }, }, func(s *script.State, args ...string) (script.WaitFunc, error) { - flags := newCmdFlagSet(s.LogWriter()) - file := flags.String("o", "", "File to write to instead of stdout") - columns := flags.String("columns", "", "Comma-separated list of columns to write") - format := flags.String("format", "table", "Format to write in (table, yaml, json)") - if err := flags.Parse(args); err != nil { - return nil, fmt.Errorf("%w: %w", script.ErrUsage, err) + file, err := s.Flags.GetString("out") + if err != nil { + return nil, err } - - var cols []string - if len(*columns) > 0 { - cols = strings.Split(*columns, ",") + columns, err := s.Flags.GetStringSlice("columns") + if err != nil { + return nil, err + } + format, err := s.Flags.GetString("format") + if err != nil { + return nil, err } - args = flags.Args() if len(args) < 1 { return nil, fmt.Errorf("missing table name") } @@ -203,12 +202,12 @@ func ShowCmd(db *DB) script.Cmd { return func(*script.State) (stdout, stderr string, err error) { var buf strings.Builder var w io.Writer - if *file == "" { + if file == "" { w = &buf } else { - f, err := os.OpenFile(s.Path(*file), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) + f, err := os.OpenFile(s.Path(file), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) if err != nil { - return "", "", fmt.Errorf("OpenFile(%s): %w", *file, err) + return "", "", fmt.Errorf("OpenFile(%s): %w", file, err) } defer f.Close() w = f @@ -217,7 +216,7 @@ func ShowCmd(db *DB) script.Cmd { if err != nil { return "", "", err } - err = writeObjects(tbl, tbl.All(txn), w, cols, *format) + err = writeObjects(tbl, tbl.All(txn), w, columns, format) return buf.String(), "", err }, nil }) @@ -227,7 +226,11 @@ func CompareCmd(db *DB) script.Cmd { return script.Command( script.CmdUsage{ Summary: "Compare table", - Args: "[-timeout=] [-grep=] table file", + Args: "table file", + Flags: func(fs *pflag.FlagSet) { + fs.Duration("timeout", 5*time.Second, "Maximum amount of time to wait for the table contents to match") + fs.String("grep", "", "Grep the result rows and only compare matching ones") + }, Detail: []string{ "Compare the contents of a table against a file.", "The comparison is retried until a timeout (1s default).", @@ -243,21 +246,22 @@ func CompareCmd(db *DB) script.Cmd { }, }, func(s *script.State, args ...string) (script.WaitFunc, error) { - flags := newCmdFlagSet(s.LogWriter()) - timeout := flags.Duration("timeout", time.Second, "Maximum amount of time to wait for the table contents to match") - grep := flags.String("grep", "", "Grep the result rows and only compare matching ones") - err := flags.Parse(args) + timeout, err := s.Flags.GetDuration("timeout") + if err != nil { + return nil, err + } + grep, err := s.Flags.GetString("grep") if err != nil { - return nil, fmt.Errorf("%w: %w", script.ErrUsage, err) + return nil, err } - args = flags.Args() + if len(args) != 2 { return nil, fmt.Errorf("expected table and filename") } var grepRe *regexp.Regexp - if *grep != "" { - grepRe, err = regexp.Compile(*grep) + if grep != "" { + grepRe, err = regexp.Compile(grep) if err != nil { return nil, fmt.Errorf("bad grep: %w", err) } @@ -292,7 +296,7 @@ func CompareCmd(db *DB) script.Cmd { } lines = lines[1:] origLines := lines - timeoutChan := time.After(*timeout) + timeoutChan := time.After(timeout) for { lines = origLines @@ -485,8 +489,15 @@ func queryCmd(db *DB, query int, summary string, detail []string) script.Cmd { return script.Command( script.CmdUsage{ Summary: summary, - Args: "[-o=] [-columns=col1,...] [-format={table*,yaml,json}] [-index=] table key", - Detail: detail, + Args: "table key", + Flags: func(fs *pflag.FlagSet) { + fs.StringP("out", "o", "", "File to write to instead of stdout") + fs.StringSlice("columns", nil, "Columns to write") + fs.StringP("format", "f", "table", "Format to write in (table, yaml or json)") + fs.StringP("index", "i", "", "Index to query") + fs.Bool("delete", false, "Delete all matching objects") + }, + Detail: detail, }, func(s *script.State, args ...string) (script.WaitFunc, error) { return runQueryCmd(query, db, s, args) @@ -495,22 +506,27 @@ func queryCmd(db *DB, query int, summary string, detail []string) script.Cmd { } func runQueryCmd(query int, db *DB, s *script.State, args []string) (script.WaitFunc, error) { - flags := newCmdFlagSet(s.LogWriter()) - file := flags.String("o", "", "File to write results to instead of stdout") - index := flags.String("index", "", "Index to query") - format := flags.String("format", "table", "Format to write in (table, yaml, json)") - columns := flags.String("columns", "", "Comma-separated list of columns to write") - delete := flags.Bool("delete", false, "Delete all matching objects") - if err := flags.Parse(args); err != nil { - return nil, fmt.Errorf("%w: %w", script.ErrUsage, err) + file, err := s.Flags.GetString("out") + if err != nil { + return nil, err } - - var cols []string - if len(*columns) > 0 { - cols = strings.Split(*columns, ",") + columns, err := s.Flags.GetStringSlice("columns") + if err != nil { + return nil, err + } + format, err := s.Flags.GetString("format") + if err != nil { + return nil, err + } + index, err := s.Flags.GetString("index") + if err != nil { + return nil, err + } + delete, err := s.Flags.GetBool("delete") + if err != nil { + return nil, err } - args = flags.Args() if len(args) < 2 { return nil, fmt.Errorf("expected table and key") } @@ -523,12 +539,12 @@ func runQueryCmd(query int, db *DB, s *script.State, args []string) (script.Wait var buf strings.Builder var w io.Writer - if *file == "" { + if file == "" { w = &buf } else { - f, err := os.OpenFile(s.Path(*file), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) + f, err := os.OpenFile(s.Path(file), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) if err != nil { - return "", "", fmt.Errorf("OpenFile(%s): %s", *file, err) + return "", "", fmt.Errorf("OpenFile(%s): %s", file, err) } defer f.Close() w = f @@ -537,13 +553,13 @@ func runQueryCmd(query int, db *DB, s *script.State, args []string) (script.Wait var it iter.Seq2[any, uint64] switch query { case queryCmdList: - it, err = tbl.List(txn, *index, args[1]) + it, err = tbl.List(txn, index, args[1]) case queryCmdLowerBound: - it, err = tbl.LowerBound(txn, *index, args[1]) + it, err = tbl.LowerBound(txn, index, args[1]) case queryCmdPrefix: - it, err = tbl.Prefix(txn, *index, args[1]) + it, err = tbl.Prefix(txn, index, args[1]) case queryCmdGet: - it, err = tbl.List(txn, *index, args[1]) + it, err = tbl.List(txn, index, args[1]) if err == nil { it = firstOfSeq2(it) } @@ -554,12 +570,12 @@ func runQueryCmd(query int, db *DB, s *script.State, args []string) (script.Wait return "", "", fmt.Errorf("query: %w", err) } - err = writeObjects(tbl, it, w, cols, *format) + err = writeObjects(tbl, it, w, columns, format) if err != nil { return "", "", err } - if *delete { + if delete { wtxn := db.WriteTxn(tbl.Meta) count := 0 for obj := range it { diff --git a/vendor/github.com/docker/docker/registry/types.go b/vendor/github.com/docker/docker/registry/types.go index 54aa0bd19d..4926580a6c 100644 --- a/vendor/github.com/docker/docker/registry/types.go +++ b/vendor/github.com/docker/docker/registry/types.go @@ -37,5 +37,7 @@ type RepositoryInfo struct { Official bool // Class represents the class of the repository, such as "plugin" // or "image". + // + // Deprecated: this field is no longer used, and will be removed in the next release. Class string } diff --git a/vendor/github.com/exponent-io/jsonpath/.travis.yml b/vendor/github.com/exponent-io/jsonpath/.travis.yml index f4f458a416..53bb8b3f95 100644 --- a/vendor/github.com/exponent-io/jsonpath/.travis.yml +++ b/vendor/github.com/exponent-io/jsonpath/.travis.yml @@ -1,5 +1,7 @@ language: go - +arch: + - amd64 + - ppc64le go: - - 1.5 + - 1.15 - tip diff --git a/vendor/github.com/exponent-io/jsonpath/decoder.go b/vendor/github.com/exponent-io/jsonpath/decoder.go index 31de46c738..5e3a06548a 100644 --- a/vendor/github.com/exponent-io/jsonpath/decoder.go +++ b/vendor/github.com/exponent-io/jsonpath/decoder.go @@ -39,16 +39,15 @@ func NewDecoder(r io.Reader) *Decoder { // Decoder is intended to be used with a stream of tokens. As a result it navigates forward only. func (d *Decoder) SeekTo(path ...interface{}) (bool, error) { - if len(path) == 0 { - return len(d.path) == 0, nil - } - last := len(path) - 1 - if i, ok := path[last].(int); ok { - path[last] = i - 1 + if len(path) > 0 { + last := len(path) - 1 + if i, ok := path[last].(int); ok { + path[last] = i - 1 + } } for { - if d.path.Equal(path) { + if len(path) == len(d.path) && d.path.Equal(path) { return true, nil } _, err := d.Token() diff --git a/vendor/github.com/spf13/cast/README.md b/vendor/github.com/spf13/cast/README.md index 0e9e145935..1be666a456 100644 --- a/vendor/github.com/spf13/cast/README.md +++ b/vendor/github.com/spf13/cast/README.md @@ -1,6 +1,6 @@ # cast -[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/spf13/cast/ci.yaml?branch=master&style=flat-square)](https://github.com/spf13/cast/actions/workflows/ci.yaml) +[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/spf13/cast/test.yaml?branch=master&style=flat-square)](https://github.com/spf13/cast/actions/workflows/test.yaml) [![PkgGoDev](https://pkg.go.dev/badge/mod/github.com/spf13/cast)](https://pkg.go.dev/mod/github.com/spf13/cast) ![Go Version](https://img.shields.io/badge/go%20version-%3E=1.16-61CFDD.svg?style=flat-square) [![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cast?style=flat-square)](https://goreportcard.com/report/github.com/spf13/cast) diff --git a/vendor/github.com/spf13/cast/caste.go b/vendor/github.com/spf13/cast/caste.go index cd9c04885a..4181a2e758 100644 --- a/vendor/github.com/spf13/cast/caste.go +++ b/vendor/github.com/spf13/cast/caste.go @@ -613,12 +613,12 @@ func ToUint64E(i interface{}) (uint64, error) { switch s := i.(type) { case string: - v, err := strconv.ParseInt(trimZeroDecimal(s), 0, 0) + v, err := strconv.ParseUint(trimZeroDecimal(s), 0, 0) if err == nil { if v < 0 { return 0, errNegativeNotAllowed } - return uint64(v), nil + return v, nil } return 0, fmt.Errorf("unable to cast %#v of type %T to uint64", i, i) case json.Number: diff --git a/vendor/go.opentelemetry.io/auto/sdk/CONTRIBUTING.md b/vendor/go.opentelemetry.io/auto/sdk/CONTRIBUTING.md new file mode 100644 index 0000000000..773c9b6431 --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/CONTRIBUTING.md @@ -0,0 +1,27 @@ +# Contributing to go.opentelemetry.io/auto/sdk + +The `go.opentelemetry.io/auto/sdk` module is a purpose built OpenTelemetry SDK. +It is designed to be: + +0. An OpenTelemetry compliant SDK +1. Instrumented by auto-instrumentation (serializable into OTLP JSON) +2. Lightweight +3. User-friendly + +These design choices are listed in the order of their importance. + +The primary design goal of this module is to be an OpenTelemetry SDK. +This means that it needs to implement the Go APIs found in `go.opentelemetry.io/otel`. + +Having met the requirement of SDK compliance, this module needs to provide code that the `go.opentelemetry.io/auto` module can instrument. +The chosen approach to meet this goal is to ensure the telemetry from the SDK is serializable into JSON encoded OTLP. +This ensures then that the serialized form is compatible with other OpenTelemetry systems, and the auto-instrumentation can use these systems to deserialize any telemetry it is sent. + +Outside of these first two goals, the intended use becomes relevant. +This package is intended to be used in the `go.opentelemetry.io/otel` global API as a default when the auto-instrumentation is running. +Because of this, this package needs to not add unnecessary dependencies to that API. +Ideally, it adds none. +It also needs to operate efficiently. + +Finally, this module is designed to be user-friendly to Go development. +It hides complexity in order to provide simpler APIs when the previous goals can all still be met. diff --git a/vendor/go.opentelemetry.io/auto/sdk/LICENSE b/vendor/go.opentelemetry.io/auto/sdk/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/go.opentelemetry.io/auto/sdk/VERSIONING.md b/vendor/go.opentelemetry.io/auto/sdk/VERSIONING.md new file mode 100644 index 0000000000..088d19a6ce --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/VERSIONING.md @@ -0,0 +1,15 @@ +# Versioning + +This document describes the versioning policy for this module. +This policy is designed so the following goals can be achieved. + +**Users are provided a codebase of value that is stable and secure.** + +## Policy + +* Versioning of this module will be idiomatic of a Go project using [Go modules](https://github.com/golang/go/wiki/Modules). + * [Semantic import versioning](https://github.com/golang/go/wiki/Modules#semantic-import-versioning) will be used. + * Versions will comply with [semver 2.0](https://semver.org/spec/v2.0.0.html). + * Any `v2` or higher version of this module will be included as a `/vN` at the end of the module path used in `go.mod` files and in the package import path. + +* GitHub releases will be made for all releases. diff --git a/vendor/go.opentelemetry.io/auto/sdk/doc.go b/vendor/go.opentelemetry.io/auto/sdk/doc.go new file mode 100644 index 0000000000..ad73d8cb9d --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/doc.go @@ -0,0 +1,14 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +/* +Package sdk provides an auto-instrumentable OpenTelemetry SDK. + +An [go.opentelemetry.io/auto.Instrumentation] can be configured to target the +process running this SDK. In that case, all telemetry the SDK produces will be +processed and handled by that [go.opentelemetry.io/auto.Instrumentation]. + +By default, if there is no [go.opentelemetry.io/auto.Instrumentation] set to +auto-instrument the SDK, the SDK will not generate any telemetry. +*/ +package sdk diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/attr.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/attr.go new file mode 100644 index 0000000000..af6ef171f6 --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/attr.go @@ -0,0 +1,58 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +// Attr is a key-value pair. +type Attr struct { + Key string `json:"key,omitempty"` + Value Value `json:"value,omitempty"` +} + +// String returns an Attr for a string value. +func String(key, value string) Attr { + return Attr{key, StringValue(value)} +} + +// Int64 returns an Attr for an int64 value. +func Int64(key string, value int64) Attr { + return Attr{key, Int64Value(value)} +} + +// Int returns an Attr for an int value. +func Int(key string, value int) Attr { + return Int64(key, int64(value)) +} + +// Float64 returns an Attr for a float64 value. +func Float64(key string, value float64) Attr { + return Attr{key, Float64Value(value)} +} + +// Bool returns an Attr for a bool value. +func Bool(key string, value bool) Attr { + return Attr{key, BoolValue(value)} +} + +// Bytes returns an Attr for a []byte value. +// The passed slice must not be changed after it is passed. +func Bytes(key string, value []byte) Attr { + return Attr{key, BytesValue(value)} +} + +// Slice returns an Attr for a []Value value. +// The passed slice must not be changed after it is passed. +func Slice(key string, value ...Value) Attr { + return Attr{key, SliceValue(value...)} +} + +// Map returns an Attr for a map value. +// The passed slice must not be changed after it is passed. +func Map(key string, value ...Attr) Attr { + return Attr{key, MapValue(value...)} +} + +// Equal returns if a is equal to b. +func (a Attr) Equal(b Attr) bool { + return a.Key == b.Key && a.Value.Equal(b.Value) +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/doc.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/doc.go new file mode 100644 index 0000000000..949e2165c0 --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/doc.go @@ -0,0 +1,8 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +/* +Package telemetry provides a lightweight representations of OpenTelemetry +telemetry that is compatible with the OTLP JSON protobuf encoding. +*/ +package telemetry diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/id.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/id.go new file mode 100644 index 0000000000..e854d7e84e --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/id.go @@ -0,0 +1,103 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +import ( + "encoding/hex" + "errors" + "fmt" +) + +const ( + traceIDSize = 16 + spanIDSize = 8 +) + +// TraceID is a custom data type that is used for all trace IDs. +type TraceID [traceIDSize]byte + +// String returns the hex string representation form of a TraceID. +func (tid TraceID) String() string { + return hex.EncodeToString(tid[:]) +} + +// IsEmpty returns false if id contains at least one non-zero byte. +func (tid TraceID) IsEmpty() bool { + return tid == [traceIDSize]byte{} +} + +// MarshalJSON converts the trace ID into a hex string enclosed in quotes. +func (tid TraceID) MarshalJSON() ([]byte, error) { + if tid.IsEmpty() { + return []byte(`""`), nil + } + return marshalJSON(tid[:]) +} + +// UnmarshalJSON inflates the trace ID from hex string, possibly enclosed in +// quotes. +func (tid *TraceID) UnmarshalJSON(data []byte) error { + *tid = [traceIDSize]byte{} + return unmarshalJSON(tid[:], data) +} + +// SpanID is a custom data type that is used for all span IDs. +type SpanID [spanIDSize]byte + +// String returns the hex string representation form of a SpanID. +func (sid SpanID) String() string { + return hex.EncodeToString(sid[:]) +} + +// IsEmpty returns true if the span ID contains at least one non-zero byte. +func (sid SpanID) IsEmpty() bool { + return sid == [spanIDSize]byte{} +} + +// MarshalJSON converts span ID into a hex string enclosed in quotes. +func (sid SpanID) MarshalJSON() ([]byte, error) { + if sid.IsEmpty() { + return []byte(`""`), nil + } + return marshalJSON(sid[:]) +} + +// UnmarshalJSON decodes span ID from hex string, possibly enclosed in quotes. +func (sid *SpanID) UnmarshalJSON(data []byte) error { + *sid = [spanIDSize]byte{} + return unmarshalJSON(sid[:], data) +} + +// marshalJSON converts id into a hex string enclosed in quotes. +func marshalJSON(id []byte) ([]byte, error) { + // Plus 2 quote chars at the start and end. + hexLen := hex.EncodedLen(len(id)) + 2 + + b := make([]byte, hexLen) + hex.Encode(b[1:hexLen-1], id) + b[0], b[hexLen-1] = '"', '"' + + return b, nil +} + +// unmarshalJSON inflates trace id from hex string, possibly enclosed in quotes. +func unmarshalJSON(dst []byte, src []byte) error { + if l := len(src); l >= 2 && src[0] == '"' && src[l-1] == '"' { + src = src[1 : l-1] + } + nLen := len(src) + if nLen == 0 { + return nil + } + + if len(dst) != hex.DecodedLen(nLen) { + return errors.New("invalid length for ID") + } + + _, err := hex.Decode(dst, src) + if err != nil { + return fmt.Errorf("cannot unmarshal ID from string '%s': %w", string(src), err) + } + return nil +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/number.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/number.go new file mode 100644 index 0000000000..29e629d667 --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/number.go @@ -0,0 +1,67 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +import ( + "encoding/json" + "strconv" +) + +// protoInt64 represents the protobuf encoding of integers which can be either +// strings or integers. +type protoInt64 int64 + +// Int64 returns the protoInt64 as an int64. +func (i *protoInt64) Int64() int64 { return int64(*i) } + +// UnmarshalJSON decodes both strings and integers. +func (i *protoInt64) UnmarshalJSON(data []byte) error { + if data[0] == '"' { + var str string + if err := json.Unmarshal(data, &str); err != nil { + return err + } + parsedInt, err := strconv.ParseInt(str, 10, 64) + if err != nil { + return err + } + *i = protoInt64(parsedInt) + } else { + var parsedInt int64 + if err := json.Unmarshal(data, &parsedInt); err != nil { + return err + } + *i = protoInt64(parsedInt) + } + return nil +} + +// protoUint64 represents the protobuf encoding of integers which can be either +// strings or integers. +type protoUint64 uint64 + +// Int64 returns the protoUint64 as a uint64. +func (i *protoUint64) Uint64() uint64 { return uint64(*i) } + +// UnmarshalJSON decodes both strings and integers. +func (i *protoUint64) UnmarshalJSON(data []byte) error { + if data[0] == '"' { + var str string + if err := json.Unmarshal(data, &str); err != nil { + return err + } + parsedUint, err := strconv.ParseUint(str, 10, 64) + if err != nil { + return err + } + *i = protoUint64(parsedUint) + } else { + var parsedUint uint64 + if err := json.Unmarshal(data, &parsedUint); err != nil { + return err + } + *i = protoUint64(parsedUint) + } + return nil +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/resource.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/resource.go new file mode 100644 index 0000000000..cecad8bae3 --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/resource.go @@ -0,0 +1,66 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" +) + +// Resource information. +type Resource struct { + // Attrs are the set of attributes that describe the resource. Attribute + // keys MUST be unique (it is not allowed to have more than one attribute + // with the same key). + Attrs []Attr `json:"attributes,omitempty"` + // DroppedAttrs is the number of dropped attributes. If the value + // is 0, then no attributes were dropped. + DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"` +} + +// UnmarshalJSON decodes the OTLP formatted JSON contained in data into r. +func (r *Resource) UnmarshalJSON(data []byte) error { + decoder := json.NewDecoder(bytes.NewReader(data)) + + t, err := decoder.Token() + if err != nil { + return err + } + if t != json.Delim('{') { + return errors.New("invalid Resource type") + } + + for decoder.More() { + keyIface, err := decoder.Token() + if err != nil { + if errors.Is(err, io.EOF) { + // Empty. + return nil + } + return err + } + + key, ok := keyIface.(string) + if !ok { + return fmt.Errorf("invalid Resource field: %#v", keyIface) + } + + switch key { + case "attributes": + err = decoder.Decode(&r.Attrs) + case "droppedAttributesCount", "dropped_attributes_count": + err = decoder.Decode(&r.DroppedAttrs) + default: + // Skip unknown. + } + + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/scope.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/scope.go new file mode 100644 index 0000000000..b6f2e28d40 --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/scope.go @@ -0,0 +1,67 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" +) + +// Scope is the identifying values of the instrumentation scope. +type Scope struct { + Name string `json:"name,omitempty"` + Version string `json:"version,omitempty"` + Attrs []Attr `json:"attributes,omitempty"` + DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"` +} + +// UnmarshalJSON decodes the OTLP formatted JSON contained in data into r. +func (s *Scope) UnmarshalJSON(data []byte) error { + decoder := json.NewDecoder(bytes.NewReader(data)) + + t, err := decoder.Token() + if err != nil { + return err + } + if t != json.Delim('{') { + return errors.New("invalid Scope type") + } + + for decoder.More() { + keyIface, err := decoder.Token() + if err != nil { + if errors.Is(err, io.EOF) { + // Empty. + return nil + } + return err + } + + key, ok := keyIface.(string) + if !ok { + return fmt.Errorf("invalid Scope field: %#v", keyIface) + } + + switch key { + case "name": + err = decoder.Decode(&s.Name) + case "version": + err = decoder.Decode(&s.Version) + case "attributes": + err = decoder.Decode(&s.Attrs) + case "droppedAttributesCount", "dropped_attributes_count": + err = decoder.Decode(&s.DroppedAttrs) + default: + // Skip unknown. + } + + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/span.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/span.go new file mode 100644 index 0000000000..a13a6b733d --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/span.go @@ -0,0 +1,456 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "io" + "time" +) + +// A Span represents a single operation performed by a single component of the +// system. +type Span struct { + // A unique identifier for a trace. All spans from the same trace share + // the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes OR + // of length other than 16 bytes is considered invalid (empty string in OTLP/JSON + // is zero-length and thus is also invalid). + // + // This field is required. + TraceID TraceID `json:"traceId,omitempty"` + // A unique identifier for a span within a trace, assigned when the span + // is created. The ID is an 8-byte array. An ID with all zeroes OR of length + // other than 8 bytes is considered invalid (empty string in OTLP/JSON + // is zero-length and thus is also invalid). + // + // This field is required. + SpanID SpanID `json:"spanId,omitempty"` + // trace_state conveys information about request position in multiple distributed tracing graphs. + // It is a trace_state in w3c-trace-context format: https://www.w3.org/TR/trace-context/#tracestate-header + // See also https://github.com/w3c/distributed-tracing for more details about this field. + TraceState string `json:"traceState,omitempty"` + // The `span_id` of this span's parent span. If this is a root span, then this + // field must be empty. The ID is an 8-byte array. + ParentSpanID SpanID `json:"parentSpanId,omitempty"` + // Flags, a bit field. + // + // Bits 0-7 (8 least significant bits) are the trace flags as defined in W3C Trace + // Context specification. To read the 8-bit W3C trace flag, use + // `flags & SPAN_FLAGS_TRACE_FLAGS_MASK`. + // + // See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions. + // + // Bits 8 and 9 represent the 3 states of whether a span's parent + // is remote. The states are (unknown, is not remote, is remote). + // To read whether the value is known, use `(flags & SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) != 0`. + // To read whether the span is remote, use `(flags & SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0`. + // + // When creating span messages, if the message is logically forwarded from another source + // with an equivalent flags fields (i.e., usually another OTLP span message), the field SHOULD + // be copied as-is. If creating from a source that does not have an equivalent flags field + // (such as a runtime representation of an OpenTelemetry span), the high 22 bits MUST + // be set to zero. + // Readers MUST NOT assume that bits 10-31 (22 most significant bits) will be zero. + // + // [Optional]. + Flags uint32 `json:"flags,omitempty"` + // A description of the span's operation. + // + // For example, the name can be a qualified method name or a file name + // and a line number where the operation is called. A best practice is to use + // the same display name at the same call point in an application. + // This makes it easier to correlate spans in different traces. + // + // This field is semantically required to be set to non-empty string. + // Empty value is equivalent to an unknown span name. + // + // This field is required. + Name string `json:"name"` + // Distinguishes between spans generated in a particular context. For example, + // two spans with the same name may be distinguished using `CLIENT` (caller) + // and `SERVER` (callee) to identify queueing latency associated with the span. + Kind SpanKind `json:"kind,omitempty"` + // start_time_unix_nano is the start time of the span. On the client side, this is the time + // kept by the local machine where the span execution starts. On the server side, this + // is the time when the server's application handler starts running. + // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + // + // This field is semantically required and it is expected that end_time >= start_time. + StartTime time.Time `json:"startTimeUnixNano,omitempty"` + // end_time_unix_nano is the end time of the span. On the client side, this is the time + // kept by the local machine where the span execution ends. On the server side, this + // is the time when the server application handler stops running. + // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. + // + // This field is semantically required and it is expected that end_time >= start_time. + EndTime time.Time `json:"endTimeUnixNano,omitempty"` + // attributes is a collection of key/value pairs. Note, global attributes + // like server name can be set using the resource API. Examples of attributes: + // + // "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" + // "/http/server_latency": 300 + // "example.com/myattribute": true + // "example.com/score": 10.239 + // + // The OpenTelemetry API specification further restricts the allowed value types: + // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/README.md#attribute + // Attribute keys MUST be unique (it is not allowed to have more than one + // attribute with the same key). + Attrs []Attr `json:"attributes,omitempty"` + // dropped_attributes_count is the number of attributes that were discarded. Attributes + // can be discarded because their keys are too long or because there are too many + // attributes. If this value is 0, then no attributes were dropped. + DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"` + // events is a collection of Event items. + Events []*SpanEvent `json:"events,omitempty"` + // dropped_events_count is the number of dropped events. If the value is 0, then no + // events were dropped. + DroppedEvents uint32 `json:"droppedEventsCount,omitempty"` + // links is a collection of Links, which are references from this span to a span + // in the same or different trace. + Links []*SpanLink `json:"links,omitempty"` + // dropped_links_count is the number of dropped links after the maximum size was + // enforced. If this value is 0, then no links were dropped. + DroppedLinks uint32 `json:"droppedLinksCount,omitempty"` + // An optional final status for this span. Semantically when Status isn't set, it means + // span's status code is unset, i.e. assume STATUS_CODE_UNSET (code = 0). + Status *Status `json:"status,omitempty"` +} + +// MarshalJSON encodes s into OTLP formatted JSON. +func (s Span) MarshalJSON() ([]byte, error) { + startT := s.StartTime.UnixNano() + if s.StartTime.IsZero() || startT < 0 { + startT = 0 + } + + endT := s.EndTime.UnixNano() + if s.EndTime.IsZero() || endT < 0 { + endT = 0 + } + + // Override non-empty default SpanID marshal and omitempty. + var parentSpanId string + if !s.ParentSpanID.IsEmpty() { + b := make([]byte, hex.EncodedLen(spanIDSize)) + hex.Encode(b, s.ParentSpanID[:]) + parentSpanId = string(b) + } + + type Alias Span + return json.Marshal(struct { + Alias + ParentSpanID string `json:"parentSpanId,omitempty"` + StartTime uint64 `json:"startTimeUnixNano,omitempty"` + EndTime uint64 `json:"endTimeUnixNano,omitempty"` + }{ + Alias: Alias(s), + ParentSpanID: parentSpanId, + StartTime: uint64(startT), + EndTime: uint64(endT), + }) +} + +// UnmarshalJSON decodes the OTLP formatted JSON contained in data into s. +func (s *Span) UnmarshalJSON(data []byte) error { + decoder := json.NewDecoder(bytes.NewReader(data)) + + t, err := decoder.Token() + if err != nil { + return err + } + if t != json.Delim('{') { + return errors.New("invalid Span type") + } + + for decoder.More() { + keyIface, err := decoder.Token() + if err != nil { + if errors.Is(err, io.EOF) { + // Empty. + return nil + } + return err + } + + key, ok := keyIface.(string) + if !ok { + return fmt.Errorf("invalid Span field: %#v", keyIface) + } + + switch key { + case "traceId", "trace_id": + err = decoder.Decode(&s.TraceID) + case "spanId", "span_id": + err = decoder.Decode(&s.SpanID) + case "traceState", "trace_state": + err = decoder.Decode(&s.TraceState) + case "parentSpanId", "parent_span_id": + err = decoder.Decode(&s.ParentSpanID) + case "flags": + err = decoder.Decode(&s.Flags) + case "name": + err = decoder.Decode(&s.Name) + case "kind": + err = decoder.Decode(&s.Kind) + case "startTimeUnixNano", "start_time_unix_nano": + var val protoUint64 + err = decoder.Decode(&val) + s.StartTime = time.Unix(0, int64(val.Uint64())) + case "endTimeUnixNano", "end_time_unix_nano": + var val protoUint64 + err = decoder.Decode(&val) + s.EndTime = time.Unix(0, int64(val.Uint64())) + case "attributes": + err = decoder.Decode(&s.Attrs) + case "droppedAttributesCount", "dropped_attributes_count": + err = decoder.Decode(&s.DroppedAttrs) + case "events": + err = decoder.Decode(&s.Events) + case "droppedEventsCount", "dropped_events_count": + err = decoder.Decode(&s.DroppedEvents) + case "links": + err = decoder.Decode(&s.Links) + case "droppedLinksCount", "dropped_links_count": + err = decoder.Decode(&s.DroppedLinks) + case "status": + err = decoder.Decode(&s.Status) + default: + // Skip unknown. + } + + if err != nil { + return err + } + } + return nil +} + +// SpanFlags represents constants used to interpret the +// Span.flags field, which is protobuf 'fixed32' type and is to +// be used as bit-fields. Each non-zero value defined in this enum is +// a bit-mask. To extract the bit-field, for example, use an +// expression like: +// +// (span.flags & SPAN_FLAGS_TRACE_FLAGS_MASK) +// +// See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions. +// +// Note that Span flags were introduced in version 1.1 of the +// OpenTelemetry protocol. Older Span producers do not set this +// field, consequently consumers should not rely on the absence of a +// particular flag bit to indicate the presence of a particular feature. +type SpanFlags int32 + +const ( + // Bits 0-7 are used for trace flags. + SpanFlagsTraceFlagsMask SpanFlags = 255 + // Bits 8 and 9 are used to indicate that the parent span or link span is remote. + // Bit 8 (`HAS_IS_REMOTE`) indicates whether the value is known. + // Bit 9 (`IS_REMOTE`) indicates whether the span or link is remote. + SpanFlagsContextHasIsRemoteMask SpanFlags = 256 + // SpanFlagsContextHasIsRemoteMask indicates the Span is remote. + SpanFlagsContextIsRemoteMask SpanFlags = 512 +) + +// SpanKind is the type of span. Can be used to specify additional relationships between spans +// in addition to a parent/child relationship. +type SpanKind int32 + +const ( + // Indicates that the span represents an internal operation within an application, + // as opposed to an operation happening at the boundaries. Default value. + SpanKindInternal SpanKind = 1 + // Indicates that the span covers server-side handling of an RPC or other + // remote network request. + SpanKindServer SpanKind = 2 + // Indicates that the span describes a request to some remote service. + SpanKindClient SpanKind = 3 + // Indicates that the span describes a producer sending a message to a broker. + // Unlike CLIENT and SERVER, there is often no direct critical path latency relationship + // between producer and consumer spans. A PRODUCER span ends when the message was accepted + // by the broker while the logical processing of the message might span a much longer time. + SpanKindProducer SpanKind = 4 + // Indicates that the span describes consumer receiving a message from a broker. + // Like the PRODUCER kind, there is often no direct critical path latency relationship + // between producer and consumer spans. + SpanKindConsumer SpanKind = 5 +) + +// Event is a time-stamped annotation of the span, consisting of user-supplied +// text description and key-value pairs. +type SpanEvent struct { + // time_unix_nano is the time the event occurred. + Time time.Time `json:"timeUnixNano,omitempty"` + // name of the event. + // This field is semantically required to be set to non-empty string. + Name string `json:"name,omitempty"` + // attributes is a collection of attribute key/value pairs on the event. + // Attribute keys MUST be unique (it is not allowed to have more than one + // attribute with the same key). + Attrs []Attr `json:"attributes,omitempty"` + // dropped_attributes_count is the number of dropped attributes. If the value is 0, + // then no attributes were dropped. + DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"` +} + +// MarshalJSON encodes e into OTLP formatted JSON. +func (e SpanEvent) MarshalJSON() ([]byte, error) { + t := e.Time.UnixNano() + if e.Time.IsZero() || t < 0 { + t = 0 + } + + type Alias SpanEvent + return json.Marshal(struct { + Alias + Time uint64 `json:"timeUnixNano,omitempty"` + }{ + Alias: Alias(e), + Time: uint64(t), + }) +} + +// UnmarshalJSON decodes the OTLP formatted JSON contained in data into se. +func (se *SpanEvent) UnmarshalJSON(data []byte) error { + decoder := json.NewDecoder(bytes.NewReader(data)) + + t, err := decoder.Token() + if err != nil { + return err + } + if t != json.Delim('{') { + return errors.New("invalid SpanEvent type") + } + + for decoder.More() { + keyIface, err := decoder.Token() + if err != nil { + if errors.Is(err, io.EOF) { + // Empty. + return nil + } + return err + } + + key, ok := keyIface.(string) + if !ok { + return fmt.Errorf("invalid SpanEvent field: %#v", keyIface) + } + + switch key { + case "timeUnixNano", "time_unix_nano": + var val protoUint64 + err = decoder.Decode(&val) + se.Time = time.Unix(0, int64(val.Uint64())) + case "name": + err = decoder.Decode(&se.Name) + case "attributes": + err = decoder.Decode(&se.Attrs) + case "droppedAttributesCount", "dropped_attributes_count": + err = decoder.Decode(&se.DroppedAttrs) + default: + // Skip unknown. + } + + if err != nil { + return err + } + } + return nil +} + +// A pointer from the current span to another span in the same trace or in a +// different trace. For example, this can be used in batching operations, +// where a single batch handler processes multiple requests from different +// traces or when the handler receives a request from a different project. +type SpanLink struct { + // A unique identifier of a trace that this linked span is part of. The ID is a + // 16-byte array. + TraceID TraceID `json:"traceId,omitempty"` + // A unique identifier for the linked span. The ID is an 8-byte array. + SpanID SpanID `json:"spanId,omitempty"` + // The trace_state associated with the link. + TraceState string `json:"traceState,omitempty"` + // attributes is a collection of attribute key/value pairs on the link. + // Attribute keys MUST be unique (it is not allowed to have more than one + // attribute with the same key). + Attrs []Attr `json:"attributes,omitempty"` + // dropped_attributes_count is the number of dropped attributes. If the value is 0, + // then no attributes were dropped. + DroppedAttrs uint32 `json:"droppedAttributesCount,omitempty"` + // Flags, a bit field. + // + // Bits 0-7 (8 least significant bits) are the trace flags as defined in W3C Trace + // Context specification. To read the 8-bit W3C trace flag, use + // `flags & SPAN_FLAGS_TRACE_FLAGS_MASK`. + // + // See https://www.w3.org/TR/trace-context-2/#trace-flags for the flag definitions. + // + // Bits 8 and 9 represent the 3 states of whether the link is remote. + // The states are (unknown, is not remote, is remote). + // To read whether the value is known, use `(flags & SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) != 0`. + // To read whether the link is remote, use `(flags & SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) != 0`. + // + // Readers MUST NOT assume that bits 10-31 (22 most significant bits) will be zero. + // When creating new spans, bits 10-31 (most-significant 22-bits) MUST be zero. + // + // [Optional]. + Flags uint32 `json:"flags,omitempty"` +} + +// UnmarshalJSON decodes the OTLP formatted JSON contained in data into sl. +func (sl *SpanLink) UnmarshalJSON(data []byte) error { + decoder := json.NewDecoder(bytes.NewReader(data)) + + t, err := decoder.Token() + if err != nil { + return err + } + if t != json.Delim('{') { + return errors.New("invalid SpanLink type") + } + + for decoder.More() { + keyIface, err := decoder.Token() + if err != nil { + if errors.Is(err, io.EOF) { + // Empty. + return nil + } + return err + } + + key, ok := keyIface.(string) + if !ok { + return fmt.Errorf("invalid SpanLink field: %#v", keyIface) + } + + switch key { + case "traceId", "trace_id": + err = decoder.Decode(&sl.TraceID) + case "spanId", "span_id": + err = decoder.Decode(&sl.SpanID) + case "traceState", "trace_state": + err = decoder.Decode(&sl.TraceState) + case "attributes": + err = decoder.Decode(&sl.Attrs) + case "droppedAttributesCount", "dropped_attributes_count": + err = decoder.Decode(&sl.DroppedAttrs) + case "flags": + err = decoder.Decode(&sl.Flags) + default: + // Skip unknown. + } + + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/status.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/status.go new file mode 100644 index 0000000000..1217776ead --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/status.go @@ -0,0 +1,40 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +// For the semantics of status codes see +// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md#set-status +type StatusCode int32 + +const ( + // The default status. + StatusCodeUnset StatusCode = 0 + // The Span has been validated by an Application developer or Operator to + // have completed successfully. + StatusCodeOK StatusCode = 1 + // The Span contains an error. + StatusCodeError StatusCode = 2 +) + +var statusCodeStrings = []string{ + "Unset", + "OK", + "Error", +} + +func (s StatusCode) String() string { + if s >= 0 && int(s) < len(statusCodeStrings) { + return statusCodeStrings[s] + } + return "" +} + +// The Status type defines a logical error model that is suitable for different +// programming environments, including REST APIs and RPC APIs. +type Status struct { + // A developer-facing human readable error message. + Message string `json:"message,omitempty"` + // The status code. + Code StatusCode `json:"code,omitempty"` +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/traces.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/traces.go new file mode 100644 index 0000000000..69a348f0f0 --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/traces.go @@ -0,0 +1,189 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package telemetry + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" +) + +// Traces represents the traces data that can be stored in a persistent storage, +// OR can be embedded by other protocols that transfer OTLP traces data but do +// not implement the OTLP protocol. +// +// The main difference between this message and collector protocol is that +// in this message there will not be any "control" or "metadata" specific to +// OTLP protocol. +// +// When new fields are added into this message, the OTLP request MUST be updated +// as well. +type Traces struct { + // An array of ResourceSpans. + // For data coming from a single resource this array will typically contain + // one element. Intermediary nodes that receive data from multiple origins + // typically batch the data before forwarding further and in that case this + // array will contain multiple elements. + ResourceSpans []*ResourceSpans `json:"resourceSpans,omitempty"` +} + +// UnmarshalJSON decodes the OTLP formatted JSON contained in data into td. +func (td *Traces) UnmarshalJSON(data []byte) error { + decoder := json.NewDecoder(bytes.NewReader(data)) + + t, err := decoder.Token() + if err != nil { + return err + } + if t != json.Delim('{') { + return errors.New("invalid TracesData type") + } + + for decoder.More() { + keyIface, err := decoder.Token() + if err != nil { + if errors.Is(err, io.EOF) { + // Empty. + return nil + } + return err + } + + key, ok := keyIface.(string) + if !ok { + return fmt.Errorf("invalid TracesData field: %#v", keyIface) + } + + switch key { + case "resourceSpans", "resource_spans": + err = decoder.Decode(&td.ResourceSpans) + default: + // Skip unknown. + } + + if err != nil { + return err + } + } + return nil +} + +// A collection of ScopeSpans from a Resource. +type ResourceSpans struct { + // The resource for the spans in this message. + // If this field is not set then no resource info is known. + Resource Resource `json:"resource"` + // A list of ScopeSpans that originate from a resource. + ScopeSpans []*ScopeSpans `json:"scopeSpans,omitempty"` + // This schema_url applies to the data in the "resource" field. It does not apply + // to the data in the "scope_spans" field which have their own schema_url field. + SchemaURL string `json:"schemaUrl,omitempty"` +} + +// UnmarshalJSON decodes the OTLP formatted JSON contained in data into rs. +func (rs *ResourceSpans) UnmarshalJSON(data []byte) error { + decoder := json.NewDecoder(bytes.NewReader(data)) + + t, err := decoder.Token() + if err != nil { + return err + } + if t != json.Delim('{') { + return errors.New("invalid ResourceSpans type") + } + + for decoder.More() { + keyIface, err := decoder.Token() + if err != nil { + if errors.Is(err, io.EOF) { + // Empty. + return nil + } + return err + } + + key, ok := keyIface.(string) + if !ok { + return fmt.Errorf("invalid ResourceSpans field: %#v", keyIface) + } + + switch key { + case "resource": + err = decoder.Decode(&rs.Resource) + case "scopeSpans", "scope_spans": + err = decoder.Decode(&rs.ScopeSpans) + case "schemaUrl", "schema_url": + err = decoder.Decode(&rs.SchemaURL) + default: + // Skip unknown. + } + + if err != nil { + return err + } + } + return nil +} + +// A collection of Spans produced by an InstrumentationScope. +type ScopeSpans struct { + // The instrumentation scope information for the spans in this message. + // Semantically when InstrumentationScope isn't set, it is equivalent with + // an empty instrumentation scope name (unknown). + Scope *Scope `json:"scope"` + // A list of Spans that originate from an instrumentation scope. + Spans []*Span `json:"spans,omitempty"` + // The Schema URL, if known. This is the identifier of the Schema that the span data + // is recorded in. To learn more about Schema URL see + // https://opentelemetry.io/docs/specs/otel/schemas/#schema-url + // This schema_url applies to all spans and span events in the "spans" field. + SchemaURL string `json:"schemaUrl,omitempty"` +} + +// UnmarshalJSON decodes the OTLP formatted JSON contained in data into ss. +func (ss *ScopeSpans) UnmarshalJSON(data []byte) error { + decoder := json.NewDecoder(bytes.NewReader(data)) + + t, err := decoder.Token() + if err != nil { + return err + } + if t != json.Delim('{') { + return errors.New("invalid ScopeSpans type") + } + + for decoder.More() { + keyIface, err := decoder.Token() + if err != nil { + if errors.Is(err, io.EOF) { + // Empty. + return nil + } + return err + } + + key, ok := keyIface.(string) + if !ok { + return fmt.Errorf("invalid ScopeSpans field: %#v", keyIface) + } + + switch key { + case "scope": + err = decoder.Decode(&ss.Scope) + case "spans": + err = decoder.Decode(&ss.Spans) + case "schemaUrl", "schema_url": + err = decoder.Decode(&ss.SchemaURL) + default: + // Skip unknown. + } + + if err != nil { + return err + } + } + return nil +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/value.go b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/value.go new file mode 100644 index 0000000000..0dd01b063a --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/internal/telemetry/value.go @@ -0,0 +1,452 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +//go:generate stringer -type=ValueKind -trimprefix=ValueKind + +package telemetry + +import ( + "bytes" + "cmp" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "slices" + "strconv" + "unsafe" +) + +// A Value represents a structured value. +// A zero value is valid and represents an empty value. +type Value struct { + // Ensure forward compatibility by explicitly making this not comparable. + noCmp [0]func() //nolint: unused // This is indeed used. + + // num holds the value for Int64, Float64, and Bool. It holds the length + // for String, Bytes, Slice, Map. + num uint64 + // any holds either the KindBool, KindInt64, KindFloat64, stringptr, + // bytesptr, sliceptr, or mapptr. If KindBool, KindInt64, or KindFloat64 + // then the value of Value is in num as described above. Otherwise, it + // contains the value wrapped in the appropriate type. + any any +} + +type ( + // sliceptr represents a value in Value.any for KindString Values. + stringptr *byte + // bytesptr represents a value in Value.any for KindBytes Values. + bytesptr *byte + // sliceptr represents a value in Value.any for KindSlice Values. + sliceptr *Value + // mapptr represents a value in Value.any for KindMap Values. + mapptr *Attr +) + +// ValueKind is the kind of a [Value]. +type ValueKind int + +// ValueKind values. +const ( + ValueKindEmpty ValueKind = iota + ValueKindBool + ValueKindFloat64 + ValueKindInt64 + ValueKindString + ValueKindBytes + ValueKindSlice + ValueKindMap +) + +var valueKindStrings = []string{ + "Empty", + "Bool", + "Float64", + "Int64", + "String", + "Bytes", + "Slice", + "Map", +} + +func (k ValueKind) String() string { + if k >= 0 && int(k) < len(valueKindStrings) { + return valueKindStrings[k] + } + return "" +} + +// StringValue returns a new [Value] for a string. +func StringValue(v string) Value { + return Value{ + num: uint64(len(v)), + any: stringptr(unsafe.StringData(v)), + } +} + +// IntValue returns a [Value] for an int. +func IntValue(v int) Value { return Int64Value(int64(v)) } + +// Int64Value returns a [Value] for an int64. +func Int64Value(v int64) Value { + return Value{num: uint64(v), any: ValueKindInt64} +} + +// Float64Value returns a [Value] for a float64. +func Float64Value(v float64) Value { + return Value{num: math.Float64bits(v), any: ValueKindFloat64} +} + +// BoolValue returns a [Value] for a bool. +func BoolValue(v bool) Value { //nolint:revive // Not a control flag. + var n uint64 + if v { + n = 1 + } + return Value{num: n, any: ValueKindBool} +} + +// BytesValue returns a [Value] for a byte slice. The passed slice must not be +// changed after it is passed. +func BytesValue(v []byte) Value { + return Value{ + num: uint64(len(v)), + any: bytesptr(unsafe.SliceData(v)), + } +} + +// SliceValue returns a [Value] for a slice of [Value]. The passed slice must +// not be changed after it is passed. +func SliceValue(vs ...Value) Value { + return Value{ + num: uint64(len(vs)), + any: sliceptr(unsafe.SliceData(vs)), + } +} + +// MapValue returns a new [Value] for a slice of key-value pairs. The passed +// slice must not be changed after it is passed. +func MapValue(kvs ...Attr) Value { + return Value{ + num: uint64(len(kvs)), + any: mapptr(unsafe.SliceData(kvs)), + } +} + +// AsString returns the value held by v as a string. +func (v Value) AsString() string { + if sp, ok := v.any.(stringptr); ok { + return unsafe.String(sp, v.num) + } + // TODO: error handle + return "" +} + +// asString returns the value held by v as a string. It will panic if the Value +// is not KindString. +func (v Value) asString() string { + return unsafe.String(v.any.(stringptr), v.num) +} + +// AsInt64 returns the value held by v as an int64. +func (v Value) AsInt64() int64 { + if v.Kind() != ValueKindInt64 { + // TODO: error handle + return 0 + } + return v.asInt64() +} + +// asInt64 returns the value held by v as an int64. If v is not of KindInt64, +// this will return garbage. +func (v Value) asInt64() int64 { + // Assumes v.num was a valid int64 (overflow not checked). + return int64(v.num) // nolint: gosec +} + +// AsBool returns the value held by v as a bool. +func (v Value) AsBool() bool { + if v.Kind() != ValueKindBool { + // TODO: error handle + return false + } + return v.asBool() +} + +// asBool returns the value held by v as a bool. If v is not of KindBool, this +// will return garbage. +func (v Value) asBool() bool { return v.num == 1 } + +// AsFloat64 returns the value held by v as a float64. +func (v Value) AsFloat64() float64 { + if v.Kind() != ValueKindFloat64 { + // TODO: error handle + return 0 + } + return v.asFloat64() +} + +// asFloat64 returns the value held by v as a float64. If v is not of +// KindFloat64, this will return garbage. +func (v Value) asFloat64() float64 { return math.Float64frombits(v.num) } + +// AsBytes returns the value held by v as a []byte. +func (v Value) AsBytes() []byte { + if sp, ok := v.any.(bytesptr); ok { + return unsafe.Slice((*byte)(sp), v.num) + } + // TODO: error handle + return nil +} + +// asBytes returns the value held by v as a []byte. It will panic if the Value +// is not KindBytes. +func (v Value) asBytes() []byte { + return unsafe.Slice((*byte)(v.any.(bytesptr)), v.num) +} + +// AsSlice returns the value held by v as a []Value. +func (v Value) AsSlice() []Value { + if sp, ok := v.any.(sliceptr); ok { + return unsafe.Slice((*Value)(sp), v.num) + } + // TODO: error handle + return nil +} + +// asSlice returns the value held by v as a []Value. It will panic if the Value +// is not KindSlice. +func (v Value) asSlice() []Value { + return unsafe.Slice((*Value)(v.any.(sliceptr)), v.num) +} + +// AsMap returns the value held by v as a []Attr. +func (v Value) AsMap() []Attr { + if sp, ok := v.any.(mapptr); ok { + return unsafe.Slice((*Attr)(sp), v.num) + } + // TODO: error handle + return nil +} + +// asMap returns the value held by v as a []Attr. It will panic if the +// Value is not KindMap. +func (v Value) asMap() []Attr { + return unsafe.Slice((*Attr)(v.any.(mapptr)), v.num) +} + +// Kind returns the Kind of v. +func (v Value) Kind() ValueKind { + switch x := v.any.(type) { + case ValueKind: + return x + case stringptr: + return ValueKindString + case bytesptr: + return ValueKindBytes + case sliceptr: + return ValueKindSlice + case mapptr: + return ValueKindMap + default: + return ValueKindEmpty + } +} + +// Empty returns if v does not hold any value. +func (v Value) Empty() bool { return v.Kind() == ValueKindEmpty } + +// Equal returns if v is equal to w. +func (v Value) Equal(w Value) bool { + k1 := v.Kind() + k2 := w.Kind() + if k1 != k2 { + return false + } + switch k1 { + case ValueKindInt64, ValueKindBool: + return v.num == w.num + case ValueKindString: + return v.asString() == w.asString() + case ValueKindFloat64: + return v.asFloat64() == w.asFloat64() + case ValueKindSlice: + return slices.EqualFunc(v.asSlice(), w.asSlice(), Value.Equal) + case ValueKindMap: + sv := sortMap(v.asMap()) + sw := sortMap(w.asMap()) + return slices.EqualFunc(sv, sw, Attr.Equal) + case ValueKindBytes: + return bytes.Equal(v.asBytes(), w.asBytes()) + case ValueKindEmpty: + return true + default: + // TODO: error handle + return false + } +} + +func sortMap(m []Attr) []Attr { + sm := make([]Attr, len(m)) + copy(sm, m) + slices.SortFunc(sm, func(a, b Attr) int { + return cmp.Compare(a.Key, b.Key) + }) + + return sm +} + +// String returns Value's value as a string, formatted like [fmt.Sprint]. +// +// The returned string is meant for debugging; +// the string representation is not stable. +func (v Value) String() string { + switch v.Kind() { + case ValueKindString: + return v.asString() + case ValueKindInt64: + // Assumes v.num was a valid int64 (overflow not checked). + return strconv.FormatInt(int64(v.num), 10) // nolint: gosec + case ValueKindFloat64: + return strconv.FormatFloat(v.asFloat64(), 'g', -1, 64) + case ValueKindBool: + return strconv.FormatBool(v.asBool()) + case ValueKindBytes: + return fmt.Sprint(v.asBytes()) + case ValueKindMap: + return fmt.Sprint(v.asMap()) + case ValueKindSlice: + return fmt.Sprint(v.asSlice()) + case ValueKindEmpty: + return "" + default: + // Try to handle this as gracefully as possible. + // + // Don't panic here. The goal here is to have developers find this + // first if a slog.Kind is is not handled. It is + // preferable to have user's open issue asking why their attributes + // have a "unhandled: " prefix than say that their code is panicking. + return fmt.Sprintf("", v.Kind()) + } +} + +// MarshalJSON encodes v into OTLP formatted JSON. +func (v *Value) MarshalJSON() ([]byte, error) { + switch v.Kind() { + case ValueKindString: + return json.Marshal(struct { + Value string `json:"stringValue"` + }{v.asString()}) + case ValueKindInt64: + return json.Marshal(struct { + Value string `json:"intValue"` + }{strconv.FormatInt(int64(v.num), 10)}) + case ValueKindFloat64: + return json.Marshal(struct { + Value float64 `json:"doubleValue"` + }{v.asFloat64()}) + case ValueKindBool: + return json.Marshal(struct { + Value bool `json:"boolValue"` + }{v.asBool()}) + case ValueKindBytes: + return json.Marshal(struct { + Value []byte `json:"bytesValue"` + }{v.asBytes()}) + case ValueKindMap: + return json.Marshal(struct { + Value struct { + Values []Attr `json:"values"` + } `json:"kvlistValue"` + }{struct { + Values []Attr `json:"values"` + }{v.asMap()}}) + case ValueKindSlice: + return json.Marshal(struct { + Value struct { + Values []Value `json:"values"` + } `json:"arrayValue"` + }{struct { + Values []Value `json:"values"` + }{v.asSlice()}}) + case ValueKindEmpty: + return nil, nil + default: + return nil, fmt.Errorf("unknown Value kind: %s", v.Kind().String()) + } +} + +// UnmarshalJSON decodes the OTLP formatted JSON contained in data into v. +func (v *Value) UnmarshalJSON(data []byte) error { + decoder := json.NewDecoder(bytes.NewReader(data)) + + t, err := decoder.Token() + if err != nil { + return err + } + if t != json.Delim('{') { + return errors.New("invalid Value type") + } + + for decoder.More() { + keyIface, err := decoder.Token() + if err != nil { + if errors.Is(err, io.EOF) { + // Empty. + return nil + } + return err + } + + key, ok := keyIface.(string) + if !ok { + return fmt.Errorf("invalid Value key: %#v", keyIface) + } + + switch key { + case "stringValue", "string_value": + var val string + err = decoder.Decode(&val) + *v = StringValue(val) + case "boolValue", "bool_value": + var val bool + err = decoder.Decode(&val) + *v = BoolValue(val) + case "intValue", "int_value": + var val protoInt64 + err = decoder.Decode(&val) + *v = Int64Value(val.Int64()) + case "doubleValue", "double_value": + var val float64 + err = decoder.Decode(&val) + *v = Float64Value(val) + case "bytesValue", "bytes_value": + var val64 string + if err := decoder.Decode(&val64); err != nil { + return err + } + var val []byte + val, err = base64.StdEncoding.DecodeString(val64) + *v = BytesValue(val) + case "arrayValue", "array_value": + var val struct{ Values []Value } + err = decoder.Decode(&val) + *v = SliceValue(val.Values...) + case "kvlistValue", "kvlist_value": + var val struct{ Values []Attr } + err = decoder.Decode(&val) + *v = MapValue(val.Values...) + default: + // Skip unknown. + continue + } + // Use first valid. Ignore the rest. + return err + } + + // Only unknown fields. Return nil without unmarshaling any value. + return nil +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/limit.go b/vendor/go.opentelemetry.io/auto/sdk/limit.go new file mode 100644 index 0000000000..86babf1a88 --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/limit.go @@ -0,0 +1,94 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sdk + +import ( + "log/slog" + "os" + "strconv" +) + +// maxSpan are the span limits resolved during startup. +var maxSpan = newSpanLimits() + +type spanLimits struct { + // Attrs is the number of allowed attributes for a span. + // + // This is resolved from the environment variable value for the + // OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT key if it exists. Otherwise, the + // environment variable value for OTEL_ATTRIBUTE_COUNT_LIMIT, or 128 if + // that is not set, is used. + Attrs int + // AttrValueLen is the maximum attribute value length allowed for a span. + // + // This is resolved from the environment variable value for the + // OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT key if it exists. Otherwise, the + // environment variable value for OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT, or -1 + // if that is not set, is used. + AttrValueLen int + // Events is the number of allowed events for a span. + // + // This is resolved from the environment variable value for the + // OTEL_SPAN_EVENT_COUNT_LIMIT key, or 128 is used if that is not set. + Events int + // EventAttrs is the number of allowed attributes for a span event. + // + // The is resolved from the environment variable value for the + // OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT key, or 128 is used if that is not set. + EventAttrs int + // Links is the number of allowed Links for a span. + // + // This is resolved from the environment variable value for the + // OTEL_SPAN_LINK_COUNT_LIMIT, or 128 is used if that is not set. + Links int + // LinkAttrs is the number of allowed attributes for a span link. + // + // This is resolved from the environment variable value for the + // OTEL_LINK_ATTRIBUTE_COUNT_LIMIT, or 128 is used if that is not set. + LinkAttrs int +} + +func newSpanLimits() spanLimits { + return spanLimits{ + Attrs: firstEnv( + 128, + "OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT", + "OTEL_ATTRIBUTE_COUNT_LIMIT", + ), + AttrValueLen: firstEnv( + -1, // Unlimited. + "OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT", + "OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT", + ), + Events: firstEnv(128, "OTEL_SPAN_EVENT_COUNT_LIMIT"), + EventAttrs: firstEnv(128, "OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT"), + Links: firstEnv(128, "OTEL_SPAN_LINK_COUNT_LIMIT"), + LinkAttrs: firstEnv(128, "OTEL_LINK_ATTRIBUTE_COUNT_LIMIT"), + } +} + +// firstEnv returns the parsed integer value of the first matching environment +// variable from keys. The defaultVal is returned if the value is not an +// integer or no match is found. +func firstEnv(defaultVal int, keys ...string) int { + for _, key := range keys { + strV := os.Getenv(key) + if strV == "" { + continue + } + + v, err := strconv.Atoi(strV) + if err == nil { + return v + } + slog.Warn( + "invalid limit environment variable", + "error", err, + "key", key, + "value", strV, + ) + } + + return defaultVal +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/span.go b/vendor/go.opentelemetry.io/auto/sdk/span.go new file mode 100644 index 0000000000..6ebea12a9e --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/span.go @@ -0,0 +1,432 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sdk + +import ( + "encoding/json" + "fmt" + "reflect" + "runtime" + "strings" + "sync" + "sync/atomic" + "time" + "unicode/utf8" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + semconv "go.opentelemetry.io/otel/semconv/v1.26.0" + "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" + + "go.opentelemetry.io/auto/sdk/internal/telemetry" +) + +type span struct { + noop.Span + + spanContext trace.SpanContext + sampled atomic.Bool + + mu sync.Mutex + traces *telemetry.Traces + span *telemetry.Span +} + +func (s *span) SpanContext() trace.SpanContext { + if s == nil { + return trace.SpanContext{} + } + // s.spanContext is immutable, do not acquire lock s.mu. + return s.spanContext +} + +func (s *span) IsRecording() bool { + if s == nil { + return false + } + + return s.sampled.Load() +} + +func (s *span) SetStatus(c codes.Code, msg string) { + if s == nil || !s.sampled.Load() { + return + } + + s.mu.Lock() + defer s.mu.Unlock() + + if s.span.Status == nil { + s.span.Status = new(telemetry.Status) + } + + s.span.Status.Message = msg + + switch c { + case codes.Unset: + s.span.Status.Code = telemetry.StatusCodeUnset + case codes.Error: + s.span.Status.Code = telemetry.StatusCodeError + case codes.Ok: + s.span.Status.Code = telemetry.StatusCodeOK + } +} + +func (s *span) SetAttributes(attrs ...attribute.KeyValue) { + if s == nil || !s.sampled.Load() { + return + } + + s.mu.Lock() + defer s.mu.Unlock() + + limit := maxSpan.Attrs + if limit == 0 { + // No attributes allowed. + s.span.DroppedAttrs += uint32(len(attrs)) + return + } + + m := make(map[string]int) + for i, a := range s.span.Attrs { + m[a.Key] = i + } + + for _, a := range attrs { + val := convAttrValue(a.Value) + if val.Empty() { + s.span.DroppedAttrs++ + continue + } + + if idx, ok := m[string(a.Key)]; ok { + s.span.Attrs[idx] = telemetry.Attr{ + Key: string(a.Key), + Value: val, + } + } else if limit < 0 || len(s.span.Attrs) < limit { + s.span.Attrs = append(s.span.Attrs, telemetry.Attr{ + Key: string(a.Key), + Value: val, + }) + m[string(a.Key)] = len(s.span.Attrs) - 1 + } else { + s.span.DroppedAttrs++ + } + } +} + +// convCappedAttrs converts up to limit attrs into a []telemetry.Attr. The +// number of dropped attributes is also returned. +func convCappedAttrs(limit int, attrs []attribute.KeyValue) ([]telemetry.Attr, uint32) { + if limit == 0 { + return nil, uint32(len(attrs)) + } + + if limit < 0 { + // Unlimited. + return convAttrs(attrs), 0 + } + + limit = min(len(attrs), limit) + return convAttrs(attrs[:limit]), uint32(len(attrs) - limit) +} + +func convAttrs(attrs []attribute.KeyValue) []telemetry.Attr { + if len(attrs) == 0 { + // Avoid allocations if not necessary. + return nil + } + + out := make([]telemetry.Attr, 0, len(attrs)) + for _, attr := range attrs { + key := string(attr.Key) + val := convAttrValue(attr.Value) + if val.Empty() { + continue + } + out = append(out, telemetry.Attr{Key: key, Value: val}) + } + return out +} + +func convAttrValue(value attribute.Value) telemetry.Value { + switch value.Type() { + case attribute.BOOL: + return telemetry.BoolValue(value.AsBool()) + case attribute.INT64: + return telemetry.Int64Value(value.AsInt64()) + case attribute.FLOAT64: + return telemetry.Float64Value(value.AsFloat64()) + case attribute.STRING: + v := truncate(maxSpan.AttrValueLen, value.AsString()) + return telemetry.StringValue(v) + case attribute.BOOLSLICE: + slice := value.AsBoolSlice() + out := make([]telemetry.Value, 0, len(slice)) + for _, v := range slice { + out = append(out, telemetry.BoolValue(v)) + } + return telemetry.SliceValue(out...) + case attribute.INT64SLICE: + slice := value.AsInt64Slice() + out := make([]telemetry.Value, 0, len(slice)) + for _, v := range slice { + out = append(out, telemetry.Int64Value(v)) + } + return telemetry.SliceValue(out...) + case attribute.FLOAT64SLICE: + slice := value.AsFloat64Slice() + out := make([]telemetry.Value, 0, len(slice)) + for _, v := range slice { + out = append(out, telemetry.Float64Value(v)) + } + return telemetry.SliceValue(out...) + case attribute.STRINGSLICE: + slice := value.AsStringSlice() + out := make([]telemetry.Value, 0, len(slice)) + for _, v := range slice { + v = truncate(maxSpan.AttrValueLen, v) + out = append(out, telemetry.StringValue(v)) + } + return telemetry.SliceValue(out...) + } + return telemetry.Value{} +} + +// truncate returns a truncated version of s such that it contains less than +// the limit number of characters. Truncation is applied by returning the limit +// number of valid characters contained in s. +// +// If limit is negative, it returns the original string. +// +// UTF-8 is supported. When truncating, all invalid characters are dropped +// before applying truncation. +// +// If s already contains less than the limit number of bytes, it is returned +// unchanged. No invalid characters are removed. +func truncate(limit int, s string) string { + // This prioritize performance in the following order based on the most + // common expected use-cases. + // + // - Short values less than the default limit (128). + // - Strings with valid encodings that exceed the limit. + // - No limit. + // - Strings with invalid encodings that exceed the limit. + if limit < 0 || len(s) <= limit { + return s + } + + // Optimistically, assume all valid UTF-8. + var b strings.Builder + count := 0 + for i, c := range s { + if c != utf8.RuneError { + count++ + if count > limit { + return s[:i] + } + continue + } + + _, size := utf8.DecodeRuneInString(s[i:]) + if size == 1 { + // Invalid encoding. + b.Grow(len(s) - 1) + _, _ = b.WriteString(s[:i]) + s = s[i:] + break + } + } + + // Fast-path, no invalid input. + if b.Cap() == 0 { + return s + } + + // Truncate while validating UTF-8. + for i := 0; i < len(s) && count < limit; { + c := s[i] + if c < utf8.RuneSelf { + // Optimization for single byte runes (common case). + _ = b.WriteByte(c) + i++ + count++ + continue + } + + _, size := utf8.DecodeRuneInString(s[i:]) + if size == 1 { + // We checked for all 1-byte runes above, this is a RuneError. + i++ + continue + } + + _, _ = b.WriteString(s[i : i+size]) + i += size + count++ + } + + return b.String() +} + +func (s *span) End(opts ...trace.SpanEndOption) { + if s == nil || !s.sampled.Swap(false) { + return + } + + // s.end exists so the lock (s.mu) is not held while s.ended is called. + s.ended(s.end(opts)) +} + +func (s *span) end(opts []trace.SpanEndOption) []byte { + s.mu.Lock() + defer s.mu.Unlock() + + cfg := trace.NewSpanEndConfig(opts...) + if t := cfg.Timestamp(); !t.IsZero() { + s.span.EndTime = cfg.Timestamp() + } else { + s.span.EndTime = time.Now() + } + + b, _ := json.Marshal(s.traces) // TODO: do not ignore this error. + return b +} + +// Expected to be implemented in eBPF. +// +//go:noinline +func (*span) ended(buf []byte) { ended(buf) } + +// ended is used for testing. +var ended = func([]byte) {} + +func (s *span) RecordError(err error, opts ...trace.EventOption) { + if s == nil || err == nil || !s.sampled.Load() { + return + } + + cfg := trace.NewEventConfig(opts...) + + attrs := cfg.Attributes() + attrs = append(attrs, + semconv.ExceptionType(typeStr(err)), + semconv.ExceptionMessage(err.Error()), + ) + if cfg.StackTrace() { + buf := make([]byte, 2048) + n := runtime.Stack(buf, false) + attrs = append(attrs, semconv.ExceptionStacktrace(string(buf[0:n]))) + } + + s.mu.Lock() + defer s.mu.Unlock() + + s.addEvent(semconv.ExceptionEventName, cfg.Timestamp(), attrs) +} + +func typeStr(i any) string { + t := reflect.TypeOf(i) + if t.PkgPath() == "" && t.Name() == "" { + // Likely a builtin type. + return t.String() + } + return fmt.Sprintf("%s.%s", t.PkgPath(), t.Name()) +} + +func (s *span) AddEvent(name string, opts ...trace.EventOption) { + if s == nil || !s.sampled.Load() { + return + } + + cfg := trace.NewEventConfig(opts...) + + s.mu.Lock() + defer s.mu.Unlock() + + s.addEvent(name, cfg.Timestamp(), cfg.Attributes()) +} + +// addEvent adds an event with name and attrs at tStamp to the span. The span +// lock (s.mu) needs to be held by the caller. +func (s *span) addEvent(name string, tStamp time.Time, attrs []attribute.KeyValue) { + limit := maxSpan.Events + + if limit == 0 { + s.span.DroppedEvents++ + return + } + + if limit > 0 && len(s.span.Events) == limit { + // Drop head while avoiding allocation of more capacity. + copy(s.span.Events[:limit-1], s.span.Events[1:]) + s.span.Events = s.span.Events[:limit-1] + s.span.DroppedEvents++ + } + + e := &telemetry.SpanEvent{Time: tStamp, Name: name} + e.Attrs, e.DroppedAttrs = convCappedAttrs(maxSpan.EventAttrs, attrs) + + s.span.Events = append(s.span.Events, e) +} + +func (s *span) AddLink(link trace.Link) { + if s == nil || !s.sampled.Load() { + return + } + + l := maxSpan.Links + + s.mu.Lock() + defer s.mu.Unlock() + + if l == 0 { + s.span.DroppedLinks++ + return + } + + if l > 0 && len(s.span.Links) == l { + // Drop head while avoiding allocation of more capacity. + copy(s.span.Links[:l-1], s.span.Links[1:]) + s.span.Links = s.span.Links[:l-1] + s.span.DroppedLinks++ + } + + s.span.Links = append(s.span.Links, convLink(link)) +} + +func convLinks(links []trace.Link) []*telemetry.SpanLink { + out := make([]*telemetry.SpanLink, 0, len(links)) + for _, link := range links { + out = append(out, convLink(link)) + } + return out +} + +func convLink(link trace.Link) *telemetry.SpanLink { + l := &telemetry.SpanLink{ + TraceID: telemetry.TraceID(link.SpanContext.TraceID()), + SpanID: telemetry.SpanID(link.SpanContext.SpanID()), + TraceState: link.SpanContext.TraceState().String(), + Flags: uint32(link.SpanContext.TraceFlags()), + } + l.Attrs, l.DroppedAttrs = convCappedAttrs(maxSpan.LinkAttrs, link.Attributes) + + return l +} + +func (s *span) SetName(name string) { + if s == nil || !s.sampled.Load() { + return + } + + s.mu.Lock() + defer s.mu.Unlock() + + s.span.Name = name +} + +func (*span) TracerProvider() trace.TracerProvider { return TracerProvider() } diff --git a/vendor/go.opentelemetry.io/auto/sdk/tracer.go b/vendor/go.opentelemetry.io/auto/sdk/tracer.go new file mode 100644 index 0000000000..cbcfabde3b --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/tracer.go @@ -0,0 +1,124 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sdk + +import ( + "context" + "time" + + "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" + + "go.opentelemetry.io/auto/sdk/internal/telemetry" +) + +type tracer struct { + noop.Tracer + + name, schemaURL, version string +} + +var _ trace.Tracer = tracer{} + +func (t tracer) Start(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) { + var psc trace.SpanContext + sampled := true + span := new(span) + + // Ask eBPF for sampling decision and span context info. + t.start(ctx, span, &psc, &sampled, &span.spanContext) + + span.sampled.Store(sampled) + + ctx = trace.ContextWithSpan(ctx, span) + + if sampled { + // Only build traces if sampled. + cfg := trace.NewSpanStartConfig(opts...) + span.traces, span.span = t.traces(name, cfg, span.spanContext, psc) + } + + return ctx, span +} + +// Expected to be implemented in eBPF. +// +//go:noinline +func (t *tracer) start( + ctx context.Context, + spanPtr *span, + psc *trace.SpanContext, + sampled *bool, + sc *trace.SpanContext, +) { + start(ctx, spanPtr, psc, sampled, sc) +} + +// start is used for testing. +var start = func(context.Context, *span, *trace.SpanContext, *bool, *trace.SpanContext) {} + +func (t tracer) traces(name string, cfg trace.SpanConfig, sc, psc trace.SpanContext) (*telemetry.Traces, *telemetry.Span) { + span := &telemetry.Span{ + TraceID: telemetry.TraceID(sc.TraceID()), + SpanID: telemetry.SpanID(sc.SpanID()), + Flags: uint32(sc.TraceFlags()), + TraceState: sc.TraceState().String(), + ParentSpanID: telemetry.SpanID(psc.SpanID()), + Name: name, + Kind: spanKind(cfg.SpanKind()), + } + + span.Attrs, span.DroppedAttrs = convCappedAttrs(maxSpan.Attrs, cfg.Attributes()) + + links := cfg.Links() + if limit := maxSpan.Links; limit == 0 { + span.DroppedLinks = uint32(len(links)) + } else { + if limit > 0 { + n := max(len(links)-limit, 0) + span.DroppedLinks = uint32(n) + links = links[n:] + } + span.Links = convLinks(links) + } + + if t := cfg.Timestamp(); !t.IsZero() { + span.StartTime = cfg.Timestamp() + } else { + span.StartTime = time.Now() + } + + return &telemetry.Traces{ + ResourceSpans: []*telemetry.ResourceSpans{ + { + ScopeSpans: []*telemetry.ScopeSpans{ + { + Scope: &telemetry.Scope{ + Name: t.name, + Version: t.version, + }, + Spans: []*telemetry.Span{span}, + SchemaURL: t.schemaURL, + }, + }, + }, + }, + }, span +} + +func spanKind(kind trace.SpanKind) telemetry.SpanKind { + switch kind { + case trace.SpanKindInternal: + return telemetry.SpanKindInternal + case trace.SpanKindServer: + return telemetry.SpanKindServer + case trace.SpanKindClient: + return telemetry.SpanKindClient + case trace.SpanKindProducer: + return telemetry.SpanKindProducer + case trace.SpanKindConsumer: + return telemetry.SpanKindConsumer + } + return telemetry.SpanKind(0) // undefined. +} diff --git a/vendor/go.opentelemetry.io/auto/sdk/tracer_provider.go b/vendor/go.opentelemetry.io/auto/sdk/tracer_provider.go new file mode 100644 index 0000000000..dbc477a59a --- /dev/null +++ b/vendor/go.opentelemetry.io/auto/sdk/tracer_provider.go @@ -0,0 +1,33 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sdk + +import ( + "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" +) + +// TracerProvider returns an auto-instrumentable [trace.TracerProvider]. +// +// If an [go.opentelemetry.io/auto.Instrumentation] is configured to instrument +// the process using the returned TracerProvider, all of the telemetry it +// produces will be processed and handled by that Instrumentation. By default, +// if no Instrumentation instruments the TracerProvider it will not generate +// any trace telemetry. +func TracerProvider() trace.TracerProvider { return tracerProviderInstance } + +var tracerProviderInstance = new(tracerProvider) + +type tracerProvider struct{ noop.TracerProvider } + +var _ trace.TracerProvider = tracerProvider{} + +func (p tracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.Tracer { + cfg := trace.NewTracerConfig(opts...) + return tracer{ + name: name, + version: cfg.InstrumentationVersion(), + schemaURL: cfg.SchemaURL(), + } +} diff --git a/vendor/go.opentelemetry.io/otel/.golangci.yml b/vendor/go.opentelemetry.io/otel/.golangci.yml index dbfb2a165a..ce3f40b609 100644 --- a/vendor/go.opentelemetry.io/otel/.golangci.yml +++ b/vendor/go.opentelemetry.io/otel/.golangci.yml @@ -22,6 +22,7 @@ linters: - govet - ineffassign - misspell + - perfsprint - revive - staticcheck - tenv @@ -30,6 +31,7 @@ linters: - unconvert - unused - unparam + - usestdlibvars issues: # Maximum issues count per one linter. @@ -61,10 +63,11 @@ issues: text: "calls to (.+) only in main[(][)] or init[(][)] functions" linters: - revive - # It's okay to not run gosec in a test. + # It's okay to not run gosec and perfsprint in a test. - path: _test\.go linters: - gosec + - perfsprint # Ignoring gosec G404: Use of weak random number generator (math/rand instead of crypto/rand) # as we commonly use it in tests and examples. - text: "G404:" @@ -95,6 +98,13 @@ linters-settings: - pkg: "crypto/md5" - pkg: "crypto/sha1" - pkg: "crypto/**/pkix" + auto/sdk: + files: + - "!internal/global/trace.go" + - "~internal/global/trace_test.go" + deny: + - pkg: "go.opentelemetry.io/auto/sdk" + desc: Do not use SDK from automatic instrumentation. otlp-internal: files: - "!**/exporters/otlp/internal/**/*.go" @@ -154,6 +164,12 @@ linters-settings: locale: US ignore-words: - cancelled + perfsprint: + err-error: true + errorf: true + int-conversion: true + sprintf1: true + strconcat: true revive: # Sets the default failure confidence. # This means that linting errors with less than 0.8 confidence will be ignored. diff --git a/vendor/go.opentelemetry.io/otel/CHANGELOG.md b/vendor/go.opentelemetry.io/otel/CHANGELOG.md index 8f68dbd04a..a30988f25d 100644 --- a/vendor/go.opentelemetry.io/otel/CHANGELOG.md +++ b/vendor/go.opentelemetry.io/otel/CHANGELOG.md @@ -8,6 +8,35 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [1.33.0/0.55.0/0.9.0/0.0.12] 2024-12-12 + +### Added + +- Add `Reset` method to `SpanRecorder` in `go.opentelemetry.io/otel/sdk/trace/tracetest`. (#5994) +- Add `EnabledInstrument` interface in `go.opentelemetry.io/otel/sdk/metric/internal/x`. + This is an experimental interface that is implemented by synchronous instruments provided by `go.opentelemetry.io/otel/sdk/metric`. + Users can use it to avoid performing computationally expensive operations when recording measurements. + It does not fall within the scope of the OpenTelemetry Go versioning and stability [policy](./VERSIONING.md) and it may be changed in backwards incompatible ways or removed in feature releases. (#6016) + +### Changed + +- The default global API now supports full auto-instrumentation from the `go.opentelemetry.io/auto` package. + See that package for more information. (#5920) +- Propagate non-retryable error messages to client in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#5929) +- Propagate non-retryable error messages to client in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#5929) +- Propagate non-retryable error messages to client in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#5929) +- Performance improvements for attribute value `AsStringSlice`, `AsFloat64Slice`, `AsInt64Slice`, `AsBoolSlice`. (#6011) +- Change `EnabledParameters` to have a `Severity` field instead of a getter and setter in `go.opentelemetry.io/otel/log`. (#6009) + +### Fixed + +- Fix inconsistent request body closing in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#5954) +- Fix inconsistent request body closing in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#5954) +- Fix inconsistent request body closing in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#5954) +- Fix invalid exemplar keys in `go.opentelemetry.io/otel/exporters/prometheus`. (#5995) +- Fix attribute value truncation in `go.opentelemetry.io/otel/sdk/trace`. (#5997) +- Fix attribute value truncation in `go.opentelemetry.io/otel/sdk/log`. (#6032) + @@ -3156,7 +3185,8 @@ It contains api and sdk for trace and meter. - CircleCI build CI manifest files. - CODEOWNERS file to track owners of this project. -[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.32.0...HEAD +[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.33.0...HEAD +[1.33.0/0.55.0/0.9.0/0.0.12]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.33.0 [1.32.0/0.54.0/0.8.0/0.0.11]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.32.0 [1.31.0/0.53.0/0.7.0/0.0.10]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.31.0 [1.30.0/0.52.0/0.6.0/0.0.9]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.30.0 diff --git a/vendor/go.opentelemetry.io/otel/Makefile b/vendor/go.opentelemetry.io/otel/Makefile index b8292a4fb9..a7f6d8cc68 100644 --- a/vendor/go.opentelemetry.io/otel/Makefile +++ b/vendor/go.opentelemetry.io/otel/Makefile @@ -14,8 +14,8 @@ TIMEOUT = 60 .DEFAULT_GOAL := precommit .PHONY: precommit ci -precommit: generate license-check misspell go-mod-tidy golangci-lint-fix verify-readmes verify-mods test-default -ci: generate license-check lint vanity-import-check verify-readmes verify-mods build test-default check-clean-work-tree test-coverage +precommit: generate toolchain-check license-check misspell go-mod-tidy golangci-lint-fix verify-readmes verify-mods test-default +ci: generate toolchain-check license-check lint vanity-import-check verify-readmes verify-mods build test-default check-clean-work-tree test-coverage # Tools @@ -235,6 +235,16 @@ govulncheck/%: $(GOVULNCHECK) codespell: $(CODESPELL) @$(DOCKERPY) $(CODESPELL) +.PHONY: toolchain-check +toolchain-check: + @toolchainRes=$$(for f in $(ALL_GO_MOD_DIRS); do \ + awk '/^toolchain/ { found=1; next } END { if (found) print FILENAME }' $$f/go.mod; \ + done); \ + if [ -n "$${toolchainRes}" ]; then \ + echo "toolchain checking failed:"; echo "$${toolchainRes}"; \ + exit 1; \ + fi + .PHONY: license-check license-check: @licRes=$$(for f in $$(find . -type f \( -iname '*.go' -o -iname '*.sh' \) ! -path '**/third_party/*' ! -path './.git/*' ) ; do \ diff --git a/vendor/go.opentelemetry.io/otel/VERSIONING.md b/vendor/go.opentelemetry.io/otel/VERSIONING.md index 412f1e362b..b8cb605c16 100644 --- a/vendor/go.opentelemetry.io/otel/VERSIONING.md +++ b/vendor/go.opentelemetry.io/otel/VERSIONING.md @@ -26,7 +26,7 @@ is designed so the following goals can be achieved. go.opentelemetry.io/otel/v2 v2.0.1`) and in the package import path (e.g., `import "go.opentelemetry.io/otel/v2/trace"`). This includes the paths used in `go get` commands (e.g., `go get - go.opentelemetry.io/otel/v2@v2.0.1`. Note there is both a `/v2` and a + go.opentelemetry.io/otel/v2@v2.0.1`). Note there is both a `/v2` and a `@v2.0.1` in that example. One way to think about it is that the module name now includes the `/v2`, so include `/v2` whenever you are using the module name). diff --git a/vendor/go.opentelemetry.io/otel/baggage/baggage.go b/vendor/go.opentelemetry.io/otel/baggage/baggage.go index 36f5367030..0e1fe24220 100644 --- a/vendor/go.opentelemetry.io/otel/baggage/baggage.go +++ b/vendor/go.opentelemetry.io/otel/baggage/baggage.go @@ -355,7 +355,7 @@ func parseMember(member string) (Member, error) { } // replaceInvalidUTF8Sequences replaces invalid UTF-8 sequences with '�'. -func replaceInvalidUTF8Sequences(cap int, unescapeVal string) string { +func replaceInvalidUTF8Sequences(c int, unescapeVal string) string { if utf8.ValidString(unescapeVal) { return unescapeVal } @@ -363,7 +363,7 @@ func replaceInvalidUTF8Sequences(cap int, unescapeVal string) string { // https://github.com/w3c/baggage/blob/8c215efbeebd3fa4b1aceb937a747e56444f22f3/baggage/HTTP_HEADER_FORMAT.md?plain=1#L69 var b strings.Builder - b.Grow(cap) + b.Grow(c) for i := 0; i < len(unescapeVal); { r, size := utf8.DecodeRuneInString(unescapeVal[i:]) if r == utf8.RuneError && size == 1 { diff --git a/vendor/go.opentelemetry.io/otel/codes/codes.go b/vendor/go.opentelemetry.io/otel/codes/codes.go index 2acbac3546..49a35b1225 100644 --- a/vendor/go.opentelemetry.io/otel/codes/codes.go +++ b/vendor/go.opentelemetry.io/otel/codes/codes.go @@ -5,6 +5,7 @@ package codes // import "go.opentelemetry.io/otel/codes" import ( "encoding/json" + "errors" "fmt" "strconv" ) @@ -63,7 +64,7 @@ func (c *Code) UnmarshalJSON(b []byte) error { return nil } if c == nil { - return fmt.Errorf("nil receiver passed to UnmarshalJSON") + return errors.New("nil receiver passed to UnmarshalJSON") } var x interface{} diff --git a/vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go b/vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go index 822d847947..691d96c755 100644 --- a/vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go +++ b/vendor/go.opentelemetry.io/otel/internal/attribute/attribute.go @@ -49,12 +49,11 @@ func AsBoolSlice(v interface{}) []bool { if rv.Type().Kind() != reflect.Array { return nil } - var zero bool - correctLen := rv.Len() - correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero)) - cpy := reflect.New(correctType) - _ = reflect.Copy(cpy.Elem(), rv) - return cpy.Elem().Slice(0, correctLen).Interface().([]bool) + cpy := make([]bool, rv.Len()) + if len(cpy) > 0 { + _ = reflect.Copy(reflect.ValueOf(cpy), rv) + } + return cpy } // AsInt64Slice converts an int64 array into a slice into with same elements as array. @@ -63,12 +62,11 @@ func AsInt64Slice(v interface{}) []int64 { if rv.Type().Kind() != reflect.Array { return nil } - var zero int64 - correctLen := rv.Len() - correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero)) - cpy := reflect.New(correctType) - _ = reflect.Copy(cpy.Elem(), rv) - return cpy.Elem().Slice(0, correctLen).Interface().([]int64) + cpy := make([]int64, rv.Len()) + if len(cpy) > 0 { + _ = reflect.Copy(reflect.ValueOf(cpy), rv) + } + return cpy } // AsFloat64Slice converts a float64 array into a slice into with same elements as array. @@ -77,12 +75,11 @@ func AsFloat64Slice(v interface{}) []float64 { if rv.Type().Kind() != reflect.Array { return nil } - var zero float64 - correctLen := rv.Len() - correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero)) - cpy := reflect.New(correctType) - _ = reflect.Copy(cpy.Elem(), rv) - return cpy.Elem().Slice(0, correctLen).Interface().([]float64) + cpy := make([]float64, rv.Len()) + if len(cpy) > 0 { + _ = reflect.Copy(reflect.ValueOf(cpy), rv) + } + return cpy } // AsStringSlice converts a string array into a slice into with same elements as array. @@ -91,10 +88,9 @@ func AsStringSlice(v interface{}) []string { if rv.Type().Kind() != reflect.Array { return nil } - var zero string - correctLen := rv.Len() - correctType := reflect.ArrayOf(correctLen, reflect.TypeOf(zero)) - cpy := reflect.New(correctType) - _ = reflect.Copy(cpy.Elem(), rv) - return cpy.Elem().Slice(0, correctLen).Interface().([]string) + cpy := make([]string, rv.Len()) + if len(cpy) > 0 { + _ = reflect.Copy(reflect.ValueOf(cpy), rv) + } + return cpy } diff --git a/vendor/go.opentelemetry.io/otel/internal/global/trace.go b/vendor/go.opentelemetry.io/otel/internal/global/trace.go index ac65262c65..8982aa0dc5 100644 --- a/vendor/go.opentelemetry.io/otel/internal/global/trace.go +++ b/vendor/go.opentelemetry.io/otel/internal/global/trace.go @@ -25,6 +25,7 @@ import ( "sync" "sync/atomic" + "go.opentelemetry.io/auto/sdk" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/trace" @@ -145,6 +146,30 @@ func (t *tracer) Start(ctx context.Context, name string, opts ...trace.SpanStart return delegate.(trace.Tracer).Start(ctx, name, opts...) } + return t.newSpan(ctx, autoInstEnabled, name, opts) +} + +// autoInstEnabled determines if the auto-instrumentation SDK span is returned +// from the tracer when not backed by a delegate and auto-instrumentation has +// attached to this process. +// +// The auto-instrumentation is expected to overwrite this value to true when it +// attaches. By default, this will point to false and mean a tracer will return +// a nonRecordingSpan by default. +var autoInstEnabled = new(bool) + +func (t *tracer) newSpan(ctx context.Context, autoSpan *bool, name string, opts []trace.SpanStartOption) (context.Context, trace.Span) { + // autoInstEnabled is passed to newSpan via the autoSpan parameter. This is + // so the auto-instrumentation can define a uprobe for (*t).newSpan and be + // provided with the address of the bool autoInstEnabled points to. It + // needs to be a parameter so that pointer can be reliably determined, it + // should not be read from the global. + + if *autoSpan { + tracer := sdk.TracerProvider().Tracer(t.name, t.opts...) + return tracer.Start(ctx, name, opts...) + } + s := nonRecordingSpan{sc: trace.SpanContextFromContext(ctx), tracer: t} ctx = trace.ContextWithSpan(ctx, s) return ctx, s diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/README.md b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/README.md new file mode 100644 index 0000000000..2de1fc3c6b --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/README.md @@ -0,0 +1,3 @@ +# Semconv v1.26.0 + +[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/semconv/v1.26.0)](https://pkg.go.dev/go.opentelemetry.io/otel/semconv/v1.26.0) diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/attribute_group.go b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/attribute_group.go new file mode 100644 index 0000000000..d8dc822b26 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/attribute_group.go @@ -0,0 +1,8996 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Code generated from semantic convention specification. DO NOT EDIT. + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.26.0" + +import "go.opentelemetry.io/otel/attribute" + +// The Android platform on which the Android application is running. +const ( + // AndroidOSAPILevelKey is the attribute Key conforming to the + // "android.os.api_level" semantic conventions. It represents the uniquely + // identifies the framework API revision offered by a version + // (`os.version`) of the android operating system. More information can be + // found + // [here](https://developer.android.com/guide/topics/manifest/uses-sdk-element#APILevels). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '33', '32' + AndroidOSAPILevelKey = attribute.Key("android.os.api_level") +) + +// AndroidOSAPILevel returns an attribute KeyValue conforming to the +// "android.os.api_level" semantic conventions. It represents the uniquely +// identifies the framework API revision offered by a version (`os.version`) of +// the android operating system. More information can be found +// [here](https://developer.android.com/guide/topics/manifest/uses-sdk-element#APILevels). +func AndroidOSAPILevel(val string) attribute.KeyValue { + return AndroidOSAPILevelKey.String(val) +} + +// ASP.NET Core attributes +const ( + // AspnetcoreRateLimitingResultKey is the attribute Key conforming to the + // "aspnetcore.rate_limiting.result" semantic conventions. It represents + // the rate-limiting result, shows whether the lease was acquired or + // contains a rejection reason + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + // Examples: 'acquired', 'request_canceled' + AspnetcoreRateLimitingResultKey = attribute.Key("aspnetcore.rate_limiting.result") + + // AspnetcoreDiagnosticsHandlerTypeKey is the attribute Key conforming to + // the "aspnetcore.diagnostics.handler.type" semantic conventions. It + // represents the full type name of the + // [`IExceptionHandler`](https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.diagnostics.iexceptionhandler) + // implementation that handled the exception. + // + // Type: string + // RequirementLevel: ConditionallyRequired (if and only if the exception + // was handled by this handler.) + // Stability: stable + // Examples: 'Contoso.MyHandler' + AspnetcoreDiagnosticsHandlerTypeKey = attribute.Key("aspnetcore.diagnostics.handler.type") + + // AspnetcoreDiagnosticsExceptionResultKey is the attribute Key conforming + // to the "aspnetcore.diagnostics.exception.result" semantic conventions. + // It represents the aSP.NET Core exception middleware handling result + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'handled', 'unhandled' + AspnetcoreDiagnosticsExceptionResultKey = attribute.Key("aspnetcore.diagnostics.exception.result") + + // AspnetcoreRateLimitingPolicyKey is the attribute Key conforming to the + // "aspnetcore.rate_limiting.policy" semantic conventions. It represents + // the rate limiting policy name. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'fixed', 'sliding', 'token' + AspnetcoreRateLimitingPolicyKey = attribute.Key("aspnetcore.rate_limiting.policy") + + // AspnetcoreRequestIsUnhandledKey is the attribute Key conforming to the + // "aspnetcore.request.is_unhandled" semantic conventions. It represents + // the flag indicating if request was handled by the application pipeline. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + // Examples: True + AspnetcoreRequestIsUnhandledKey = attribute.Key("aspnetcore.request.is_unhandled") + + // AspnetcoreRoutingIsFallbackKey is the attribute Key conforming to the + // "aspnetcore.routing.is_fallback" semantic conventions. It represents a + // value that indicates whether the matched route is a fallback route. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + // Examples: True + AspnetcoreRoutingIsFallbackKey = attribute.Key("aspnetcore.routing.is_fallback") + + // AspnetcoreRoutingMatchStatusKey is the attribute Key conforming to the + // "aspnetcore.routing.match_status" semantic conventions. It represents + // the match result - success or failure + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'success', 'failure' + AspnetcoreRoutingMatchStatusKey = attribute.Key("aspnetcore.routing.match_status") +) + +var ( + // Lease was acquired + AspnetcoreRateLimitingResultAcquired = AspnetcoreRateLimitingResultKey.String("acquired") + // Lease request was rejected by the endpoint limiter + AspnetcoreRateLimitingResultEndpointLimiter = AspnetcoreRateLimitingResultKey.String("endpoint_limiter") + // Lease request was rejected by the global limiter + AspnetcoreRateLimitingResultGlobalLimiter = AspnetcoreRateLimitingResultKey.String("global_limiter") + // Lease request was canceled + AspnetcoreRateLimitingResultRequestCanceled = AspnetcoreRateLimitingResultKey.String("request_canceled") +) + +var ( + // Exception was handled by the exception handling middleware + AspnetcoreDiagnosticsExceptionResultHandled = AspnetcoreDiagnosticsExceptionResultKey.String("handled") + // Exception was not handled by the exception handling middleware + AspnetcoreDiagnosticsExceptionResultUnhandled = AspnetcoreDiagnosticsExceptionResultKey.String("unhandled") + // Exception handling was skipped because the response had started + AspnetcoreDiagnosticsExceptionResultSkipped = AspnetcoreDiagnosticsExceptionResultKey.String("skipped") + // Exception handling didn't run because the request was aborted + AspnetcoreDiagnosticsExceptionResultAborted = AspnetcoreDiagnosticsExceptionResultKey.String("aborted") +) + +var ( + // Match succeeded + AspnetcoreRoutingMatchStatusSuccess = AspnetcoreRoutingMatchStatusKey.String("success") + // Match failed + AspnetcoreRoutingMatchStatusFailure = AspnetcoreRoutingMatchStatusKey.String("failure") +) + +// AspnetcoreDiagnosticsHandlerType returns an attribute KeyValue conforming +// to the "aspnetcore.diagnostics.handler.type" semantic conventions. It +// represents the full type name of the +// [`IExceptionHandler`](https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.diagnostics.iexceptionhandler) +// implementation that handled the exception. +func AspnetcoreDiagnosticsHandlerType(val string) attribute.KeyValue { + return AspnetcoreDiagnosticsHandlerTypeKey.String(val) +} + +// AspnetcoreRateLimitingPolicy returns an attribute KeyValue conforming to +// the "aspnetcore.rate_limiting.policy" semantic conventions. It represents +// the rate limiting policy name. +func AspnetcoreRateLimitingPolicy(val string) attribute.KeyValue { + return AspnetcoreRateLimitingPolicyKey.String(val) +} + +// AspnetcoreRequestIsUnhandled returns an attribute KeyValue conforming to +// the "aspnetcore.request.is_unhandled" semantic conventions. It represents +// the flag indicating if request was handled by the application pipeline. +func AspnetcoreRequestIsUnhandled(val bool) attribute.KeyValue { + return AspnetcoreRequestIsUnhandledKey.Bool(val) +} + +// AspnetcoreRoutingIsFallback returns an attribute KeyValue conforming to +// the "aspnetcore.routing.is_fallback" semantic conventions. It represents a +// value that indicates whether the matched route is a fallback route. +func AspnetcoreRoutingIsFallback(val bool) attribute.KeyValue { + return AspnetcoreRoutingIsFallbackKey.Bool(val) +} + +// Generic attributes for AWS services. +const ( + // AWSRequestIDKey is the attribute Key conforming to the "aws.request_id" + // semantic conventions. It represents the AWS request ID as returned in + // the response headers `x-amz-request-id` or `x-amz-requestid`. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '79b9da39-b7ae-508a-a6bc-864b2829c622', 'C9ER4AJX75574TDJ' + AWSRequestIDKey = attribute.Key("aws.request_id") +) + +// AWSRequestID returns an attribute KeyValue conforming to the +// "aws.request_id" semantic conventions. It represents the AWS request ID as +// returned in the response headers `x-amz-request-id` or `x-amz-requestid`. +func AWSRequestID(val string) attribute.KeyValue { + return AWSRequestIDKey.String(val) +} + +// Attributes for AWS DynamoDB. +const ( + // AWSDynamoDBAttributeDefinitionsKey is the attribute Key conforming to + // the "aws.dynamodb.attribute_definitions" semantic conventions. It + // represents the JSON-serialized value of each item in the + // `AttributeDefinitions` request field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: '{ "AttributeName": "string", "AttributeType": "string" }' + AWSDynamoDBAttributeDefinitionsKey = attribute.Key("aws.dynamodb.attribute_definitions") + + // AWSDynamoDBAttributesToGetKey is the attribute Key conforming to the + // "aws.dynamodb.attributes_to_get" semantic conventions. It represents the + // value of the `AttributesToGet` request parameter. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'lives', 'id' + AWSDynamoDBAttributesToGetKey = attribute.Key("aws.dynamodb.attributes_to_get") + + // AWSDynamoDBConsistentReadKey is the attribute Key conforming to the + // "aws.dynamodb.consistent_read" semantic conventions. It represents the + // value of the `ConsistentRead` request parameter. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + AWSDynamoDBConsistentReadKey = attribute.Key("aws.dynamodb.consistent_read") + + // AWSDynamoDBConsumedCapacityKey is the attribute Key conforming to the + // "aws.dynamodb.consumed_capacity" semantic conventions. It represents the + // JSON-serialized value of each item in the `ConsumedCapacity` response + // field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: '{ "CapacityUnits": number, "GlobalSecondaryIndexes": { + // "string" : { "CapacityUnits": number, "ReadCapacityUnits": number, + // "WriteCapacityUnits": number } }, "LocalSecondaryIndexes": { "string" : + // { "CapacityUnits": number, "ReadCapacityUnits": number, + // "WriteCapacityUnits": number } }, "ReadCapacityUnits": number, "Table": + // { "CapacityUnits": number, "ReadCapacityUnits": number, + // "WriteCapacityUnits": number }, "TableName": "string", + // "WriteCapacityUnits": number }' + AWSDynamoDBConsumedCapacityKey = attribute.Key("aws.dynamodb.consumed_capacity") + + // AWSDynamoDBCountKey is the attribute Key conforming to the + // "aws.dynamodb.count" semantic conventions. It represents the value of + // the `Count` response parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 10 + AWSDynamoDBCountKey = attribute.Key("aws.dynamodb.count") + + // AWSDynamoDBExclusiveStartTableKey is the attribute Key conforming to the + // "aws.dynamodb.exclusive_start_table" semantic conventions. It represents + // the value of the `ExclusiveStartTableName` request parameter. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Users', 'CatsTable' + AWSDynamoDBExclusiveStartTableKey = attribute.Key("aws.dynamodb.exclusive_start_table") + + // AWSDynamoDBGlobalSecondaryIndexUpdatesKey is the attribute Key + // conforming to the "aws.dynamodb.global_secondary_index_updates" semantic + // conventions. It represents the JSON-serialized value of each item in the + // `GlobalSecondaryIndexUpdates` request field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: '{ "Create": { "IndexName": "string", "KeySchema": [ { + // "AttributeName": "string", "KeyType": "string" } ], "Projection": { + // "NonKeyAttributes": [ "string" ], "ProjectionType": "string" }, + // "ProvisionedThroughput": { "ReadCapacityUnits": number, + // "WriteCapacityUnits": number } }' + AWSDynamoDBGlobalSecondaryIndexUpdatesKey = attribute.Key("aws.dynamodb.global_secondary_index_updates") + + // AWSDynamoDBGlobalSecondaryIndexesKey is the attribute Key conforming to + // the "aws.dynamodb.global_secondary_indexes" semantic conventions. It + // represents the JSON-serialized value of each item of the + // `GlobalSecondaryIndexes` request field + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: '{ "IndexName": "string", "KeySchema": [ { "AttributeName": + // "string", "KeyType": "string" } ], "Projection": { "NonKeyAttributes": [ + // "string" ], "ProjectionType": "string" }, "ProvisionedThroughput": { + // "ReadCapacityUnits": number, "WriteCapacityUnits": number } }' + AWSDynamoDBGlobalSecondaryIndexesKey = attribute.Key("aws.dynamodb.global_secondary_indexes") + + // AWSDynamoDBIndexNameKey is the attribute Key conforming to the + // "aws.dynamodb.index_name" semantic conventions. It represents the value + // of the `IndexName` request parameter. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'name_to_group' + AWSDynamoDBIndexNameKey = attribute.Key("aws.dynamodb.index_name") + + // AWSDynamoDBItemCollectionMetricsKey is the attribute Key conforming to + // the "aws.dynamodb.item_collection_metrics" semantic conventions. It + // represents the JSON-serialized value of the `ItemCollectionMetrics` + // response field. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '{ "string" : [ { "ItemCollectionKey": { "string" : { "B": + // blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { + // "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], + // "NULL": boolean, "S": "string", "SS": [ "string" ] } }, + // "SizeEstimateRangeGB": [ number ] } ] }' + AWSDynamoDBItemCollectionMetricsKey = attribute.Key("aws.dynamodb.item_collection_metrics") + + // AWSDynamoDBLimitKey is the attribute Key conforming to the + // "aws.dynamodb.limit" semantic conventions. It represents the value of + // the `Limit` request parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 10 + AWSDynamoDBLimitKey = attribute.Key("aws.dynamodb.limit") + + // AWSDynamoDBLocalSecondaryIndexesKey is the attribute Key conforming to + // the "aws.dynamodb.local_secondary_indexes" semantic conventions. It + // represents the JSON-serialized value of each item of the + // `LocalSecondaryIndexes` request field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: '{ "IndexARN": "string", "IndexName": "string", + // "IndexSizeBytes": number, "ItemCount": number, "KeySchema": [ { + // "AttributeName": "string", "KeyType": "string" } ], "Projection": { + // "NonKeyAttributes": [ "string" ], "ProjectionType": "string" } }' + AWSDynamoDBLocalSecondaryIndexesKey = attribute.Key("aws.dynamodb.local_secondary_indexes") + + // AWSDynamoDBProjectionKey is the attribute Key conforming to the + // "aws.dynamodb.projection" semantic conventions. It represents the value + // of the `ProjectionExpression` request parameter. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Title', 'Title, Price, Color', 'Title, Description, + // RelatedItems, ProductReviews' + AWSDynamoDBProjectionKey = attribute.Key("aws.dynamodb.projection") + + // AWSDynamoDBProvisionedReadCapacityKey is the attribute Key conforming to + // the "aws.dynamodb.provisioned_read_capacity" semantic conventions. It + // represents the value of the `ProvisionedThroughput.ReadCapacityUnits` + // request parameter. + // + // Type: double + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1.0, 2.0 + AWSDynamoDBProvisionedReadCapacityKey = attribute.Key("aws.dynamodb.provisioned_read_capacity") + + // AWSDynamoDBProvisionedWriteCapacityKey is the attribute Key conforming + // to the "aws.dynamodb.provisioned_write_capacity" semantic conventions. + // It represents the value of the + // `ProvisionedThroughput.WriteCapacityUnits` request parameter. + // + // Type: double + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1.0, 2.0 + AWSDynamoDBProvisionedWriteCapacityKey = attribute.Key("aws.dynamodb.provisioned_write_capacity") + + // AWSDynamoDBScanForwardKey is the attribute Key conforming to the + // "aws.dynamodb.scan_forward" semantic conventions. It represents the + // value of the `ScanIndexForward` request parameter. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + AWSDynamoDBScanForwardKey = attribute.Key("aws.dynamodb.scan_forward") + + // AWSDynamoDBScannedCountKey is the attribute Key conforming to the + // "aws.dynamodb.scanned_count" semantic conventions. It represents the + // value of the `ScannedCount` response parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 50 + AWSDynamoDBScannedCountKey = attribute.Key("aws.dynamodb.scanned_count") + + // AWSDynamoDBSegmentKey is the attribute Key conforming to the + // "aws.dynamodb.segment" semantic conventions. It represents the value of + // the `Segment` request parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 10 + AWSDynamoDBSegmentKey = attribute.Key("aws.dynamodb.segment") + + // AWSDynamoDBSelectKey is the attribute Key conforming to the + // "aws.dynamodb.select" semantic conventions. It represents the value of + // the `Select` request parameter. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'ALL_ATTRIBUTES', 'COUNT' + AWSDynamoDBSelectKey = attribute.Key("aws.dynamodb.select") + + // AWSDynamoDBTableCountKey is the attribute Key conforming to the + // "aws.dynamodb.table_count" semantic conventions. It represents the + // number of items in the `TableNames` response parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 20 + AWSDynamoDBTableCountKey = attribute.Key("aws.dynamodb.table_count") + + // AWSDynamoDBTableNamesKey is the attribute Key conforming to the + // "aws.dynamodb.table_names" semantic conventions. It represents the keys + // in the `RequestItems` object field. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Users', 'Cats' + AWSDynamoDBTableNamesKey = attribute.Key("aws.dynamodb.table_names") + + // AWSDynamoDBTotalSegmentsKey is the attribute Key conforming to the + // "aws.dynamodb.total_segments" semantic conventions. It represents the + // value of the `TotalSegments` request parameter. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 100 + AWSDynamoDBTotalSegmentsKey = attribute.Key("aws.dynamodb.total_segments") +) + +// AWSDynamoDBAttributeDefinitions returns an attribute KeyValue conforming +// to the "aws.dynamodb.attribute_definitions" semantic conventions. It +// represents the JSON-serialized value of each item in the +// `AttributeDefinitions` request field. +func AWSDynamoDBAttributeDefinitions(val ...string) attribute.KeyValue { + return AWSDynamoDBAttributeDefinitionsKey.StringSlice(val) +} + +// AWSDynamoDBAttributesToGet returns an attribute KeyValue conforming to +// the "aws.dynamodb.attributes_to_get" semantic conventions. It represents the +// value of the `AttributesToGet` request parameter. +func AWSDynamoDBAttributesToGet(val ...string) attribute.KeyValue { + return AWSDynamoDBAttributesToGetKey.StringSlice(val) +} + +// AWSDynamoDBConsistentRead returns an attribute KeyValue conforming to the +// "aws.dynamodb.consistent_read" semantic conventions. It represents the value +// of the `ConsistentRead` request parameter. +func AWSDynamoDBConsistentRead(val bool) attribute.KeyValue { + return AWSDynamoDBConsistentReadKey.Bool(val) +} + +// AWSDynamoDBConsumedCapacity returns an attribute KeyValue conforming to +// the "aws.dynamodb.consumed_capacity" semantic conventions. It represents the +// JSON-serialized value of each item in the `ConsumedCapacity` response field. +func AWSDynamoDBConsumedCapacity(val ...string) attribute.KeyValue { + return AWSDynamoDBConsumedCapacityKey.StringSlice(val) +} + +// AWSDynamoDBCount returns an attribute KeyValue conforming to the +// "aws.dynamodb.count" semantic conventions. It represents the value of the +// `Count` response parameter. +func AWSDynamoDBCount(val int) attribute.KeyValue { + return AWSDynamoDBCountKey.Int(val) +} + +// AWSDynamoDBExclusiveStartTable returns an attribute KeyValue conforming +// to the "aws.dynamodb.exclusive_start_table" semantic conventions. It +// represents the value of the `ExclusiveStartTableName` request parameter. +func AWSDynamoDBExclusiveStartTable(val string) attribute.KeyValue { + return AWSDynamoDBExclusiveStartTableKey.String(val) +} + +// AWSDynamoDBGlobalSecondaryIndexUpdates returns an attribute KeyValue +// conforming to the "aws.dynamodb.global_secondary_index_updates" semantic +// conventions. It represents the JSON-serialized value of each item in the +// `GlobalSecondaryIndexUpdates` request field. +func AWSDynamoDBGlobalSecondaryIndexUpdates(val ...string) attribute.KeyValue { + return AWSDynamoDBGlobalSecondaryIndexUpdatesKey.StringSlice(val) +} + +// AWSDynamoDBGlobalSecondaryIndexes returns an attribute KeyValue +// conforming to the "aws.dynamodb.global_secondary_indexes" semantic +// conventions. It represents the JSON-serialized value of each item of the +// `GlobalSecondaryIndexes` request field +func AWSDynamoDBGlobalSecondaryIndexes(val ...string) attribute.KeyValue { + return AWSDynamoDBGlobalSecondaryIndexesKey.StringSlice(val) +} + +// AWSDynamoDBIndexName returns an attribute KeyValue conforming to the +// "aws.dynamodb.index_name" semantic conventions. It represents the value of +// the `IndexName` request parameter. +func AWSDynamoDBIndexName(val string) attribute.KeyValue { + return AWSDynamoDBIndexNameKey.String(val) +} + +// AWSDynamoDBItemCollectionMetrics returns an attribute KeyValue conforming +// to the "aws.dynamodb.item_collection_metrics" semantic conventions. It +// represents the JSON-serialized value of the `ItemCollectionMetrics` response +// field. +func AWSDynamoDBItemCollectionMetrics(val string) attribute.KeyValue { + return AWSDynamoDBItemCollectionMetricsKey.String(val) +} + +// AWSDynamoDBLimit returns an attribute KeyValue conforming to the +// "aws.dynamodb.limit" semantic conventions. It represents the value of the +// `Limit` request parameter. +func AWSDynamoDBLimit(val int) attribute.KeyValue { + return AWSDynamoDBLimitKey.Int(val) +} + +// AWSDynamoDBLocalSecondaryIndexes returns an attribute KeyValue conforming +// to the "aws.dynamodb.local_secondary_indexes" semantic conventions. It +// represents the JSON-serialized value of each item of the +// `LocalSecondaryIndexes` request field. +func AWSDynamoDBLocalSecondaryIndexes(val ...string) attribute.KeyValue { + return AWSDynamoDBLocalSecondaryIndexesKey.StringSlice(val) +} + +// AWSDynamoDBProjection returns an attribute KeyValue conforming to the +// "aws.dynamodb.projection" semantic conventions. It represents the value of +// the `ProjectionExpression` request parameter. +func AWSDynamoDBProjection(val string) attribute.KeyValue { + return AWSDynamoDBProjectionKey.String(val) +} + +// AWSDynamoDBProvisionedReadCapacity returns an attribute KeyValue +// conforming to the "aws.dynamodb.provisioned_read_capacity" semantic +// conventions. It represents the value of the +// `ProvisionedThroughput.ReadCapacityUnits` request parameter. +func AWSDynamoDBProvisionedReadCapacity(val float64) attribute.KeyValue { + return AWSDynamoDBProvisionedReadCapacityKey.Float64(val) +} + +// AWSDynamoDBProvisionedWriteCapacity returns an attribute KeyValue +// conforming to the "aws.dynamodb.provisioned_write_capacity" semantic +// conventions. It represents the value of the +// `ProvisionedThroughput.WriteCapacityUnits` request parameter. +func AWSDynamoDBProvisionedWriteCapacity(val float64) attribute.KeyValue { + return AWSDynamoDBProvisionedWriteCapacityKey.Float64(val) +} + +// AWSDynamoDBScanForward returns an attribute KeyValue conforming to the +// "aws.dynamodb.scan_forward" semantic conventions. It represents the value of +// the `ScanIndexForward` request parameter. +func AWSDynamoDBScanForward(val bool) attribute.KeyValue { + return AWSDynamoDBScanForwardKey.Bool(val) +} + +// AWSDynamoDBScannedCount returns an attribute KeyValue conforming to the +// "aws.dynamodb.scanned_count" semantic conventions. It represents the value +// of the `ScannedCount` response parameter. +func AWSDynamoDBScannedCount(val int) attribute.KeyValue { + return AWSDynamoDBScannedCountKey.Int(val) +} + +// AWSDynamoDBSegment returns an attribute KeyValue conforming to the +// "aws.dynamodb.segment" semantic conventions. It represents the value of the +// `Segment` request parameter. +func AWSDynamoDBSegment(val int) attribute.KeyValue { + return AWSDynamoDBSegmentKey.Int(val) +} + +// AWSDynamoDBSelect returns an attribute KeyValue conforming to the +// "aws.dynamodb.select" semantic conventions. It represents the value of the +// `Select` request parameter. +func AWSDynamoDBSelect(val string) attribute.KeyValue { + return AWSDynamoDBSelectKey.String(val) +} + +// AWSDynamoDBTableCount returns an attribute KeyValue conforming to the +// "aws.dynamodb.table_count" semantic conventions. It represents the number of +// items in the `TableNames` response parameter. +func AWSDynamoDBTableCount(val int) attribute.KeyValue { + return AWSDynamoDBTableCountKey.Int(val) +} + +// AWSDynamoDBTableNames returns an attribute KeyValue conforming to the +// "aws.dynamodb.table_names" semantic conventions. It represents the keys in +// the `RequestItems` object field. +func AWSDynamoDBTableNames(val ...string) attribute.KeyValue { + return AWSDynamoDBTableNamesKey.StringSlice(val) +} + +// AWSDynamoDBTotalSegments returns an attribute KeyValue conforming to the +// "aws.dynamodb.total_segments" semantic conventions. It represents the value +// of the `TotalSegments` request parameter. +func AWSDynamoDBTotalSegments(val int) attribute.KeyValue { + return AWSDynamoDBTotalSegmentsKey.Int(val) +} + +// Attributes for AWS Elastic Container Service (ECS). +const ( + // AWSECSTaskIDKey is the attribute Key conforming to the "aws.ecs.task.id" + // semantic conventions. It represents the ID of a running ECS task. The ID + // MUST be extracted from `task.arn`. + // + // Type: string + // RequirementLevel: ConditionallyRequired (If and only if `task.arn` is + // populated.) + // Stability: experimental + // Examples: '10838bed-421f-43ef-870a-f43feacbbb5b', + // '23ebb8ac-c18f-46c6-8bbe-d55d0e37cfbd' + AWSECSTaskIDKey = attribute.Key("aws.ecs.task.id") + + // AWSECSClusterARNKey is the attribute Key conforming to the + // "aws.ecs.cluster.arn" semantic conventions. It represents the ARN of an + // [ECS + // cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster' + AWSECSClusterARNKey = attribute.Key("aws.ecs.cluster.arn") + + // AWSECSContainerARNKey is the attribute Key conforming to the + // "aws.ecs.container.arn" semantic conventions. It represents the Amazon + // Resource Name (ARN) of an [ECS container + // instance](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_instances.html). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // 'arn:aws:ecs:us-west-1:123456789123:container/32624152-9086-4f0e-acae-1a75b14fe4d9' + AWSECSContainerARNKey = attribute.Key("aws.ecs.container.arn") + + // AWSECSLaunchtypeKey is the attribute Key conforming to the + // "aws.ecs.launchtype" semantic conventions. It represents the [launch + // type](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html) + // for an ECS task. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + AWSECSLaunchtypeKey = attribute.Key("aws.ecs.launchtype") + + // AWSECSTaskARNKey is the attribute Key conforming to the + // "aws.ecs.task.arn" semantic conventions. It represents the ARN of a + // running [ECS + // task](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // 'arn:aws:ecs:us-west-1:123456789123:task/10838bed-421f-43ef-870a-f43feacbbb5b', + // 'arn:aws:ecs:us-west-1:123456789123:task/my-cluster/task-id/23ebb8ac-c18f-46c6-8bbe-d55d0e37cfbd' + AWSECSTaskARNKey = attribute.Key("aws.ecs.task.arn") + + // AWSECSTaskFamilyKey is the attribute Key conforming to the + // "aws.ecs.task.family" semantic conventions. It represents the family + // name of the [ECS task + // definition](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html) + // used to create the ECS task. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry-family' + AWSECSTaskFamilyKey = attribute.Key("aws.ecs.task.family") + + // AWSECSTaskRevisionKey is the attribute Key conforming to the + // "aws.ecs.task.revision" semantic conventions. It represents the revision + // for the task definition used to create the ECS task. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '8', '26' + AWSECSTaskRevisionKey = attribute.Key("aws.ecs.task.revision") +) + +var ( + // ec2 + AWSECSLaunchtypeEC2 = AWSECSLaunchtypeKey.String("ec2") + // fargate + AWSECSLaunchtypeFargate = AWSECSLaunchtypeKey.String("fargate") +) + +// AWSECSTaskID returns an attribute KeyValue conforming to the +// "aws.ecs.task.id" semantic conventions. It represents the ID of a running +// ECS task. The ID MUST be extracted from `task.arn`. +func AWSECSTaskID(val string) attribute.KeyValue { + return AWSECSTaskIDKey.String(val) +} + +// AWSECSClusterARN returns an attribute KeyValue conforming to the +// "aws.ecs.cluster.arn" semantic conventions. It represents the ARN of an [ECS +// cluster](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/clusters.html). +func AWSECSClusterARN(val string) attribute.KeyValue { + return AWSECSClusterARNKey.String(val) +} + +// AWSECSContainerARN returns an attribute KeyValue conforming to the +// "aws.ecs.container.arn" semantic conventions. It represents the Amazon +// Resource Name (ARN) of an [ECS container +// instance](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_instances.html). +func AWSECSContainerARN(val string) attribute.KeyValue { + return AWSECSContainerARNKey.String(val) +} + +// AWSECSTaskARN returns an attribute KeyValue conforming to the +// "aws.ecs.task.arn" semantic conventions. It represents the ARN of a running +// [ECS +// task](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids). +func AWSECSTaskARN(val string) attribute.KeyValue { + return AWSECSTaskARNKey.String(val) +} + +// AWSECSTaskFamily returns an attribute KeyValue conforming to the +// "aws.ecs.task.family" semantic conventions. It represents the family name of +// the [ECS task +// definition](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definitions.html) +// used to create the ECS task. +func AWSECSTaskFamily(val string) attribute.KeyValue { + return AWSECSTaskFamilyKey.String(val) +} + +// AWSECSTaskRevision returns an attribute KeyValue conforming to the +// "aws.ecs.task.revision" semantic conventions. It represents the revision for +// the task definition used to create the ECS task. +func AWSECSTaskRevision(val string) attribute.KeyValue { + return AWSECSTaskRevisionKey.String(val) +} + +// Attributes for AWS Elastic Kubernetes Service (EKS). +const ( + // AWSEKSClusterARNKey is the attribute Key conforming to the + // "aws.eks.cluster.arn" semantic conventions. It represents the ARN of an + // EKS cluster. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'arn:aws:ecs:us-west-2:123456789123:cluster/my-cluster' + AWSEKSClusterARNKey = attribute.Key("aws.eks.cluster.arn") +) + +// AWSEKSClusterARN returns an attribute KeyValue conforming to the +// "aws.eks.cluster.arn" semantic conventions. It represents the ARN of an EKS +// cluster. +func AWSEKSClusterARN(val string) attribute.KeyValue { + return AWSEKSClusterARNKey.String(val) +} + +// Attributes for AWS Logs. +const ( + // AWSLogGroupARNsKey is the attribute Key conforming to the + // "aws.log.group.arns" semantic conventions. It represents the Amazon + // Resource Name(s) (ARN) of the AWS log group(s). + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // 'arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:*' + // Note: See the [log group ARN format + // documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format). + AWSLogGroupARNsKey = attribute.Key("aws.log.group.arns") + + // AWSLogGroupNamesKey is the attribute Key conforming to the + // "aws.log.group.names" semantic conventions. It represents the name(s) of + // the AWS log group(s) an application is writing to. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/aws/lambda/my-function', 'opentelemetry-service' + // Note: Multiple log groups must be supported for cases like + // multi-container applications, where a single application has sidecar + // containers, and each write to their own log group. + AWSLogGroupNamesKey = attribute.Key("aws.log.group.names") + + // AWSLogStreamARNsKey is the attribute Key conforming to the + // "aws.log.stream.arns" semantic conventions. It represents the ARN(s) of + // the AWS log stream(s). + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // 'arn:aws:logs:us-west-1:123456789012:log-group:/aws/my/group:log-stream:logs/main/10838bed-421f-43ef-870a-f43feacbbb5b' + // Note: See the [log stream ARN format + // documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html#CWL_ARN_Format). + // One log group can contain several log streams, so these ARNs necessarily + // identify both a log group and a log stream. + AWSLogStreamARNsKey = attribute.Key("aws.log.stream.arns") + + // AWSLogStreamNamesKey is the attribute Key conforming to the + // "aws.log.stream.names" semantic conventions. It represents the name(s) + // of the AWS log stream(s) an application is writing to. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'logs/main/10838bed-421f-43ef-870a-f43feacbbb5b' + AWSLogStreamNamesKey = attribute.Key("aws.log.stream.names") +) + +// AWSLogGroupARNs returns an attribute KeyValue conforming to the +// "aws.log.group.arns" semantic conventions. It represents the Amazon Resource +// Name(s) (ARN) of the AWS log group(s). +func AWSLogGroupARNs(val ...string) attribute.KeyValue { + return AWSLogGroupARNsKey.StringSlice(val) +} + +// AWSLogGroupNames returns an attribute KeyValue conforming to the +// "aws.log.group.names" semantic conventions. It represents the name(s) of the +// AWS log group(s) an application is writing to. +func AWSLogGroupNames(val ...string) attribute.KeyValue { + return AWSLogGroupNamesKey.StringSlice(val) +} + +// AWSLogStreamARNs returns an attribute KeyValue conforming to the +// "aws.log.stream.arns" semantic conventions. It represents the ARN(s) of the +// AWS log stream(s). +func AWSLogStreamARNs(val ...string) attribute.KeyValue { + return AWSLogStreamARNsKey.StringSlice(val) +} + +// AWSLogStreamNames returns an attribute KeyValue conforming to the +// "aws.log.stream.names" semantic conventions. It represents the name(s) of +// the AWS log stream(s) an application is writing to. +func AWSLogStreamNames(val ...string) attribute.KeyValue { + return AWSLogStreamNamesKey.StringSlice(val) +} + +// Attributes for AWS Lambda. +const ( + // AWSLambdaInvokedARNKey is the attribute Key conforming to the + // "aws.lambda.invoked_arn" semantic conventions. It represents the full + // invoked ARN as provided on the `Context` passed to the function + // (`Lambda-Runtime-Invoked-Function-ARN` header on the + // `/runtime/invocation/next` applicable). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'arn:aws:lambda:us-east-1:123456:function:myfunction:myalias' + // Note: This may be different from `cloud.resource_id` if an alias is + // involved. + AWSLambdaInvokedARNKey = attribute.Key("aws.lambda.invoked_arn") +) + +// AWSLambdaInvokedARN returns an attribute KeyValue conforming to the +// "aws.lambda.invoked_arn" semantic conventions. It represents the full +// invoked ARN as provided on the `Context` passed to the function +// (`Lambda-Runtime-Invoked-Function-ARN` header on the +// `/runtime/invocation/next` applicable). +func AWSLambdaInvokedARN(val string) attribute.KeyValue { + return AWSLambdaInvokedARNKey.String(val) +} + +// Attributes for AWS S3. +const ( + // AWSS3BucketKey is the attribute Key conforming to the "aws.s3.bucket" + // semantic conventions. It represents the S3 bucket name the request + // refers to. Corresponds to the `--bucket` parameter of the [S3 + // API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) + // operations. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'some-bucket-name' + // Note: The `bucket` attribute is applicable to all S3 operations that + // reference a bucket, i.e. that require the bucket name as a mandatory + // parameter. + // This applies to almost all S3 operations except `list-buckets`. + AWSS3BucketKey = attribute.Key("aws.s3.bucket") + + // AWSS3CopySourceKey is the attribute Key conforming to the + // "aws.s3.copy_source" semantic conventions. It represents the source + // object (in the form `bucket`/`key`) for the copy operation. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'someFile.yml' + // Note: The `copy_source` attribute applies to S3 copy operations and + // corresponds to the `--copy-source` parameter + // of the [copy-object operation within the S3 + // API](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html). + // This applies in particular to the following operations: + // + // - + // [copy-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html) + // - + // [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) + AWSS3CopySourceKey = attribute.Key("aws.s3.copy_source") + + // AWSS3DeleteKey is the attribute Key conforming to the "aws.s3.delete" + // semantic conventions. It represents the delete request container that + // specifies the objects to be deleted. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // 'Objects=[{Key=string,VersionID=string},{Key=string,VersionID=string}],Quiet=boolean' + // Note: The `delete` attribute is only applicable to the + // [delete-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html) + // operation. + // The `delete` attribute corresponds to the `--delete` parameter of the + // [delete-objects operation within the S3 + // API](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-objects.html). + AWSS3DeleteKey = attribute.Key("aws.s3.delete") + + // AWSS3KeyKey is the attribute Key conforming to the "aws.s3.key" semantic + // conventions. It represents the S3 object key the request refers to. + // Corresponds to the `--key` parameter of the [S3 + // API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) + // operations. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'someFile.yml' + // Note: The `key` attribute is applicable to all object-related S3 + // operations, i.e. that require the object key as a mandatory parameter. + // This applies in particular to the following operations: + // + // - + // [copy-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/copy-object.html) + // - + // [delete-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/delete-object.html) + // - + // [get-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/get-object.html) + // - + // [head-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/head-object.html) + // - + // [put-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object.html) + // - + // [restore-object](https://docs.aws.amazon.com/cli/latest/reference/s3api/restore-object.html) + // - + // [select-object-content](https://docs.aws.amazon.com/cli/latest/reference/s3api/select-object-content.html) + // - + // [abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html) + // - + // [complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html) + // - + // [create-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/create-multipart-upload.html) + // - + // [list-parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html) + // - + // [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html) + // - + // [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) + AWSS3KeyKey = attribute.Key("aws.s3.key") + + // AWSS3PartNumberKey is the attribute Key conforming to the + // "aws.s3.part_number" semantic conventions. It represents the part number + // of the part being uploaded in a multipart-upload operation. This is a + // positive integer between 1 and 10,000. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 3456 + // Note: The `part_number` attribute is only applicable to the + // [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html) + // and + // [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) + // operations. + // The `part_number` attribute corresponds to the `--part-number` parameter + // of the + // [upload-part operation within the S3 + // API](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html). + AWSS3PartNumberKey = attribute.Key("aws.s3.part_number") + + // AWSS3UploadIDKey is the attribute Key conforming to the + // "aws.s3.upload_id" semantic conventions. It represents the upload ID + // that identifies the multipart upload. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'dfRtDYWFbkRONycy.Yxwh66Yjlx.cph0gtNBtJ' + // Note: The `upload_id` attribute applies to S3 multipart-upload + // operations and corresponds to the `--upload-id` parameter + // of the [S3 + // API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) + // multipart operations. + // This applies in particular to the following operations: + // + // - + // [abort-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/abort-multipart-upload.html) + // - + // [complete-multipart-upload](https://docs.aws.amazon.com/cli/latest/reference/s3api/complete-multipart-upload.html) + // - + // [list-parts](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-parts.html) + // - + // [upload-part](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part.html) + // - + // [upload-part-copy](https://docs.aws.amazon.com/cli/latest/reference/s3api/upload-part-copy.html) + AWSS3UploadIDKey = attribute.Key("aws.s3.upload_id") +) + +// AWSS3Bucket returns an attribute KeyValue conforming to the +// "aws.s3.bucket" semantic conventions. It represents the S3 bucket name the +// request refers to. Corresponds to the `--bucket` parameter of the [S3 +// API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) +// operations. +func AWSS3Bucket(val string) attribute.KeyValue { + return AWSS3BucketKey.String(val) +} + +// AWSS3CopySource returns an attribute KeyValue conforming to the +// "aws.s3.copy_source" semantic conventions. It represents the source object +// (in the form `bucket`/`key`) for the copy operation. +func AWSS3CopySource(val string) attribute.KeyValue { + return AWSS3CopySourceKey.String(val) +} + +// AWSS3Delete returns an attribute KeyValue conforming to the +// "aws.s3.delete" semantic conventions. It represents the delete request +// container that specifies the objects to be deleted. +func AWSS3Delete(val string) attribute.KeyValue { + return AWSS3DeleteKey.String(val) +} + +// AWSS3Key returns an attribute KeyValue conforming to the "aws.s3.key" +// semantic conventions. It represents the S3 object key the request refers to. +// Corresponds to the `--key` parameter of the [S3 +// API](https://docs.aws.amazon.com/cli/latest/reference/s3api/index.html) +// operations. +func AWSS3Key(val string) attribute.KeyValue { + return AWSS3KeyKey.String(val) +} + +// AWSS3PartNumber returns an attribute KeyValue conforming to the +// "aws.s3.part_number" semantic conventions. It represents the part number of +// the part being uploaded in a multipart-upload operation. This is a positive +// integer between 1 and 10,000. +func AWSS3PartNumber(val int) attribute.KeyValue { + return AWSS3PartNumberKey.Int(val) +} + +// AWSS3UploadID returns an attribute KeyValue conforming to the +// "aws.s3.upload_id" semantic conventions. It represents the upload ID that +// identifies the multipart upload. +func AWSS3UploadID(val string) attribute.KeyValue { + return AWSS3UploadIDKey.String(val) +} + +// The web browser attributes +const ( + // BrowserBrandsKey is the attribute Key conforming to the "browser.brands" + // semantic conventions. It represents the array of brand name and version + // separated by a space + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: ' Not A;Brand 99', 'Chromium 99', 'Chrome 99' + // Note: This value is intended to be taken from the [UA client hints + // API](https://wicg.github.io/ua-client-hints/#interface) + // (`navigator.userAgentData.brands`). + BrowserBrandsKey = attribute.Key("browser.brands") + + // BrowserLanguageKey is the attribute Key conforming to the + // "browser.language" semantic conventions. It represents the preferred + // language of the user using the browser + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'en', 'en-US', 'fr', 'fr-FR' + // Note: This value is intended to be taken from the Navigator API + // `navigator.language`. + BrowserLanguageKey = attribute.Key("browser.language") + + // BrowserMobileKey is the attribute Key conforming to the "browser.mobile" + // semantic conventions. It represents a boolean that is true if the + // browser is running on a mobile device + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + // Note: This value is intended to be taken from the [UA client hints + // API](https://wicg.github.io/ua-client-hints/#interface) + // (`navigator.userAgentData.mobile`). If unavailable, this attribute + // SHOULD be left unset. + BrowserMobileKey = attribute.Key("browser.mobile") + + // BrowserPlatformKey is the attribute Key conforming to the + // "browser.platform" semantic conventions. It represents the platform on + // which the browser is running + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Windows', 'macOS', 'Android' + // Note: This value is intended to be taken from the [UA client hints + // API](https://wicg.github.io/ua-client-hints/#interface) + // (`navigator.userAgentData.platform`). If unavailable, the legacy + // `navigator.platform` API SHOULD NOT be used instead and this attribute + // SHOULD be left unset in order for the values to be consistent. + // The list of possible values is defined in the [W3C User-Agent Client + // Hints + // specification](https://wicg.github.io/ua-client-hints/#sec-ch-ua-platform). + // Note that some (but not all) of these values can overlap with values in + // the [`os.type` and `os.name` attributes](./os.md). However, for + // consistency, the values in the `browser.platform` attribute should + // capture the exact value that the user agent provides. + BrowserPlatformKey = attribute.Key("browser.platform") +) + +// BrowserBrands returns an attribute KeyValue conforming to the +// "browser.brands" semantic conventions. It represents the array of brand name +// and version separated by a space +func BrowserBrands(val ...string) attribute.KeyValue { + return BrowserBrandsKey.StringSlice(val) +} + +// BrowserLanguage returns an attribute KeyValue conforming to the +// "browser.language" semantic conventions. It represents the preferred +// language of the user using the browser +func BrowserLanguage(val string) attribute.KeyValue { + return BrowserLanguageKey.String(val) +} + +// BrowserMobile returns an attribute KeyValue conforming to the +// "browser.mobile" semantic conventions. It represents a boolean that is true +// if the browser is running on a mobile device +func BrowserMobile(val bool) attribute.KeyValue { + return BrowserMobileKey.Bool(val) +} + +// BrowserPlatform returns an attribute KeyValue conforming to the +// "browser.platform" semantic conventions. It represents the platform on which +// the browser is running +func BrowserPlatform(val string) attribute.KeyValue { + return BrowserPlatformKey.String(val) +} + +// These attributes may be used to describe the client in a connection-based +// network interaction where there is one side that initiates the connection +// (the client is the side that initiates the connection). This covers all TCP +// network interactions since TCP is connection-based and one side initiates +// the connection (an exception is made for peer-to-peer communication over TCP +// where the "user-facing" surface of the protocol / API doesn't expose a clear +// notion of client and server). This also covers UDP network interactions +// where one side initiates the interaction, e.g. QUIC (HTTP/3) and DNS. +const ( + // ClientAddressKey is the attribute Key conforming to the "client.address" + // semantic conventions. It represents the client address - domain name if + // available without reverse DNS lookup; otherwise, IP address or Unix + // domain socket name. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'client.example.com', '10.1.2.80', '/tmp/my.sock' + // Note: When observed from the server side, and when communicating through + // an intermediary, `client.address` SHOULD represent the client address + // behind any intermediaries, for example proxies, if it's available. + ClientAddressKey = attribute.Key("client.address") + + // ClientPortKey is the attribute Key conforming to the "client.port" + // semantic conventions. It represents the client port number. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 65123 + // Note: When observed from the server side, and when communicating through + // an intermediary, `client.port` SHOULD represent the client port behind + // any intermediaries, for example proxies, if it's available. + ClientPortKey = attribute.Key("client.port") +) + +// ClientAddress returns an attribute KeyValue conforming to the +// "client.address" semantic conventions. It represents the client address - +// domain name if available without reverse DNS lookup; otherwise, IP address +// or Unix domain socket name. +func ClientAddress(val string) attribute.KeyValue { + return ClientAddressKey.String(val) +} + +// ClientPort returns an attribute KeyValue conforming to the "client.port" +// semantic conventions. It represents the client port number. +func ClientPort(val int) attribute.KeyValue { + return ClientPortKey.Int(val) +} + +// A cloud environment (e.g. GCP, Azure, AWS). +const ( + // CloudAccountIDKey is the attribute Key conforming to the + // "cloud.account.id" semantic conventions. It represents the cloud account + // ID the resource is assigned to. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '111111111111', 'opentelemetry' + CloudAccountIDKey = attribute.Key("cloud.account.id") + + // CloudAvailabilityZoneKey is the attribute Key conforming to the + // "cloud.availability_zone" semantic conventions. It represents the cloud + // regions often have multiple, isolated locations known as zones to + // increase availability. Availability zone represents the zone where the + // resource is running. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'us-east-1c' + // Note: Availability zones are called "zones" on Alibaba Cloud and Google + // Cloud. + CloudAvailabilityZoneKey = attribute.Key("cloud.availability_zone") + + // CloudPlatformKey is the attribute Key conforming to the "cloud.platform" + // semantic conventions. It represents the cloud platform in use. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Note: The prefix of the service SHOULD match the one specified in + // `cloud.provider`. + CloudPlatformKey = attribute.Key("cloud.platform") + + // CloudProviderKey is the attribute Key conforming to the "cloud.provider" + // semantic conventions. It represents the name of the cloud provider. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + CloudProviderKey = attribute.Key("cloud.provider") + + // CloudRegionKey is the attribute Key conforming to the "cloud.region" + // semantic conventions. It represents the geographical region the resource + // is running. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'us-central1', 'us-east-1' + // Note: Refer to your provider's docs to see the available regions, for + // example [Alibaba Cloud + // regions](https://www.alibabacloud.com/help/doc-detail/40654.htm), [AWS + // regions](https://aws.amazon.com/about-aws/global-infrastructure/regions_az/), + // [Azure + // regions](https://azure.microsoft.com/global-infrastructure/geographies/), + // [Google Cloud regions](https://cloud.google.com/about/locations), or + // [Tencent Cloud + // regions](https://www.tencentcloud.com/document/product/213/6091). + CloudRegionKey = attribute.Key("cloud.region") + + // CloudResourceIDKey is the attribute Key conforming to the + // "cloud.resource_id" semantic conventions. It represents the cloud + // provider-specific native identifier of the monitored cloud resource + // (e.g. an + // [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) + // on AWS, a [fully qualified resource + // ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) + // on Azure, a [full resource + // name](https://cloud.google.com/apis/design/resource_names#full_resource_name) + // on GCP) + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function', + // '//run.googleapis.com/projects/PROJECT_ID/locations/LOCATION_ID/services/SERVICE_ID', + // '/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/' + // Note: On some cloud providers, it may not be possible to determine the + // full ID at startup, + // so it may be necessary to set `cloud.resource_id` as a span attribute + // instead. + // + // The exact value to use for `cloud.resource_id` depends on the cloud + // provider. + // The following well-known definitions MUST be used if you set this + // attribute and they apply: + // + // * **AWS Lambda:** The function + // [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html). + // Take care not to use the "invoked ARN" directly but replace any + // [alias + // suffix](https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html) + // with the resolved function version, as the same runtime instance may + // be invokable with + // multiple different aliases. + // * **GCP:** The [URI of the + // resource](https://cloud.google.com/iam/docs/full-resource-names) + // * **Azure:** The [Fully Qualified Resource + // ID](https://docs.microsoft.com/rest/api/resources/resources/get-by-id) + // of the invoked function, + // *not* the function app, having the form + // `/subscriptions//resourceGroups//providers/Microsoft.Web/sites//functions/`. + // This means that a span attribute MUST be used, as an Azure function + // app can host multiple functions that would usually share + // a TracerProvider. + CloudResourceIDKey = attribute.Key("cloud.resource_id") +) + +var ( + // Alibaba Cloud Elastic Compute Service + CloudPlatformAlibabaCloudECS = CloudPlatformKey.String("alibaba_cloud_ecs") + // Alibaba Cloud Function Compute + CloudPlatformAlibabaCloudFc = CloudPlatformKey.String("alibaba_cloud_fc") + // Red Hat OpenShift on Alibaba Cloud + CloudPlatformAlibabaCloudOpenshift = CloudPlatformKey.String("alibaba_cloud_openshift") + // AWS Elastic Compute Cloud + CloudPlatformAWSEC2 = CloudPlatformKey.String("aws_ec2") + // AWS Elastic Container Service + CloudPlatformAWSECS = CloudPlatformKey.String("aws_ecs") + // AWS Elastic Kubernetes Service + CloudPlatformAWSEKS = CloudPlatformKey.String("aws_eks") + // AWS Lambda + CloudPlatformAWSLambda = CloudPlatformKey.String("aws_lambda") + // AWS Elastic Beanstalk + CloudPlatformAWSElasticBeanstalk = CloudPlatformKey.String("aws_elastic_beanstalk") + // AWS App Runner + CloudPlatformAWSAppRunner = CloudPlatformKey.String("aws_app_runner") + // Red Hat OpenShift on AWS (ROSA) + CloudPlatformAWSOpenshift = CloudPlatformKey.String("aws_openshift") + // Azure Virtual Machines + CloudPlatformAzureVM = CloudPlatformKey.String("azure_vm") + // Azure Container Apps + CloudPlatformAzureContainerApps = CloudPlatformKey.String("azure_container_apps") + // Azure Container Instances + CloudPlatformAzureContainerInstances = CloudPlatformKey.String("azure_container_instances") + // Azure Kubernetes Service + CloudPlatformAzureAKS = CloudPlatformKey.String("azure_aks") + // Azure Functions + CloudPlatformAzureFunctions = CloudPlatformKey.String("azure_functions") + // Azure App Service + CloudPlatformAzureAppService = CloudPlatformKey.String("azure_app_service") + // Azure Red Hat OpenShift + CloudPlatformAzureOpenshift = CloudPlatformKey.String("azure_openshift") + // Google Bare Metal Solution (BMS) + CloudPlatformGCPBareMetalSolution = CloudPlatformKey.String("gcp_bare_metal_solution") + // Google Cloud Compute Engine (GCE) + CloudPlatformGCPComputeEngine = CloudPlatformKey.String("gcp_compute_engine") + // Google Cloud Run + CloudPlatformGCPCloudRun = CloudPlatformKey.String("gcp_cloud_run") + // Google Cloud Kubernetes Engine (GKE) + CloudPlatformGCPKubernetesEngine = CloudPlatformKey.String("gcp_kubernetes_engine") + // Google Cloud Functions (GCF) + CloudPlatformGCPCloudFunctions = CloudPlatformKey.String("gcp_cloud_functions") + // Google Cloud App Engine (GAE) + CloudPlatformGCPAppEngine = CloudPlatformKey.String("gcp_app_engine") + // Red Hat OpenShift on Google Cloud + CloudPlatformGCPOpenshift = CloudPlatformKey.String("gcp_openshift") + // Red Hat OpenShift on IBM Cloud + CloudPlatformIbmCloudOpenshift = CloudPlatformKey.String("ibm_cloud_openshift") + // Tencent Cloud Cloud Virtual Machine (CVM) + CloudPlatformTencentCloudCvm = CloudPlatformKey.String("tencent_cloud_cvm") + // Tencent Cloud Elastic Kubernetes Service (EKS) + CloudPlatformTencentCloudEKS = CloudPlatformKey.String("tencent_cloud_eks") + // Tencent Cloud Serverless Cloud Function (SCF) + CloudPlatformTencentCloudScf = CloudPlatformKey.String("tencent_cloud_scf") +) + +var ( + // Alibaba Cloud + CloudProviderAlibabaCloud = CloudProviderKey.String("alibaba_cloud") + // Amazon Web Services + CloudProviderAWS = CloudProviderKey.String("aws") + // Microsoft Azure + CloudProviderAzure = CloudProviderKey.String("azure") + // Google Cloud Platform + CloudProviderGCP = CloudProviderKey.String("gcp") + // Heroku Platform as a Service + CloudProviderHeroku = CloudProviderKey.String("heroku") + // IBM Cloud + CloudProviderIbmCloud = CloudProviderKey.String("ibm_cloud") + // Tencent Cloud + CloudProviderTencentCloud = CloudProviderKey.String("tencent_cloud") +) + +// CloudAccountID returns an attribute KeyValue conforming to the +// "cloud.account.id" semantic conventions. It represents the cloud account ID +// the resource is assigned to. +func CloudAccountID(val string) attribute.KeyValue { + return CloudAccountIDKey.String(val) +} + +// CloudAvailabilityZone returns an attribute KeyValue conforming to the +// "cloud.availability_zone" semantic conventions. It represents the cloud +// regions often have multiple, isolated locations known as zones to increase +// availability. Availability zone represents the zone where the resource is +// running. +func CloudAvailabilityZone(val string) attribute.KeyValue { + return CloudAvailabilityZoneKey.String(val) +} + +// CloudRegion returns an attribute KeyValue conforming to the +// "cloud.region" semantic conventions. It represents the geographical region +// the resource is running. +func CloudRegion(val string) attribute.KeyValue { + return CloudRegionKey.String(val) +} + +// CloudResourceID returns an attribute KeyValue conforming to the +// "cloud.resource_id" semantic conventions. It represents the cloud +// provider-specific native identifier of the monitored cloud resource (e.g. an +// [ARN](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html) +// on AWS, a [fully qualified resource +// ID](https://learn.microsoft.com/rest/api/resources/resources/get-by-id) on +// Azure, a [full resource +// name](https://cloud.google.com/apis/design/resource_names#full_resource_name) +// on GCP) +func CloudResourceID(val string) attribute.KeyValue { + return CloudResourceIDKey.String(val) +} + +// Attributes for CloudEvents. +const ( + // CloudeventsEventIDKey is the attribute Key conforming to the + // "cloudevents.event_id" semantic conventions. It represents the + // [event_id](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#id) + // uniquely identifies the event. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '123e4567-e89b-12d3-a456-426614174000', '0001' + CloudeventsEventIDKey = attribute.Key("cloudevents.event_id") + + // CloudeventsEventSourceKey is the attribute Key conforming to the + // "cloudevents.event_source" semantic conventions. It represents the + // [source](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#source-1) + // identifies the context in which an event happened. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'https://github.com/cloudevents', + // '/cloudevents/spec/pull/123', 'my-service' + CloudeventsEventSourceKey = attribute.Key("cloudevents.event_source") + + // CloudeventsEventSpecVersionKey is the attribute Key conforming to the + // "cloudevents.event_spec_version" semantic conventions. It represents the + // [version of the CloudEvents + // specification](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#specversion) + // which the event uses. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '1.0' + CloudeventsEventSpecVersionKey = attribute.Key("cloudevents.event_spec_version") + + // CloudeventsEventSubjectKey is the attribute Key conforming to the + // "cloudevents.event_subject" semantic conventions. It represents the + // [subject](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#subject) + // of the event in the context of the event producer (identified by + // source). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'mynewfile.jpg' + CloudeventsEventSubjectKey = attribute.Key("cloudevents.event_subject") + + // CloudeventsEventTypeKey is the attribute Key conforming to the + // "cloudevents.event_type" semantic conventions. It represents the + // [event_type](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#type) + // contains a value describing the type of event related to the originating + // occurrence. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'com.github.pull_request.opened', + // 'com.example.object.deleted.v2' + CloudeventsEventTypeKey = attribute.Key("cloudevents.event_type") +) + +// CloudeventsEventID returns an attribute KeyValue conforming to the +// "cloudevents.event_id" semantic conventions. It represents the +// [event_id](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#id) +// uniquely identifies the event. +func CloudeventsEventID(val string) attribute.KeyValue { + return CloudeventsEventIDKey.String(val) +} + +// CloudeventsEventSource returns an attribute KeyValue conforming to the +// "cloudevents.event_source" semantic conventions. It represents the +// [source](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#source-1) +// identifies the context in which an event happened. +func CloudeventsEventSource(val string) attribute.KeyValue { + return CloudeventsEventSourceKey.String(val) +} + +// CloudeventsEventSpecVersion returns an attribute KeyValue conforming to +// the "cloudevents.event_spec_version" semantic conventions. It represents the +// [version of the CloudEvents +// specification](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#specversion) +// which the event uses. +func CloudeventsEventSpecVersion(val string) attribute.KeyValue { + return CloudeventsEventSpecVersionKey.String(val) +} + +// CloudeventsEventSubject returns an attribute KeyValue conforming to the +// "cloudevents.event_subject" semantic conventions. It represents the +// [subject](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#subject) +// of the event in the context of the event producer (identified by source). +func CloudeventsEventSubject(val string) attribute.KeyValue { + return CloudeventsEventSubjectKey.String(val) +} + +// CloudeventsEventType returns an attribute KeyValue conforming to the +// "cloudevents.event_type" semantic conventions. It represents the +// [event_type](https://github.com/cloudevents/spec/blob/v1.0.2/cloudevents/spec.md#type) +// contains a value describing the type of event related to the originating +// occurrence. +func CloudeventsEventType(val string) attribute.KeyValue { + return CloudeventsEventTypeKey.String(val) +} + +// These attributes allow to report this unit of code and therefore to provide +// more context about the span. +const ( + // CodeColumnKey is the attribute Key conforming to the "code.column" + // semantic conventions. It represents the column number in `code.filepath` + // best representing the operation. It SHOULD point within the code unit + // named in `code.function`. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 16 + CodeColumnKey = attribute.Key("code.column") + + // CodeFilepathKey is the attribute Key conforming to the "code.filepath" + // semantic conventions. It represents the source code file name that + // identifies the code unit as uniquely as possible (preferably an absolute + // file path). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/usr/local/MyApplication/content_root/app/index.php' + CodeFilepathKey = attribute.Key("code.filepath") + + // CodeFunctionKey is the attribute Key conforming to the "code.function" + // semantic conventions. It represents the method or function name, or + // equivalent (usually rightmost part of the code unit's name). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'serveRequest' + CodeFunctionKey = attribute.Key("code.function") + + // CodeLineNumberKey is the attribute Key conforming to the "code.lineno" + // semantic conventions. It represents the line number in `code.filepath` + // best representing the operation. It SHOULD point within the code unit + // named in `code.function`. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 42 + CodeLineNumberKey = attribute.Key("code.lineno") + + // CodeNamespaceKey is the attribute Key conforming to the "code.namespace" + // semantic conventions. It represents the "namespace" within which + // `code.function` is defined. Usually the qualified class or module name, + // such that `code.namespace` + some separator + `code.function` form a + // unique identifier for the code unit. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'com.example.MyHTTPService' + CodeNamespaceKey = attribute.Key("code.namespace") + + // CodeStacktraceKey is the attribute Key conforming to the + // "code.stacktrace" semantic conventions. It represents a stacktrace as a + // string in the natural representation for the language runtime. The + // representation is to be determined and documented by each language SIG. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'at + // com.example.GenerateTrace.methodB(GenerateTrace.java:13)\\n at ' + // 'com.example.GenerateTrace.methodA(GenerateTrace.java:9)\\n at ' + // 'com.example.GenerateTrace.main(GenerateTrace.java:5)' + CodeStacktraceKey = attribute.Key("code.stacktrace") +) + +// CodeColumn returns an attribute KeyValue conforming to the "code.column" +// semantic conventions. It represents the column number in `code.filepath` +// best representing the operation. It SHOULD point within the code unit named +// in `code.function`. +func CodeColumn(val int) attribute.KeyValue { + return CodeColumnKey.Int(val) +} + +// CodeFilepath returns an attribute KeyValue conforming to the +// "code.filepath" semantic conventions. It represents the source code file +// name that identifies the code unit as uniquely as possible (preferably an +// absolute file path). +func CodeFilepath(val string) attribute.KeyValue { + return CodeFilepathKey.String(val) +} + +// CodeFunction returns an attribute KeyValue conforming to the +// "code.function" semantic conventions. It represents the method or function +// name, or equivalent (usually rightmost part of the code unit's name). +func CodeFunction(val string) attribute.KeyValue { + return CodeFunctionKey.String(val) +} + +// CodeLineNumber returns an attribute KeyValue conforming to the "code.lineno" +// semantic conventions. It represents the line number in `code.filepath` best +// representing the operation. It SHOULD point within the code unit named in +// `code.function`. +func CodeLineNumber(val int) attribute.KeyValue { + return CodeLineNumberKey.Int(val) +} + +// CodeNamespace returns an attribute KeyValue conforming to the +// "code.namespace" semantic conventions. It represents the "namespace" within +// which `code.function` is defined. Usually the qualified class or module +// name, such that `code.namespace` + some separator + `code.function` form a +// unique identifier for the code unit. +func CodeNamespace(val string) attribute.KeyValue { + return CodeNamespaceKey.String(val) +} + +// CodeStacktrace returns an attribute KeyValue conforming to the +// "code.stacktrace" semantic conventions. It represents a stacktrace as a +// string in the natural representation for the language runtime. The +// representation is to be determined and documented by each language SIG. +func CodeStacktrace(val string) attribute.KeyValue { + return CodeStacktraceKey.String(val) +} + +// A container instance. +const ( + // ContainerCommandKey is the attribute Key conforming to the + // "container.command" semantic conventions. It represents the command used + // to run the container (i.e. the command name). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'otelcontribcol' + // Note: If using embedded credentials or sensitive data, it is recommended + // to remove them to prevent potential leakage. + ContainerCommandKey = attribute.Key("container.command") + + // ContainerCommandArgsKey is the attribute Key conforming to the + // "container.command_args" semantic conventions. It represents the all the + // command arguments (including the command/executable itself) run by the + // container. [2] + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'otelcontribcol, --config, config.yaml' + ContainerCommandArgsKey = attribute.Key("container.command_args") + + // ContainerCommandLineKey is the attribute Key conforming to the + // "container.command_line" semantic conventions. It represents the full + // command run by the container as a single string representing the full + // command. [2] + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'otelcontribcol --config config.yaml' + ContainerCommandLineKey = attribute.Key("container.command_line") + + // ContainerCPUStateKey is the attribute Key conforming to the + // "container.cpu.state" semantic conventions. It represents the CPU state + // for this data point. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'user', 'kernel' + ContainerCPUStateKey = attribute.Key("container.cpu.state") + + // ContainerIDKey is the attribute Key conforming to the "container.id" + // semantic conventions. It represents the container ID. Usually a UUID, as + // for example used to [identify Docker + // containers](https://docs.docker.com/engine/reference/run/#container-identification). + // The UUID might be abbreviated. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'a3bf90e006b2' + ContainerIDKey = attribute.Key("container.id") + + // ContainerImageIDKey is the attribute Key conforming to the + // "container.image.id" semantic conventions. It represents the runtime + // specific image identifier. Usually a hash algorithm followed by a UUID. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // 'sha256:19c92d0a00d1b66d897bceaa7319bee0dd38a10a851c60bcec9474aa3f01e50f' + // Note: Docker defines a sha256 of the image id; `container.image.id` + // corresponds to the `Image` field from the Docker container inspect + // [API](https://docs.docker.com/engine/api/v1.43/#tag/Container/operation/ContainerInspect) + // endpoint. + // K8S defines a link to the container registry repository with digest + // `"imageID": "registry.azurecr.io + // /namespace/service/dockerfile@sha256:bdeabd40c3a8a492eaf9e8e44d0ebbb84bac7ee25ac0cf8a7159d25f62555625"`. + // The ID is assigned by the container runtime and can vary in different + // environments. Consider using `oci.manifest.digest` if it is important to + // identify the same image in different environments/runtimes. + ContainerImageIDKey = attribute.Key("container.image.id") + + // ContainerImageNameKey is the attribute Key conforming to the + // "container.image.name" semantic conventions. It represents the name of + // the image the container was built on. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'gcr.io/opentelemetry/operator' + ContainerImageNameKey = attribute.Key("container.image.name") + + // ContainerImageRepoDigestsKey is the attribute Key conforming to the + // "container.image.repo_digests" semantic conventions. It represents the + // repo digests of the container image as provided by the container + // runtime. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // 'example@sha256:afcc7f1ac1b49db317a7196c902e61c6c3c4607d63599ee1a82d702d249a0ccb', + // 'internal.registry.example.com:5000/example@sha256:b69959407d21e8a062e0416bf13405bb2b71ed7a84dde4158ebafacfa06f5578' + // Note: + // [Docker](https://docs.docker.com/engine/api/v1.43/#tag/Image/operation/ImageInspect) + // and + // [CRI](https://github.com/kubernetes/cri-api/blob/c75ef5b473bbe2d0a4fc92f82235efd665ea8e9f/pkg/apis/runtime/v1/api.proto#L1237-L1238) + // report those under the `RepoDigests` field. + ContainerImageRepoDigestsKey = attribute.Key("container.image.repo_digests") + + // ContainerImageTagsKey is the attribute Key conforming to the + // "container.image.tags" semantic conventions. It represents the container + // image tags. An example can be found in [Docker Image + // Inspect](https://docs.docker.com/engine/api/v1.43/#tag/Image/operation/ImageInspect). + // Should be only the `` section of the full name for example from + // `registry.example.com/my-org/my-image:`. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'v1.27.1', '3.5.7-0' + ContainerImageTagsKey = attribute.Key("container.image.tags") + + // ContainerNameKey is the attribute Key conforming to the "container.name" + // semantic conventions. It represents the container name used by container + // runtime. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry-autoconf' + ContainerNameKey = attribute.Key("container.name") + + // ContainerRuntimeKey is the attribute Key conforming to the + // "container.runtime" semantic conventions. It represents the container + // runtime managing this container. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'docker', 'containerd', 'rkt' + ContainerRuntimeKey = attribute.Key("container.runtime") +) + +var ( + // When tasks of the cgroup are in user mode (Linux). When all container processes are in user mode (Windows) + ContainerCPUStateUser = ContainerCPUStateKey.String("user") + // When CPU is used by the system (host OS) + ContainerCPUStateSystem = ContainerCPUStateKey.String("system") + // When tasks of the cgroup are in kernel mode (Linux). When all container processes are in kernel mode (Windows) + ContainerCPUStateKernel = ContainerCPUStateKey.String("kernel") +) + +// ContainerCommand returns an attribute KeyValue conforming to the +// "container.command" semantic conventions. It represents the command used to +// run the container (i.e. the command name). +func ContainerCommand(val string) attribute.KeyValue { + return ContainerCommandKey.String(val) +} + +// ContainerCommandArgs returns an attribute KeyValue conforming to the +// "container.command_args" semantic conventions. It represents the all the +// command arguments (including the command/executable itself) run by the +// container. [2] +func ContainerCommandArgs(val ...string) attribute.KeyValue { + return ContainerCommandArgsKey.StringSlice(val) +} + +// ContainerCommandLine returns an attribute KeyValue conforming to the +// "container.command_line" semantic conventions. It represents the full +// command run by the container as a single string representing the full +// command. [2] +func ContainerCommandLine(val string) attribute.KeyValue { + return ContainerCommandLineKey.String(val) +} + +// ContainerID returns an attribute KeyValue conforming to the +// "container.id" semantic conventions. It represents the container ID. Usually +// a UUID, as for example used to [identify Docker +// containers](https://docs.docker.com/engine/reference/run/#container-identification). +// The UUID might be abbreviated. +func ContainerID(val string) attribute.KeyValue { + return ContainerIDKey.String(val) +} + +// ContainerImageID returns an attribute KeyValue conforming to the +// "container.image.id" semantic conventions. It represents the runtime +// specific image identifier. Usually a hash algorithm followed by a UUID. +func ContainerImageID(val string) attribute.KeyValue { + return ContainerImageIDKey.String(val) +} + +// ContainerImageName returns an attribute KeyValue conforming to the +// "container.image.name" semantic conventions. It represents the name of the +// image the container was built on. +func ContainerImageName(val string) attribute.KeyValue { + return ContainerImageNameKey.String(val) +} + +// ContainerImageRepoDigests returns an attribute KeyValue conforming to the +// "container.image.repo_digests" semantic conventions. It represents the repo +// digests of the container image as provided by the container runtime. +func ContainerImageRepoDigests(val ...string) attribute.KeyValue { + return ContainerImageRepoDigestsKey.StringSlice(val) +} + +// ContainerImageTags returns an attribute KeyValue conforming to the +// "container.image.tags" semantic conventions. It represents the container +// image tags. An example can be found in [Docker Image +// Inspect](https://docs.docker.com/engine/api/v1.43/#tag/Image/operation/ImageInspect). +// Should be only the `` section of the full name for example from +// `registry.example.com/my-org/my-image:`. +func ContainerImageTags(val ...string) attribute.KeyValue { + return ContainerImageTagsKey.StringSlice(val) +} + +// ContainerName returns an attribute KeyValue conforming to the +// "container.name" semantic conventions. It represents the container name used +// by container runtime. +func ContainerName(val string) attribute.KeyValue { + return ContainerNameKey.String(val) +} + +// ContainerRuntime returns an attribute KeyValue conforming to the +// "container.runtime" semantic conventions. It represents the container +// runtime managing this container. +func ContainerRuntime(val string) attribute.KeyValue { + return ContainerRuntimeKey.String(val) +} + +// This group defines the attributes used to describe telemetry in the context +// of databases. +const ( + // DBClientConnectionsPoolNameKey is the attribute Key conforming to the + // "db.client.connections.pool.name" semantic conventions. It represents + // the name of the connection pool; unique within the instrumented + // application. In case the connection pool implementation doesn't provide + // a name, instrumentation should use a combination of `server.address` and + // `server.port` attributes formatted as `server.address:server.port`. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'myDataSource' + DBClientConnectionsPoolNameKey = attribute.Key("db.client.connections.pool.name") + + // DBClientConnectionsStateKey is the attribute Key conforming to the + // "db.client.connections.state" semantic conventions. It represents the + // state of a connection in the pool + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'idle' + DBClientConnectionsStateKey = attribute.Key("db.client.connections.state") + + // DBCollectionNameKey is the attribute Key conforming to the + // "db.collection.name" semantic conventions. It represents the name of a + // collection (table, container) within the database. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'public.users', 'customers' + // Note: If the collection name is parsed from the query, it SHOULD match + // the value provided in the query and may be qualified with the schema and + // database name. + // It is RECOMMENDED to capture the value as provided by the application + // without attempting to do any case normalization. + DBCollectionNameKey = attribute.Key("db.collection.name") + + // DBNamespaceKey is the attribute Key conforming to the "db.namespace" + // semantic conventions. It represents the name of the database, fully + // qualified within the server address and port. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'customers', 'test.users' + // Note: If a database system has multiple namespace components, they + // SHOULD be concatenated (potentially using database system specific + // conventions) from most general to most specific namespace component, and + // more specific namespaces SHOULD NOT be captured without the more general + // namespaces, to ensure that "startswith" queries for the more general + // namespaces will be valid. + // Semantic conventions for individual database systems SHOULD document + // what `db.namespace` means in the context of that system. + // It is RECOMMENDED to capture the value as provided by the application + // without attempting to do any case normalization. + DBNamespaceKey = attribute.Key("db.namespace") + + // DBOperationNameKey is the attribute Key conforming to the + // "db.operation.name" semantic conventions. It represents the name of the + // operation or command being executed. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'findAndModify', 'HMSET', 'SELECT' + // Note: It is RECOMMENDED to capture the value as provided by the + // application without attempting to do any case normalization. + DBOperationNameKey = attribute.Key("db.operation.name") + + // DBQueryTextKey is the attribute Key conforming to the "db.query.text" + // semantic conventions. It represents the database query being executed. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'SELECT * FROM wuser_table where username = ?', 'SET mykey + // "WuValue"' + DBQueryTextKey = attribute.Key("db.query.text") + + // DBSystemKey is the attribute Key conforming to the "db.system" semantic + // conventions. It represents the database management system (DBMS) product + // as identified by the client instrumentation. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Note: The actual DBMS may differ from the one identified by the client. + // For example, when using PostgreSQL client libraries to connect to a + // CockroachDB, the `db.system` is set to `postgresql` based on the + // instrumentation's best knowledge. + DBSystemKey = attribute.Key("db.system") +) + +var ( + // idle + DBClientConnectionsStateIdle = DBClientConnectionsStateKey.String("idle") + // used + DBClientConnectionsStateUsed = DBClientConnectionsStateKey.String("used") +) + +var ( + // Some other SQL database. Fallback only. See notes + DBSystemOtherSQL = DBSystemKey.String("other_sql") + // Microsoft SQL Server + DBSystemMSSQL = DBSystemKey.String("mssql") + // Microsoft SQL Server Compact + DBSystemMssqlcompact = DBSystemKey.String("mssqlcompact") + // MySQL + DBSystemMySQL = DBSystemKey.String("mysql") + // Oracle Database + DBSystemOracle = DBSystemKey.String("oracle") + // IBM DB2 + DBSystemDB2 = DBSystemKey.String("db2") + // PostgreSQL + DBSystemPostgreSQL = DBSystemKey.String("postgresql") + // Amazon Redshift + DBSystemRedshift = DBSystemKey.String("redshift") + // Apache Hive + DBSystemHive = DBSystemKey.String("hive") + // Cloudscape + DBSystemCloudscape = DBSystemKey.String("cloudscape") + // HyperSQL DataBase + DBSystemHSQLDB = DBSystemKey.String("hsqldb") + // Progress Database + DBSystemProgress = DBSystemKey.String("progress") + // SAP MaxDB + DBSystemMaxDB = DBSystemKey.String("maxdb") + // SAP HANA + DBSystemHanaDB = DBSystemKey.String("hanadb") + // Ingres + DBSystemIngres = DBSystemKey.String("ingres") + // FirstSQL + DBSystemFirstSQL = DBSystemKey.String("firstsql") + // EnterpriseDB + DBSystemEDB = DBSystemKey.String("edb") + // InterSystems Caché + DBSystemCache = DBSystemKey.String("cache") + // Adabas (Adaptable Database System) + DBSystemAdabas = DBSystemKey.String("adabas") + // Firebird + DBSystemFirebird = DBSystemKey.String("firebird") + // Apache Derby + DBSystemDerby = DBSystemKey.String("derby") + // FileMaker + DBSystemFilemaker = DBSystemKey.String("filemaker") + // Informix + DBSystemInformix = DBSystemKey.String("informix") + // InstantDB + DBSystemInstantDB = DBSystemKey.String("instantdb") + // InterBase + DBSystemInterbase = DBSystemKey.String("interbase") + // MariaDB + DBSystemMariaDB = DBSystemKey.String("mariadb") + // Netezza + DBSystemNetezza = DBSystemKey.String("netezza") + // Pervasive PSQL + DBSystemPervasive = DBSystemKey.String("pervasive") + // PointBase + DBSystemPointbase = DBSystemKey.String("pointbase") + // SQLite + DBSystemSqlite = DBSystemKey.String("sqlite") + // Sybase + DBSystemSybase = DBSystemKey.String("sybase") + // Teradata + DBSystemTeradata = DBSystemKey.String("teradata") + // Vertica + DBSystemVertica = DBSystemKey.String("vertica") + // H2 + DBSystemH2 = DBSystemKey.String("h2") + // ColdFusion IMQ + DBSystemColdfusion = DBSystemKey.String("coldfusion") + // Apache Cassandra + DBSystemCassandra = DBSystemKey.String("cassandra") + // Apache HBase + DBSystemHBase = DBSystemKey.String("hbase") + // MongoDB + DBSystemMongoDB = DBSystemKey.String("mongodb") + // Redis + DBSystemRedis = DBSystemKey.String("redis") + // Couchbase + DBSystemCouchbase = DBSystemKey.String("couchbase") + // CouchDB + DBSystemCouchDB = DBSystemKey.String("couchdb") + // Microsoft Azure Cosmos DB + DBSystemCosmosDB = DBSystemKey.String("cosmosdb") + // Amazon DynamoDB + DBSystemDynamoDB = DBSystemKey.String("dynamodb") + // Neo4j + DBSystemNeo4j = DBSystemKey.String("neo4j") + // Apache Geode + DBSystemGeode = DBSystemKey.String("geode") + // Elasticsearch + DBSystemElasticsearch = DBSystemKey.String("elasticsearch") + // Memcached + DBSystemMemcached = DBSystemKey.String("memcached") + // CockroachDB + DBSystemCockroachdb = DBSystemKey.String("cockroachdb") + // OpenSearch + DBSystemOpensearch = DBSystemKey.String("opensearch") + // ClickHouse + DBSystemClickhouse = DBSystemKey.String("clickhouse") + // Cloud Spanner + DBSystemSpanner = DBSystemKey.String("spanner") + // Trino + DBSystemTrino = DBSystemKey.String("trino") +) + +// DBClientConnectionsPoolName returns an attribute KeyValue conforming to +// the "db.client.connections.pool.name" semantic conventions. It represents +// the name of the connection pool; unique within the instrumented application. +// In case the connection pool implementation doesn't provide a name, +// instrumentation should use a combination of `server.address` and +// `server.port` attributes formatted as `server.address:server.port`. +func DBClientConnectionsPoolName(val string) attribute.KeyValue { + return DBClientConnectionsPoolNameKey.String(val) +} + +// DBCollectionName returns an attribute KeyValue conforming to the +// "db.collection.name" semantic conventions. It represents the name of a +// collection (table, container) within the database. +func DBCollectionName(val string) attribute.KeyValue { + return DBCollectionNameKey.String(val) +} + +// DBNamespace returns an attribute KeyValue conforming to the +// "db.namespace" semantic conventions. It represents the name of the database, +// fully qualified within the server address and port. +func DBNamespace(val string) attribute.KeyValue { + return DBNamespaceKey.String(val) +} + +// DBOperationName returns an attribute KeyValue conforming to the +// "db.operation.name" semantic conventions. It represents the name of the +// operation or command being executed. +func DBOperationName(val string) attribute.KeyValue { + return DBOperationNameKey.String(val) +} + +// DBQueryText returns an attribute KeyValue conforming to the +// "db.query.text" semantic conventions. It represents the database query being +// executed. +func DBQueryText(val string) attribute.KeyValue { + return DBQueryTextKey.String(val) +} + +// This group defines attributes for Cassandra. +const ( + // DBCassandraConsistencyLevelKey is the attribute Key conforming to the + // "db.cassandra.consistency_level" semantic conventions. It represents the + // consistency level of the query. Based on consistency values from + // [CQL](https://docs.datastax.com/en/cassandra-oss/3.0/cassandra/dml/dmlConfigConsistency.html). + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + DBCassandraConsistencyLevelKey = attribute.Key("db.cassandra.consistency_level") + + // DBCassandraCoordinatorDCKey is the attribute Key conforming to the + // "db.cassandra.coordinator.dc" semantic conventions. It represents the + // data center of the coordinating node for a query. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'us-west-2' + DBCassandraCoordinatorDCKey = attribute.Key("db.cassandra.coordinator.dc") + + // DBCassandraCoordinatorIDKey is the attribute Key conforming to the + // "db.cassandra.coordinator.id" semantic conventions. It represents the ID + // of the coordinating node for a query. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'be13faa2-8574-4d71-926d-27f16cf8a7af' + DBCassandraCoordinatorIDKey = attribute.Key("db.cassandra.coordinator.id") + + // DBCassandraIdempotenceKey is the attribute Key conforming to the + // "db.cassandra.idempotence" semantic conventions. It represents the + // whether or not the query is idempotent. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + DBCassandraIdempotenceKey = attribute.Key("db.cassandra.idempotence") + + // DBCassandraPageSizeKey is the attribute Key conforming to the + // "db.cassandra.page_size" semantic conventions. It represents the fetch + // size used for paging, i.e. how many rows will be returned at once. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 5000 + DBCassandraPageSizeKey = attribute.Key("db.cassandra.page_size") + + // DBCassandraSpeculativeExecutionCountKey is the attribute Key conforming + // to the "db.cassandra.speculative_execution_count" semantic conventions. + // It represents the number of times a query was speculatively executed. + // Not set or `0` if the query was not executed speculatively. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 0, 2 + DBCassandraSpeculativeExecutionCountKey = attribute.Key("db.cassandra.speculative_execution_count") +) + +var ( + // all + DBCassandraConsistencyLevelAll = DBCassandraConsistencyLevelKey.String("all") + // each_quorum + DBCassandraConsistencyLevelEachQuorum = DBCassandraConsistencyLevelKey.String("each_quorum") + // quorum + DBCassandraConsistencyLevelQuorum = DBCassandraConsistencyLevelKey.String("quorum") + // local_quorum + DBCassandraConsistencyLevelLocalQuorum = DBCassandraConsistencyLevelKey.String("local_quorum") + // one + DBCassandraConsistencyLevelOne = DBCassandraConsistencyLevelKey.String("one") + // two + DBCassandraConsistencyLevelTwo = DBCassandraConsistencyLevelKey.String("two") + // three + DBCassandraConsistencyLevelThree = DBCassandraConsistencyLevelKey.String("three") + // local_one + DBCassandraConsistencyLevelLocalOne = DBCassandraConsistencyLevelKey.String("local_one") + // any + DBCassandraConsistencyLevelAny = DBCassandraConsistencyLevelKey.String("any") + // serial + DBCassandraConsistencyLevelSerial = DBCassandraConsistencyLevelKey.String("serial") + // local_serial + DBCassandraConsistencyLevelLocalSerial = DBCassandraConsistencyLevelKey.String("local_serial") +) + +// DBCassandraCoordinatorDC returns an attribute KeyValue conforming to the +// "db.cassandra.coordinator.dc" semantic conventions. It represents the data +// center of the coordinating node for a query. +func DBCassandraCoordinatorDC(val string) attribute.KeyValue { + return DBCassandraCoordinatorDCKey.String(val) +} + +// DBCassandraCoordinatorID returns an attribute KeyValue conforming to the +// "db.cassandra.coordinator.id" semantic conventions. It represents the ID of +// the coordinating node for a query. +func DBCassandraCoordinatorID(val string) attribute.KeyValue { + return DBCassandraCoordinatorIDKey.String(val) +} + +// DBCassandraIdempotence returns an attribute KeyValue conforming to the +// "db.cassandra.idempotence" semantic conventions. It represents the whether +// or not the query is idempotent. +func DBCassandraIdempotence(val bool) attribute.KeyValue { + return DBCassandraIdempotenceKey.Bool(val) +} + +// DBCassandraPageSize returns an attribute KeyValue conforming to the +// "db.cassandra.page_size" semantic conventions. It represents the fetch size +// used for paging, i.e. how many rows will be returned at once. +func DBCassandraPageSize(val int) attribute.KeyValue { + return DBCassandraPageSizeKey.Int(val) +} + +// DBCassandraSpeculativeExecutionCount returns an attribute KeyValue +// conforming to the "db.cassandra.speculative_execution_count" semantic +// conventions. It represents the number of times a query was speculatively +// executed. Not set or `0` if the query was not executed speculatively. +func DBCassandraSpeculativeExecutionCount(val int) attribute.KeyValue { + return DBCassandraSpeculativeExecutionCountKey.Int(val) +} + +// This group defines attributes for Azure Cosmos DB. +const ( + // DBCosmosDBClientIDKey is the attribute Key conforming to the + // "db.cosmosdb.client_id" semantic conventions. It represents the unique + // Cosmos client instance id. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '3ba4827d-4422-483f-b59f-85b74211c11d' + DBCosmosDBClientIDKey = attribute.Key("db.cosmosdb.client_id") + + // DBCosmosDBConnectionModeKey is the attribute Key conforming to the + // "db.cosmosdb.connection_mode" semantic conventions. It represents the + // cosmos client connection mode. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + DBCosmosDBConnectionModeKey = attribute.Key("db.cosmosdb.connection_mode") + + // DBCosmosDBOperationTypeKey is the attribute Key conforming to the + // "db.cosmosdb.operation_type" semantic conventions. It represents the + // cosmosDB Operation Type. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + DBCosmosDBOperationTypeKey = attribute.Key("db.cosmosdb.operation_type") + + // DBCosmosDBRequestChargeKey is the attribute Key conforming to the + // "db.cosmosdb.request_charge" semantic conventions. It represents the rU + // consumed for that operation + // + // Type: double + // RequirementLevel: Optional + // Stability: experimental + // Examples: 46.18, 1.0 + DBCosmosDBRequestChargeKey = attribute.Key("db.cosmosdb.request_charge") + + // DBCosmosDBRequestContentLengthKey is the attribute Key conforming to the + // "db.cosmosdb.request_content_length" semantic conventions. It represents + // the request payload size in bytes + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + DBCosmosDBRequestContentLengthKey = attribute.Key("db.cosmosdb.request_content_length") + + // DBCosmosDBStatusCodeKey is the attribute Key conforming to the + // "db.cosmosdb.status_code" semantic conventions. It represents the cosmos + // DB status code. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 200, 201 + DBCosmosDBStatusCodeKey = attribute.Key("db.cosmosdb.status_code") + + // DBCosmosDBSubStatusCodeKey is the attribute Key conforming to the + // "db.cosmosdb.sub_status_code" semantic conventions. It represents the + // cosmos DB sub status code. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1000, 1002 + DBCosmosDBSubStatusCodeKey = attribute.Key("db.cosmosdb.sub_status_code") +) + +var ( + // Gateway (HTTP) connections mode + DBCosmosDBConnectionModeGateway = DBCosmosDBConnectionModeKey.String("gateway") + // Direct connection + DBCosmosDBConnectionModeDirect = DBCosmosDBConnectionModeKey.String("direct") +) + +var ( + // invalid + DBCosmosDBOperationTypeInvalid = DBCosmosDBOperationTypeKey.String("Invalid") + // create + DBCosmosDBOperationTypeCreate = DBCosmosDBOperationTypeKey.String("Create") + // patch + DBCosmosDBOperationTypePatch = DBCosmosDBOperationTypeKey.String("Patch") + // read + DBCosmosDBOperationTypeRead = DBCosmosDBOperationTypeKey.String("Read") + // read_feed + DBCosmosDBOperationTypeReadFeed = DBCosmosDBOperationTypeKey.String("ReadFeed") + // delete + DBCosmosDBOperationTypeDelete = DBCosmosDBOperationTypeKey.String("Delete") + // replace + DBCosmosDBOperationTypeReplace = DBCosmosDBOperationTypeKey.String("Replace") + // execute + DBCosmosDBOperationTypeExecute = DBCosmosDBOperationTypeKey.String("Execute") + // query + DBCosmosDBOperationTypeQuery = DBCosmosDBOperationTypeKey.String("Query") + // head + DBCosmosDBOperationTypeHead = DBCosmosDBOperationTypeKey.String("Head") + // head_feed + DBCosmosDBOperationTypeHeadFeed = DBCosmosDBOperationTypeKey.String("HeadFeed") + // upsert + DBCosmosDBOperationTypeUpsert = DBCosmosDBOperationTypeKey.String("Upsert") + // batch + DBCosmosDBOperationTypeBatch = DBCosmosDBOperationTypeKey.String("Batch") + // query_plan + DBCosmosDBOperationTypeQueryPlan = DBCosmosDBOperationTypeKey.String("QueryPlan") + // execute_javascript + DBCosmosDBOperationTypeExecuteJavascript = DBCosmosDBOperationTypeKey.String("ExecuteJavaScript") +) + +// DBCosmosDBClientID returns an attribute KeyValue conforming to the +// "db.cosmosdb.client_id" semantic conventions. It represents the unique +// Cosmos client instance id. +func DBCosmosDBClientID(val string) attribute.KeyValue { + return DBCosmosDBClientIDKey.String(val) +} + +// DBCosmosDBRequestCharge returns an attribute KeyValue conforming to the +// "db.cosmosdb.request_charge" semantic conventions. It represents the rU +// consumed for that operation +func DBCosmosDBRequestCharge(val float64) attribute.KeyValue { + return DBCosmosDBRequestChargeKey.Float64(val) +} + +// DBCosmosDBRequestContentLength returns an attribute KeyValue conforming +// to the "db.cosmosdb.request_content_length" semantic conventions. It +// represents the request payload size in bytes +func DBCosmosDBRequestContentLength(val int) attribute.KeyValue { + return DBCosmosDBRequestContentLengthKey.Int(val) +} + +// DBCosmosDBStatusCode returns an attribute KeyValue conforming to the +// "db.cosmosdb.status_code" semantic conventions. It represents the cosmos DB +// status code. +func DBCosmosDBStatusCode(val int) attribute.KeyValue { + return DBCosmosDBStatusCodeKey.Int(val) +} + +// DBCosmosDBSubStatusCode returns an attribute KeyValue conforming to the +// "db.cosmosdb.sub_status_code" semantic conventions. It represents the cosmos +// DB sub status code. +func DBCosmosDBSubStatusCode(val int) attribute.KeyValue { + return DBCosmosDBSubStatusCodeKey.Int(val) +} + +// This group defines attributes for Elasticsearch. +const ( + // DBElasticsearchClusterNameKey is the attribute Key conforming to the + // "db.elasticsearch.cluster.name" semantic conventions. It represents the + // represents the identifier of an Elasticsearch cluster. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'e9106fc68e3044f0b1475b04bf4ffd5f' + DBElasticsearchClusterNameKey = attribute.Key("db.elasticsearch.cluster.name") + + // DBElasticsearchNodeNameKey is the attribute Key conforming to the + // "db.elasticsearch.node.name" semantic conventions. It represents the + // represents the human-readable identifier of the node/instance to which a + // request was routed. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'instance-0000000001' + DBElasticsearchNodeNameKey = attribute.Key("db.elasticsearch.node.name") +) + +// DBElasticsearchClusterName returns an attribute KeyValue conforming to +// the "db.elasticsearch.cluster.name" semantic conventions. It represents the +// represents the identifier of an Elasticsearch cluster. +func DBElasticsearchClusterName(val string) attribute.KeyValue { + return DBElasticsearchClusterNameKey.String(val) +} + +// DBElasticsearchNodeName returns an attribute KeyValue conforming to the +// "db.elasticsearch.node.name" semantic conventions. It represents the +// represents the human-readable identifier of the node/instance to which a +// request was routed. +func DBElasticsearchNodeName(val string) attribute.KeyValue { + return DBElasticsearchNodeNameKey.String(val) +} + +// Attributes for software deployments. +const ( + // DeploymentEnvironmentKey is the attribute Key conforming to the + // "deployment.environment" semantic conventions. It represents the name of + // the [deployment + // environment](https://wikipedia.org/wiki/Deployment_environment) (aka + // deployment tier). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'staging', 'production' + // Note: `deployment.environment` does not affect the uniqueness + // constraints defined through + // the `service.namespace`, `service.name` and `service.instance.id` + // resource attributes. + // This implies that resources carrying the following attribute + // combinations MUST be + // considered to be identifying the same service: + // + // * `service.name=frontend`, `deployment.environment=production` + // * `service.name=frontend`, `deployment.environment=staging`. + DeploymentEnvironmentKey = attribute.Key("deployment.environment") +) + +// DeploymentEnvironment returns an attribute KeyValue conforming to the +// "deployment.environment" semantic conventions. It represents the name of the +// [deployment environment](https://wikipedia.org/wiki/Deployment_environment) +// (aka deployment tier). +func DeploymentEnvironment(val string) attribute.KeyValue { + return DeploymentEnvironmentKey.String(val) +} + +// Attributes that represents an occurrence of a lifecycle transition on the +// Android platform. +const ( + // AndroidStateKey is the attribute Key conforming to the "android.state" + // semantic conventions. It represents the deprecated use the + // `device.app.lifecycle` event definition including `android.state` as a + // payload field instead. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Note: The Android lifecycle states are defined in [Activity lifecycle + // callbacks](https://developer.android.com/guide/components/activities/activity-lifecycle#lc), + // and from which the `OS identifiers` are derived. + AndroidStateKey = attribute.Key("android.state") +) + +var ( + // Any time before Activity.onResume() or, if the app has no Activity, Context.startService() has been called in the app for the first time + AndroidStateCreated = AndroidStateKey.String("created") + // Any time after Activity.onPause() or, if the app has no Activity, Context.stopService() has been called when the app was in the foreground state + AndroidStateBackground = AndroidStateKey.String("background") + // Any time after Activity.onResume() or, if the app has no Activity, Context.startService() has been called when the app was in either the created or background states + AndroidStateForeground = AndroidStateKey.String("foreground") +) + +// These attributes may be used to describe the receiver of a network +// exchange/packet. These should be used when there is no client/server +// relationship between the two sides, or when that relationship is unknown. +// This covers low-level network interactions (e.g. packet tracing) where you +// don't know if there was a connection or which side initiated it. This also +// covers unidirectional UDP flows and peer-to-peer communication where the +// "user-facing" surface of the protocol / API doesn't expose a clear notion of +// client and server. +const ( + // DestinationAddressKey is the attribute Key conforming to the + // "destination.address" semantic conventions. It represents the + // destination address - domain name if available without reverse DNS + // lookup; otherwise, IP address or Unix domain socket name. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'destination.example.com', '10.1.2.80', '/tmp/my.sock' + // Note: When observed from the source side, and when communicating through + // an intermediary, `destination.address` SHOULD represent the destination + // address behind any intermediaries, for example proxies, if it's + // available. + DestinationAddressKey = attribute.Key("destination.address") + + // DestinationPortKey is the attribute Key conforming to the + // "destination.port" semantic conventions. It represents the destination + // port number + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 3389, 2888 + DestinationPortKey = attribute.Key("destination.port") +) + +// DestinationAddress returns an attribute KeyValue conforming to the +// "destination.address" semantic conventions. It represents the destination +// address - domain name if available without reverse DNS lookup; otherwise, IP +// address or Unix domain socket name. +func DestinationAddress(val string) attribute.KeyValue { + return DestinationAddressKey.String(val) +} + +// DestinationPort returns an attribute KeyValue conforming to the +// "destination.port" semantic conventions. It represents the destination port +// number +func DestinationPort(val int) attribute.KeyValue { + return DestinationPortKey.Int(val) +} + +// Describes device attributes. +const ( + // DeviceIDKey is the attribute Key conforming to the "device.id" semantic + // conventions. It represents a unique identifier representing the device + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2ab2916d-a51f-4ac8-80ee-45ac31a28092' + // Note: The device identifier MUST only be defined using the values + // outlined below. This value is not an advertising identifier and MUST NOT + // be used as such. On iOS (Swift or Objective-C), this value MUST be equal + // to the [vendor + // identifier](https://developer.apple.com/documentation/uikit/uidevice/1620059-identifierforvendor). + // On Android (Java or Kotlin), this value MUST be equal to the Firebase + // Installation ID or a globally unique UUID which is persisted across + // sessions in your application. More information can be found + // [here](https://developer.android.com/training/articles/user-data-ids) on + // best practices and exact implementation details. Caution should be taken + // when storing personal data or anything which can identify a user. GDPR + // and data protection laws may apply, ensure you do your own due + // diligence. + DeviceIDKey = attribute.Key("device.id") + + // DeviceManufacturerKey is the attribute Key conforming to the + // "device.manufacturer" semantic conventions. It represents the name of + // the device manufacturer + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Apple', 'Samsung' + // Note: The Android OS provides this field via + // [Build](https://developer.android.com/reference/android/os/Build#MANUFACTURER). + // iOS apps SHOULD hardcode the value `Apple`. + DeviceManufacturerKey = attribute.Key("device.manufacturer") + + // DeviceModelIdentifierKey is the attribute Key conforming to the + // "device.model.identifier" semantic conventions. It represents the model + // identifier for the device + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'iPhone3,4', 'SM-G920F' + // Note: It's recommended this value represents a machine-readable version + // of the model identifier rather than the market or consumer-friendly name + // of the device. + DeviceModelIdentifierKey = attribute.Key("device.model.identifier") + + // DeviceModelNameKey is the attribute Key conforming to the + // "device.model.name" semantic conventions. It represents the marketing + // name for the device model + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'iPhone 6s Plus', 'Samsung Galaxy S6' + // Note: It's recommended this value represents a human-readable version of + // the device model rather than a machine-readable alternative. + DeviceModelNameKey = attribute.Key("device.model.name") +) + +// DeviceID returns an attribute KeyValue conforming to the "device.id" +// semantic conventions. It represents a unique identifier representing the +// device +func DeviceID(val string) attribute.KeyValue { + return DeviceIDKey.String(val) +} + +// DeviceManufacturer returns an attribute KeyValue conforming to the +// "device.manufacturer" semantic conventions. It represents the name of the +// device manufacturer +func DeviceManufacturer(val string) attribute.KeyValue { + return DeviceManufacturerKey.String(val) +} + +// DeviceModelIdentifier returns an attribute KeyValue conforming to the +// "device.model.identifier" semantic conventions. It represents the model +// identifier for the device +func DeviceModelIdentifier(val string) attribute.KeyValue { + return DeviceModelIdentifierKey.String(val) +} + +// DeviceModelName returns an attribute KeyValue conforming to the +// "device.model.name" semantic conventions. It represents the marketing name +// for the device model +func DeviceModelName(val string) attribute.KeyValue { + return DeviceModelNameKey.String(val) +} + +// These attributes may be used for any disk related operation. +const ( + // DiskIoDirectionKey is the attribute Key conforming to the + // "disk.io.direction" semantic conventions. It represents the disk IO + // operation direction. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'read' + DiskIoDirectionKey = attribute.Key("disk.io.direction") +) + +var ( + // read + DiskIoDirectionRead = DiskIoDirectionKey.String("read") + // write + DiskIoDirectionWrite = DiskIoDirectionKey.String("write") +) + +// The shared attributes used to report a DNS query. +const ( + // DNSQuestionNameKey is the attribute Key conforming to the + // "dns.question.name" semantic conventions. It represents the name being + // queried. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'www.example.com', 'opentelemetry.io' + // Note: If the name field contains non-printable characters (below 32 or + // above 126), those characters should be represented as escaped base 10 + // integers (\DDD). Back slashes and quotes should be escaped. Tabs, + // carriage returns, and line feeds should be converted to \t, \r, and \n + // respectively. + DNSQuestionNameKey = attribute.Key("dns.question.name") +) + +// DNSQuestionName returns an attribute KeyValue conforming to the +// "dns.question.name" semantic conventions. It represents the name being +// queried. +func DNSQuestionName(val string) attribute.KeyValue { + return DNSQuestionNameKey.String(val) +} + +// Attributes for operations with an authenticated and/or authorized enduser. +const ( + // EnduserIDKey is the attribute Key conforming to the "enduser.id" + // semantic conventions. It represents the username or client_id extracted + // from the access token or + // [Authorization](https://tools.ietf.org/html/rfc7235#section-4.2) header + // in the inbound request from outside the system. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'username' + EnduserIDKey = attribute.Key("enduser.id") + + // EnduserRoleKey is the attribute Key conforming to the "enduser.role" + // semantic conventions. It represents the actual/assumed role the client + // is making the request under extracted from token or application security + // context. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'admin' + EnduserRoleKey = attribute.Key("enduser.role") + + // EnduserScopeKey is the attribute Key conforming to the "enduser.scope" + // semantic conventions. It represents the scopes or granted authorities + // the client currently possesses extracted from token or application + // security context. The value would come from the scope associated with an + // [OAuth 2.0 Access + // Token](https://tools.ietf.org/html/rfc6749#section-3.3) or an attribute + // value in a [SAML 2.0 + // Assertion](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'read:message, write:files' + EnduserScopeKey = attribute.Key("enduser.scope") +) + +// EnduserID returns an attribute KeyValue conforming to the "enduser.id" +// semantic conventions. It represents the username or client_id extracted from +// the access token or +// [Authorization](https://tools.ietf.org/html/rfc7235#section-4.2) header in +// the inbound request from outside the system. +func EnduserID(val string) attribute.KeyValue { + return EnduserIDKey.String(val) +} + +// EnduserRole returns an attribute KeyValue conforming to the +// "enduser.role" semantic conventions. It represents the actual/assumed role +// the client is making the request under extracted from token or application +// security context. +func EnduserRole(val string) attribute.KeyValue { + return EnduserRoleKey.String(val) +} + +// EnduserScope returns an attribute KeyValue conforming to the +// "enduser.scope" semantic conventions. It represents the scopes or granted +// authorities the client currently possesses extracted from token or +// application security context. The value would come from the scope associated +// with an [OAuth 2.0 Access +// Token](https://tools.ietf.org/html/rfc6749#section-3.3) or an attribute +// value in a [SAML 2.0 +// Assertion](http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html). +func EnduserScope(val string) attribute.KeyValue { + return EnduserScopeKey.String(val) +} + +// The shared attributes used to report an error. +const ( + // ErrorTypeKey is the attribute Key conforming to the "error.type" + // semantic conventions. It represents the describes a class of error the + // operation ended with. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'timeout', 'java.net.UnknownHostException', + // 'server_certificate_invalid', '500' + // Note: The `error.type` SHOULD be predictable, and SHOULD have low + // cardinality. + // + // When `error.type` is set to a type (e.g., an exception type), its + // canonical class name identifying the type within the artifact SHOULD be + // used. + // + // Instrumentations SHOULD document the list of errors they report. + // + // The cardinality of `error.type` within one instrumentation library + // SHOULD be low. + // Telemetry consumers that aggregate data from multiple instrumentation + // libraries and applications + // should be prepared for `error.type` to have high cardinality at query + // time when no + // additional filters are applied. + // + // If the operation has completed successfully, instrumentations SHOULD NOT + // set `error.type`. + // + // If a specific domain defines its own set of error identifiers (such as + // HTTP or gRPC status codes), + // it's RECOMMENDED to: + // + // * Use a domain-specific attribute + // * Set `error.type` to capture all errors, regardless of whether they are + // defined within the domain-specific set or not. + ErrorTypeKey = attribute.Key("error.type") +) + +var ( + // A fallback error value to be used when the instrumentation doesn't define a custom value + ErrorTypeOther = ErrorTypeKey.String("_OTHER") +) + +// Attributes for Events represented using Log Records. +const ( + // EventNameKey is the attribute Key conforming to the "event.name" + // semantic conventions. It represents the identifies the class / type of + // event. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'browser.mouse.click', 'device.app.lifecycle' + // Note: Event names are subject to the same rules as [attribute + // names](https://github.com/open-telemetry/opentelemetry-specification/tree/v1.33.0/specification/common/attribute-naming.md). + // Notably, event names are namespaced to avoid collisions and provide a + // clean separation of semantics for events in separate domains like + // browser, mobile, and kubernetes. + EventNameKey = attribute.Key("event.name") +) + +// EventName returns an attribute KeyValue conforming to the "event.name" +// semantic conventions. It represents the identifies the class / type of +// event. +func EventName(val string) attribute.KeyValue { + return EventNameKey.String(val) +} + +// The shared attributes used to report a single exception associated with a +// span or log. +const ( + // ExceptionEscapedKey is the attribute Key conforming to the + // "exception.escaped" semantic conventions. It represents the sHOULD be + // set to true if the exception event is recorded at a point where it is + // known that the exception is escaping the scope of the span. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + // Note: An exception is considered to have escaped (or left) the scope of + // a span, + // if that span is ended while the exception is still logically "in + // flight". + // This may be actually "in flight" in some languages (e.g. if the + // exception + // is passed to a Context manager's `__exit__` method in Python) but will + // usually be caught at the point of recording the exception in most + // languages. + // + // It is usually not possible to determine at the point where an exception + // is thrown + // whether it will escape the scope of a span. + // However, it is trivial to know that an exception + // will escape, if one checks for an active exception just before ending + // the span, + // as done in the [example for recording span + // exceptions](https://opentelemetry.io/docs/specs/semconv/exceptions/exceptions-spans/#recording-an-exception). + // + // It follows that an exception may still escape the scope of the span + // even if the `exception.escaped` attribute was not set or set to false, + // since the event might have been recorded at a time where it was not + // clear whether the exception will escape. + ExceptionEscapedKey = attribute.Key("exception.escaped") + + // ExceptionMessageKey is the attribute Key conforming to the + // "exception.message" semantic conventions. It represents the exception + // message. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Division by zero', "Can't convert 'int' object to str + // implicitly" + ExceptionMessageKey = attribute.Key("exception.message") + + // ExceptionStacktraceKey is the attribute Key conforming to the + // "exception.stacktrace" semantic conventions. It represents a stacktrace + // as a string in the natural representation for the language runtime. The + // representation is to be determined and documented by each language SIG. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'Exception in thread "main" java.lang.RuntimeException: Test + // exception\\n at ' + // 'com.example.GenerateTrace.methodB(GenerateTrace.java:13)\\n at ' + // 'com.example.GenerateTrace.methodA(GenerateTrace.java:9)\\n at ' + // 'com.example.GenerateTrace.main(GenerateTrace.java:5)' + ExceptionStacktraceKey = attribute.Key("exception.stacktrace") + + // ExceptionTypeKey is the attribute Key conforming to the "exception.type" + // semantic conventions. It represents the type of the exception (its + // fully-qualified class name, if applicable). The dynamic type of the + // exception should be preferred over the static type in languages that + // support it. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'java.net.ConnectException', 'OSError' + ExceptionTypeKey = attribute.Key("exception.type") +) + +// ExceptionEscaped returns an attribute KeyValue conforming to the +// "exception.escaped" semantic conventions. It represents the sHOULD be set to +// true if the exception event is recorded at a point where it is known that +// the exception is escaping the scope of the span. +func ExceptionEscaped(val bool) attribute.KeyValue { + return ExceptionEscapedKey.Bool(val) +} + +// ExceptionMessage returns an attribute KeyValue conforming to the +// "exception.message" semantic conventions. It represents the exception +// message. +func ExceptionMessage(val string) attribute.KeyValue { + return ExceptionMessageKey.String(val) +} + +// ExceptionStacktrace returns an attribute KeyValue conforming to the +// "exception.stacktrace" semantic conventions. It represents a stacktrace as a +// string in the natural representation for the language runtime. The +// representation is to be determined and documented by each language SIG. +func ExceptionStacktrace(val string) attribute.KeyValue { + return ExceptionStacktraceKey.String(val) +} + +// ExceptionType returns an attribute KeyValue conforming to the +// "exception.type" semantic conventions. It represents the type of the +// exception (its fully-qualified class name, if applicable). The dynamic type +// of the exception should be preferred over the static type in languages that +// support it. +func ExceptionType(val string) attribute.KeyValue { + return ExceptionTypeKey.String(val) +} + +// FaaS attributes +const ( + // FaaSColdstartKey is the attribute Key conforming to the "faas.coldstart" + // semantic conventions. It represents a boolean that is true if the + // serverless function is executed for the first time (aka cold-start). + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + FaaSColdstartKey = attribute.Key("faas.coldstart") + + // FaaSCronKey is the attribute Key conforming to the "faas.cron" semantic + // conventions. It represents a string containing the schedule period as + // [Cron + // Expression](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '0/5 * * * ? *' + FaaSCronKey = attribute.Key("faas.cron") + + // FaaSDocumentCollectionKey is the attribute Key conforming to the + // "faas.document.collection" semantic conventions. It represents the name + // of the source on which the triggering operation was performed. For + // example, in Cloud Storage or S3 corresponds to the bucket name, and in + // Cosmos DB to the database name. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'myBucketName', 'myDBName' + FaaSDocumentCollectionKey = attribute.Key("faas.document.collection") + + // FaaSDocumentNameKey is the attribute Key conforming to the + // "faas.document.name" semantic conventions. It represents the document + // name/table subjected to the operation. For example, in Cloud Storage or + // S3 is the name of the file, and in Cosmos DB the table name. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'myFile.txt', 'myTableName' + FaaSDocumentNameKey = attribute.Key("faas.document.name") + + // FaaSDocumentOperationKey is the attribute Key conforming to the + // "faas.document.operation" semantic conventions. It represents the + // describes the type of the operation that was performed on the data. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + FaaSDocumentOperationKey = attribute.Key("faas.document.operation") + + // FaaSDocumentTimeKey is the attribute Key conforming to the + // "faas.document.time" semantic conventions. It represents a string + // containing the time when the data was accessed in the [ISO + // 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format + // expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2020-01-23T13:47:06Z' + FaaSDocumentTimeKey = attribute.Key("faas.document.time") + + // FaaSInstanceKey is the attribute Key conforming to the "faas.instance" + // semantic conventions. It represents the execution environment ID as a + // string, that will be potentially reused for other invocations to the + // same function/function version. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2021/06/28/[$LATEST]2f399eb14537447da05ab2a2e39309de' + // Note: * **AWS Lambda:** Use the (full) log stream name. + FaaSInstanceKey = attribute.Key("faas.instance") + + // FaaSInvocationIDKey is the attribute Key conforming to the + // "faas.invocation_id" semantic conventions. It represents the invocation + // ID of the current function invocation. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'af9d5aa4-a685-4c5f-a22b-444f80b3cc28' + FaaSInvocationIDKey = attribute.Key("faas.invocation_id") + + // FaaSInvokedNameKey is the attribute Key conforming to the + // "faas.invoked_name" semantic conventions. It represents the name of the + // invoked function. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'my-function' + // Note: SHOULD be equal to the `faas.name` resource attribute of the + // invoked function. + FaaSInvokedNameKey = attribute.Key("faas.invoked_name") + + // FaaSInvokedProviderKey is the attribute Key conforming to the + // "faas.invoked_provider" semantic conventions. It represents the cloud + // provider of the invoked function. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Note: SHOULD be equal to the `cloud.provider` resource attribute of the + // invoked function. + FaaSInvokedProviderKey = attribute.Key("faas.invoked_provider") + + // FaaSInvokedRegionKey is the attribute Key conforming to the + // "faas.invoked_region" semantic conventions. It represents the cloud + // region of the invoked function. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'eu-central-1' + // Note: SHOULD be equal to the `cloud.region` resource attribute of the + // invoked function. + FaaSInvokedRegionKey = attribute.Key("faas.invoked_region") + + // FaaSMaxMemoryKey is the attribute Key conforming to the + // "faas.max_memory" semantic conventions. It represents the amount of + // memory available to the serverless function converted to Bytes. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 134217728 + // Note: It's recommended to set this attribute since e.g. too little + // memory can easily stop a Java AWS Lambda function from working + // correctly. On AWS Lambda, the environment variable + // `AWS_LAMBDA_FUNCTION_MEMORY_SIZE` provides this information (which must + // be multiplied by 1,048,576). + FaaSMaxMemoryKey = attribute.Key("faas.max_memory") + + // FaaSNameKey is the attribute Key conforming to the "faas.name" semantic + // conventions. It represents the name of the single function that this + // runtime instance executes. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'my-function', 'myazurefunctionapp/some-function-name' + // Note: This is the name of the function as configured/deployed on the + // FaaS + // platform and is usually different from the name of the callback + // function (which may be stored in the + // [`code.namespace`/`code.function`](/docs/general/attributes.md#source-code-attributes) + // span attributes). + // + // For some cloud providers, the above definition is ambiguous. The + // following + // definition of function name MUST be used for this attribute + // (and consequently the span name) for the listed cloud + // providers/products: + // + // * **Azure:** The full name `/`, i.e., function app name + // followed by a forward slash followed by the function name (this form + // can also be seen in the resource JSON for the function). + // This means that a span attribute MUST be used, as an Azure function + // app can host multiple functions that would usually share + // a TracerProvider (see also the `cloud.resource_id` attribute). + FaaSNameKey = attribute.Key("faas.name") + + // FaaSTimeKey is the attribute Key conforming to the "faas.time" semantic + // conventions. It represents a string containing the function invocation + // time in the [ISO + // 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format + // expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2020-01-23T13:47:06Z' + FaaSTimeKey = attribute.Key("faas.time") + + // FaaSTriggerKey is the attribute Key conforming to the "faas.trigger" + // semantic conventions. It represents the type of the trigger which caused + // this function invocation. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + FaaSTriggerKey = attribute.Key("faas.trigger") + + // FaaSVersionKey is the attribute Key conforming to the "faas.version" + // semantic conventions. It represents the immutable version of the + // function being executed. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '26', 'pinkfroid-00002' + // Note: Depending on the cloud provider and platform, use: + // + // * **AWS Lambda:** The [function + // version](https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html) + // (an integer represented as a decimal string). + // * **Google Cloud Run (Services):** The + // [revision](https://cloud.google.com/run/docs/managing/revisions) + // (i.e., the function name plus the revision suffix). + // * **Google Cloud Functions:** The value of the + // [`K_REVISION` environment + // variable](https://cloud.google.com/functions/docs/env-var#runtime_environment_variables_set_automatically). + // * **Azure Functions:** Not applicable. Do not set this attribute. + FaaSVersionKey = attribute.Key("faas.version") +) + +var ( + // When a new object is created + FaaSDocumentOperationInsert = FaaSDocumentOperationKey.String("insert") + // When an object is modified + FaaSDocumentOperationEdit = FaaSDocumentOperationKey.String("edit") + // When an object is deleted + FaaSDocumentOperationDelete = FaaSDocumentOperationKey.String("delete") +) + +var ( + // Alibaba Cloud + FaaSInvokedProviderAlibabaCloud = FaaSInvokedProviderKey.String("alibaba_cloud") + // Amazon Web Services + FaaSInvokedProviderAWS = FaaSInvokedProviderKey.String("aws") + // Microsoft Azure + FaaSInvokedProviderAzure = FaaSInvokedProviderKey.String("azure") + // Google Cloud Platform + FaaSInvokedProviderGCP = FaaSInvokedProviderKey.String("gcp") + // Tencent Cloud + FaaSInvokedProviderTencentCloud = FaaSInvokedProviderKey.String("tencent_cloud") +) + +var ( + // A response to some data source operation such as a database or filesystem read/write + FaaSTriggerDatasource = FaaSTriggerKey.String("datasource") + // To provide an answer to an inbound HTTP request + FaaSTriggerHTTP = FaaSTriggerKey.String("http") + // A function is set to be executed when messages are sent to a messaging system + FaaSTriggerPubsub = FaaSTriggerKey.String("pubsub") + // A function is scheduled to be executed regularly + FaaSTriggerTimer = FaaSTriggerKey.String("timer") + // If none of the others apply + FaaSTriggerOther = FaaSTriggerKey.String("other") +) + +// FaaSColdstart returns an attribute KeyValue conforming to the +// "faas.coldstart" semantic conventions. It represents a boolean that is true +// if the serverless function is executed for the first time (aka cold-start). +func FaaSColdstart(val bool) attribute.KeyValue { + return FaaSColdstartKey.Bool(val) +} + +// FaaSCron returns an attribute KeyValue conforming to the "faas.cron" +// semantic conventions. It represents a string containing the schedule period +// as [Cron +// Expression](https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm). +func FaaSCron(val string) attribute.KeyValue { + return FaaSCronKey.String(val) +} + +// FaaSDocumentCollection returns an attribute KeyValue conforming to the +// "faas.document.collection" semantic conventions. It represents the name of +// the source on which the triggering operation was performed. For example, in +// Cloud Storage or S3 corresponds to the bucket name, and in Cosmos DB to the +// database name. +func FaaSDocumentCollection(val string) attribute.KeyValue { + return FaaSDocumentCollectionKey.String(val) +} + +// FaaSDocumentName returns an attribute KeyValue conforming to the +// "faas.document.name" semantic conventions. It represents the document +// name/table subjected to the operation. For example, in Cloud Storage or S3 +// is the name of the file, and in Cosmos DB the table name. +func FaaSDocumentName(val string) attribute.KeyValue { + return FaaSDocumentNameKey.String(val) +} + +// FaaSDocumentTime returns an attribute KeyValue conforming to the +// "faas.document.time" semantic conventions. It represents a string containing +// the time when the data was accessed in the [ISO +// 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format +// expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). +func FaaSDocumentTime(val string) attribute.KeyValue { + return FaaSDocumentTimeKey.String(val) +} + +// FaaSInstance returns an attribute KeyValue conforming to the +// "faas.instance" semantic conventions. It represents the execution +// environment ID as a string, that will be potentially reused for other +// invocations to the same function/function version. +func FaaSInstance(val string) attribute.KeyValue { + return FaaSInstanceKey.String(val) +} + +// FaaSInvocationID returns an attribute KeyValue conforming to the +// "faas.invocation_id" semantic conventions. It represents the invocation ID +// of the current function invocation. +func FaaSInvocationID(val string) attribute.KeyValue { + return FaaSInvocationIDKey.String(val) +} + +// FaaSInvokedName returns an attribute KeyValue conforming to the +// "faas.invoked_name" semantic conventions. It represents the name of the +// invoked function. +func FaaSInvokedName(val string) attribute.KeyValue { + return FaaSInvokedNameKey.String(val) +} + +// FaaSInvokedRegion returns an attribute KeyValue conforming to the +// "faas.invoked_region" semantic conventions. It represents the cloud region +// of the invoked function. +func FaaSInvokedRegion(val string) attribute.KeyValue { + return FaaSInvokedRegionKey.String(val) +} + +// FaaSMaxMemory returns an attribute KeyValue conforming to the +// "faas.max_memory" semantic conventions. It represents the amount of memory +// available to the serverless function converted to Bytes. +func FaaSMaxMemory(val int) attribute.KeyValue { + return FaaSMaxMemoryKey.Int(val) +} + +// FaaSName returns an attribute KeyValue conforming to the "faas.name" +// semantic conventions. It represents the name of the single function that +// this runtime instance executes. +func FaaSName(val string) attribute.KeyValue { + return FaaSNameKey.String(val) +} + +// FaaSTime returns an attribute KeyValue conforming to the "faas.time" +// semantic conventions. It represents a string containing the function +// invocation time in the [ISO +// 8601](https://www.iso.org/iso-8601-date-and-time-format.html) format +// expressed in [UTC](https://www.w3.org/TR/NOTE-datetime). +func FaaSTime(val string) attribute.KeyValue { + return FaaSTimeKey.String(val) +} + +// FaaSVersion returns an attribute KeyValue conforming to the +// "faas.version" semantic conventions. It represents the immutable version of +// the function being executed. +func FaaSVersion(val string) attribute.KeyValue { + return FaaSVersionKey.String(val) +} + +// Attributes for Feature Flags. +const ( + // FeatureFlagKeyKey is the attribute Key conforming to the + // "feature_flag.key" semantic conventions. It represents the unique + // identifier of the feature flag. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'logo-color' + FeatureFlagKeyKey = attribute.Key("feature_flag.key") + + // FeatureFlagProviderNameKey is the attribute Key conforming to the + // "feature_flag.provider_name" semantic conventions. It represents the + // name of the service provider that performs the flag evaluation. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Flag Manager' + FeatureFlagProviderNameKey = attribute.Key("feature_flag.provider_name") + + // FeatureFlagVariantKey is the attribute Key conforming to the + // "feature_flag.variant" semantic conventions. It represents the sHOULD be + // a semantic identifier for a value. If one is unavailable, a stringified + // version of the value can be used. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'red', 'true', 'on' + // Note: A semantic identifier, commonly referred to as a variant, provides + // a means + // for referring to a value without including the value itself. This can + // provide additional context for understanding the meaning behind a value. + // For example, the variant `red` maybe be used for the value `#c05543`. + // + // A stringified version of the value can be used in situations where a + // semantic identifier is unavailable. String representation of the value + // should be determined by the implementer. + FeatureFlagVariantKey = attribute.Key("feature_flag.variant") +) + +// FeatureFlagKey returns an attribute KeyValue conforming to the +// "feature_flag.key" semantic conventions. It represents the unique identifier +// of the feature flag. +func FeatureFlagKey(val string) attribute.KeyValue { + return FeatureFlagKeyKey.String(val) +} + +// FeatureFlagProviderName returns an attribute KeyValue conforming to the +// "feature_flag.provider_name" semantic conventions. It represents the name of +// the service provider that performs the flag evaluation. +func FeatureFlagProviderName(val string) attribute.KeyValue { + return FeatureFlagProviderNameKey.String(val) +} + +// FeatureFlagVariant returns an attribute KeyValue conforming to the +// "feature_flag.variant" semantic conventions. It represents the sHOULD be a +// semantic identifier for a value. If one is unavailable, a stringified +// version of the value can be used. +func FeatureFlagVariant(val string) attribute.KeyValue { + return FeatureFlagVariantKey.String(val) +} + +// Describes file attributes. +const ( + // FileDirectoryKey is the attribute Key conforming to the "file.directory" + // semantic conventions. It represents the directory where the file is + // located. It should include the drive letter, when appropriate. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/home/user', 'C:\\Program Files\\MyApp' + FileDirectoryKey = attribute.Key("file.directory") + + // FileExtensionKey is the attribute Key conforming to the "file.extension" + // semantic conventions. It represents the file extension, excluding the + // leading dot. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'png', 'gz' + // Note: When the file name has multiple extensions (example.tar.gz), only + // the last one should be captured ("gz", not "tar.gz"). + FileExtensionKey = attribute.Key("file.extension") + + // FileNameKey is the attribute Key conforming to the "file.name" semantic + // conventions. It represents the name of the file including the extension, + // without the directory. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'example.png' + FileNameKey = attribute.Key("file.name") + + // FilePathKey is the attribute Key conforming to the "file.path" semantic + // conventions. It represents the full path to the file, including the file + // name. It should include the drive letter, when appropriate. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/home/alice/example.png', 'C:\\Program + // Files\\MyApp\\myapp.exe' + FilePathKey = attribute.Key("file.path") + + // FileSizeKey is the attribute Key conforming to the "file.size" semantic + // conventions. It represents the file size in bytes. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + FileSizeKey = attribute.Key("file.size") +) + +// FileDirectory returns an attribute KeyValue conforming to the +// "file.directory" semantic conventions. It represents the directory where the +// file is located. It should include the drive letter, when appropriate. +func FileDirectory(val string) attribute.KeyValue { + return FileDirectoryKey.String(val) +} + +// FileExtension returns an attribute KeyValue conforming to the +// "file.extension" semantic conventions. It represents the file extension, +// excluding the leading dot. +func FileExtension(val string) attribute.KeyValue { + return FileExtensionKey.String(val) +} + +// FileName returns an attribute KeyValue conforming to the "file.name" +// semantic conventions. It represents the name of the file including the +// extension, without the directory. +func FileName(val string) attribute.KeyValue { + return FileNameKey.String(val) +} + +// FilePath returns an attribute KeyValue conforming to the "file.path" +// semantic conventions. It represents the full path to the file, including the +// file name. It should include the drive letter, when appropriate. +func FilePath(val string) attribute.KeyValue { + return FilePathKey.String(val) +} + +// FileSize returns an attribute KeyValue conforming to the "file.size" +// semantic conventions. It represents the file size in bytes. +func FileSize(val int) attribute.KeyValue { + return FileSizeKey.Int(val) +} + +// Attributes for Google Cloud Run. +const ( + // GCPCloudRunJobExecutionKey is the attribute Key conforming to the + // "gcp.cloud_run.job.execution" semantic conventions. It represents the + // name of the Cloud Run + // [execution](https://cloud.google.com/run/docs/managing/job-executions) + // being run for the Job, as set by the + // [`CLOUD_RUN_EXECUTION`](https://cloud.google.com/run/docs/container-contract#jobs-env-vars) + // environment variable. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'job-name-xxxx', 'sample-job-mdw84' + GCPCloudRunJobExecutionKey = attribute.Key("gcp.cloud_run.job.execution") + + // GCPCloudRunJobTaskIndexKey is the attribute Key conforming to the + // "gcp.cloud_run.job.task_index" semantic conventions. It represents the + // index for a task within an execution as provided by the + // [`CLOUD_RUN_TASK_INDEX`](https://cloud.google.com/run/docs/container-contract#jobs-env-vars) + // environment variable. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 0, 1 + GCPCloudRunJobTaskIndexKey = attribute.Key("gcp.cloud_run.job.task_index") +) + +// GCPCloudRunJobExecution returns an attribute KeyValue conforming to the +// "gcp.cloud_run.job.execution" semantic conventions. It represents the name +// of the Cloud Run +// [execution](https://cloud.google.com/run/docs/managing/job-executions) being +// run for the Job, as set by the +// [`CLOUD_RUN_EXECUTION`](https://cloud.google.com/run/docs/container-contract#jobs-env-vars) +// environment variable. +func GCPCloudRunJobExecution(val string) attribute.KeyValue { + return GCPCloudRunJobExecutionKey.String(val) +} + +// GCPCloudRunJobTaskIndex returns an attribute KeyValue conforming to the +// "gcp.cloud_run.job.task_index" semantic conventions. It represents the index +// for a task within an execution as provided by the +// [`CLOUD_RUN_TASK_INDEX`](https://cloud.google.com/run/docs/container-contract#jobs-env-vars) +// environment variable. +func GCPCloudRunJobTaskIndex(val int) attribute.KeyValue { + return GCPCloudRunJobTaskIndexKey.Int(val) +} + +// Attributes for Google Compute Engine (GCE). +const ( + // GCPGceInstanceHostnameKey is the attribute Key conforming to the + // "gcp.gce.instance.hostname" semantic conventions. It represents the + // hostname of a GCE instance. This is the full value of the default or + // [custom + // hostname](https://cloud.google.com/compute/docs/instances/custom-hostname-vm). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'my-host1234.example.com', + // 'sample-vm.us-west1-b.c.my-project.internal' + GCPGceInstanceHostnameKey = attribute.Key("gcp.gce.instance.hostname") + + // GCPGceInstanceNameKey is the attribute Key conforming to the + // "gcp.gce.instance.name" semantic conventions. It represents the instance + // name of a GCE instance. This is the value provided by `host.name`, the + // visible name of the instance in the Cloud Console UI, and the prefix for + // the default hostname of the instance as defined by the [default internal + // DNS + // name](https://cloud.google.com/compute/docs/internal-dns#instance-fully-qualified-domain-names). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'instance-1', 'my-vm-name' + GCPGceInstanceNameKey = attribute.Key("gcp.gce.instance.name") +) + +// GCPGceInstanceHostname returns an attribute KeyValue conforming to the +// "gcp.gce.instance.hostname" semantic conventions. It represents the hostname +// of a GCE instance. This is the full value of the default or [custom +// hostname](https://cloud.google.com/compute/docs/instances/custom-hostname-vm). +func GCPGceInstanceHostname(val string) attribute.KeyValue { + return GCPGceInstanceHostnameKey.String(val) +} + +// GCPGceInstanceName returns an attribute KeyValue conforming to the +// "gcp.gce.instance.name" semantic conventions. It represents the instance +// name of a GCE instance. This is the value provided by `host.name`, the +// visible name of the instance in the Cloud Console UI, and the prefix for the +// default hostname of the instance as defined by the [default internal DNS +// name](https://cloud.google.com/compute/docs/internal-dns#instance-fully-qualified-domain-names). +func GCPGceInstanceName(val string) attribute.KeyValue { + return GCPGceInstanceNameKey.String(val) +} + +// The attributes used to describe telemetry in the context of LLM (Large +// Language Models) requests and responses. +const ( + // GenAiCompletionKey is the attribute Key conforming to the + // "gen_ai.completion" semantic conventions. It represents the full + // response received from the LLM. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: "[{'role': 'assistant', 'content': 'The capital of France is + // Paris.'}]" + // Note: It's RECOMMENDED to format completions as JSON string matching + // [OpenAI messages + // format](https://platform.openai.com/docs/guides/text-generation) + GenAiCompletionKey = attribute.Key("gen_ai.completion") + + // GenAiPromptKey is the attribute Key conforming to the "gen_ai.prompt" + // semantic conventions. It represents the full prompt sent to an LLM. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: "[{'role': 'user', 'content': 'What is the capital of + // France?'}]" + // Note: It's RECOMMENDED to format prompts as JSON string matching [OpenAI + // messages + // format](https://platform.openai.com/docs/guides/text-generation) + GenAiPromptKey = attribute.Key("gen_ai.prompt") + + // GenAiRequestMaxTokensKey is the attribute Key conforming to the + // "gen_ai.request.max_tokens" semantic conventions. It represents the + // maximum number of tokens the LLM generates for a request. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 100 + GenAiRequestMaxTokensKey = attribute.Key("gen_ai.request.max_tokens") + + // GenAiRequestModelKey is the attribute Key conforming to the + // "gen_ai.request.model" semantic conventions. It represents the name of + // the LLM a request is being made to. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'gpt-4' + GenAiRequestModelKey = attribute.Key("gen_ai.request.model") + + // GenAiRequestTemperatureKey is the attribute Key conforming to the + // "gen_ai.request.temperature" semantic conventions. It represents the + // temperature setting for the LLM request. + // + // Type: double + // RequirementLevel: Optional + // Stability: experimental + // Examples: 0.0 + GenAiRequestTemperatureKey = attribute.Key("gen_ai.request.temperature") + + // GenAiRequestTopPKey is the attribute Key conforming to the + // "gen_ai.request.top_p" semantic conventions. It represents the top_p + // sampling setting for the LLM request. + // + // Type: double + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1.0 + GenAiRequestTopPKey = attribute.Key("gen_ai.request.top_p") + + // GenAiResponseFinishReasonsKey is the attribute Key conforming to the + // "gen_ai.response.finish_reasons" semantic conventions. It represents the + // array of reasons the model stopped generating tokens, corresponding to + // each generation received. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'stop' + GenAiResponseFinishReasonsKey = attribute.Key("gen_ai.response.finish_reasons") + + // GenAiResponseIDKey is the attribute Key conforming to the + // "gen_ai.response.id" semantic conventions. It represents the unique + // identifier for the completion. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'chatcmpl-123' + GenAiResponseIDKey = attribute.Key("gen_ai.response.id") + + // GenAiResponseModelKey is the attribute Key conforming to the + // "gen_ai.response.model" semantic conventions. It represents the name of + // the LLM a response was generated from. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'gpt-4-0613' + GenAiResponseModelKey = attribute.Key("gen_ai.response.model") + + // GenAiSystemKey is the attribute Key conforming to the "gen_ai.system" + // semantic conventions. It represents the Generative AI product as + // identified by the client instrumentation. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'openai' + // Note: The actual GenAI product may differ from the one identified by the + // client. For example, when using OpenAI client libraries to communicate + // with Mistral, the `gen_ai.system` is set to `openai` based on the + // instrumentation's best knowledge. + GenAiSystemKey = attribute.Key("gen_ai.system") + + // GenAiUsageCompletionTokensKey is the attribute Key conforming to the + // "gen_ai.usage.completion_tokens" semantic conventions. It represents the + // number of tokens used in the LLM response (completion). + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 180 + GenAiUsageCompletionTokensKey = attribute.Key("gen_ai.usage.completion_tokens") + + // GenAiUsagePromptTokensKey is the attribute Key conforming to the + // "gen_ai.usage.prompt_tokens" semantic conventions. It represents the + // number of tokens used in the LLM prompt. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 100 + GenAiUsagePromptTokensKey = attribute.Key("gen_ai.usage.prompt_tokens") +) + +var ( + // OpenAI + GenAiSystemOpenai = GenAiSystemKey.String("openai") +) + +// GenAiCompletion returns an attribute KeyValue conforming to the +// "gen_ai.completion" semantic conventions. It represents the full response +// received from the LLM. +func GenAiCompletion(val string) attribute.KeyValue { + return GenAiCompletionKey.String(val) +} + +// GenAiPrompt returns an attribute KeyValue conforming to the +// "gen_ai.prompt" semantic conventions. It represents the full prompt sent to +// an LLM. +func GenAiPrompt(val string) attribute.KeyValue { + return GenAiPromptKey.String(val) +} + +// GenAiRequestMaxTokens returns an attribute KeyValue conforming to the +// "gen_ai.request.max_tokens" semantic conventions. It represents the maximum +// number of tokens the LLM generates for a request. +func GenAiRequestMaxTokens(val int) attribute.KeyValue { + return GenAiRequestMaxTokensKey.Int(val) +} + +// GenAiRequestModel returns an attribute KeyValue conforming to the +// "gen_ai.request.model" semantic conventions. It represents the name of the +// LLM a request is being made to. +func GenAiRequestModel(val string) attribute.KeyValue { + return GenAiRequestModelKey.String(val) +} + +// GenAiRequestTemperature returns an attribute KeyValue conforming to the +// "gen_ai.request.temperature" semantic conventions. It represents the +// temperature setting for the LLM request. +func GenAiRequestTemperature(val float64) attribute.KeyValue { + return GenAiRequestTemperatureKey.Float64(val) +} + +// GenAiRequestTopP returns an attribute KeyValue conforming to the +// "gen_ai.request.top_p" semantic conventions. It represents the top_p +// sampling setting for the LLM request. +func GenAiRequestTopP(val float64) attribute.KeyValue { + return GenAiRequestTopPKey.Float64(val) +} + +// GenAiResponseFinishReasons returns an attribute KeyValue conforming to +// the "gen_ai.response.finish_reasons" semantic conventions. It represents the +// array of reasons the model stopped generating tokens, corresponding to each +// generation received. +func GenAiResponseFinishReasons(val ...string) attribute.KeyValue { + return GenAiResponseFinishReasonsKey.StringSlice(val) +} + +// GenAiResponseID returns an attribute KeyValue conforming to the +// "gen_ai.response.id" semantic conventions. It represents the unique +// identifier for the completion. +func GenAiResponseID(val string) attribute.KeyValue { + return GenAiResponseIDKey.String(val) +} + +// GenAiResponseModel returns an attribute KeyValue conforming to the +// "gen_ai.response.model" semantic conventions. It represents the name of the +// LLM a response was generated from. +func GenAiResponseModel(val string) attribute.KeyValue { + return GenAiResponseModelKey.String(val) +} + +// GenAiUsageCompletionTokens returns an attribute KeyValue conforming to +// the "gen_ai.usage.completion_tokens" semantic conventions. It represents the +// number of tokens used in the LLM response (completion). +func GenAiUsageCompletionTokens(val int) attribute.KeyValue { + return GenAiUsageCompletionTokensKey.Int(val) +} + +// GenAiUsagePromptTokens returns an attribute KeyValue conforming to the +// "gen_ai.usage.prompt_tokens" semantic conventions. It represents the number +// of tokens used in the LLM prompt. +func GenAiUsagePromptTokens(val int) attribute.KeyValue { + return GenAiUsagePromptTokensKey.Int(val) +} + +// Attributes for GraphQL. +const ( + // GraphqlDocumentKey is the attribute Key conforming to the + // "graphql.document" semantic conventions. It represents the GraphQL + // document being executed. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'query findBookByID { bookByID(id: ?) { name } }' + // Note: The value may be sanitized to exclude sensitive information. + GraphqlDocumentKey = attribute.Key("graphql.document") + + // GraphqlOperationNameKey is the attribute Key conforming to the + // "graphql.operation.name" semantic conventions. It represents the name of + // the operation being executed. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'findBookByID' + GraphqlOperationNameKey = attribute.Key("graphql.operation.name") + + // GraphqlOperationTypeKey is the attribute Key conforming to the + // "graphql.operation.type" semantic conventions. It represents the type of + // the operation being executed. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'query', 'mutation', 'subscription' + GraphqlOperationTypeKey = attribute.Key("graphql.operation.type") +) + +var ( + // GraphQL query + GraphqlOperationTypeQuery = GraphqlOperationTypeKey.String("query") + // GraphQL mutation + GraphqlOperationTypeMutation = GraphqlOperationTypeKey.String("mutation") + // GraphQL subscription + GraphqlOperationTypeSubscription = GraphqlOperationTypeKey.String("subscription") +) + +// GraphqlDocument returns an attribute KeyValue conforming to the +// "graphql.document" semantic conventions. It represents the GraphQL document +// being executed. +func GraphqlDocument(val string) attribute.KeyValue { + return GraphqlDocumentKey.String(val) +} + +// GraphqlOperationName returns an attribute KeyValue conforming to the +// "graphql.operation.name" semantic conventions. It represents the name of the +// operation being executed. +func GraphqlOperationName(val string) attribute.KeyValue { + return GraphqlOperationNameKey.String(val) +} + +// Attributes for the Android platform on which the Android application is +// running. +const ( + // HerokuAppIDKey is the attribute Key conforming to the "heroku.app.id" + // semantic conventions. It represents the unique identifier for the + // application + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2daa2797-e42b-4624-9322-ec3f968df4da' + HerokuAppIDKey = attribute.Key("heroku.app.id") + + // HerokuReleaseCommitKey is the attribute Key conforming to the + // "heroku.release.commit" semantic conventions. It represents the commit + // hash for the current release + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'e6134959463efd8966b20e75b913cafe3f5ec' + HerokuReleaseCommitKey = attribute.Key("heroku.release.commit") + + // HerokuReleaseCreationTimestampKey is the attribute Key conforming to the + // "heroku.release.creation_timestamp" semantic conventions. It represents + // the time and date the release was created + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2022-10-23T18:00:42Z' + HerokuReleaseCreationTimestampKey = attribute.Key("heroku.release.creation_timestamp") +) + +// HerokuAppID returns an attribute KeyValue conforming to the +// "heroku.app.id" semantic conventions. It represents the unique identifier +// for the application +func HerokuAppID(val string) attribute.KeyValue { + return HerokuAppIDKey.String(val) +} + +// HerokuReleaseCommit returns an attribute KeyValue conforming to the +// "heroku.release.commit" semantic conventions. It represents the commit hash +// for the current release +func HerokuReleaseCommit(val string) attribute.KeyValue { + return HerokuReleaseCommitKey.String(val) +} + +// HerokuReleaseCreationTimestamp returns an attribute KeyValue conforming +// to the "heroku.release.creation_timestamp" semantic conventions. It +// represents the time and date the release was created +func HerokuReleaseCreationTimestamp(val string) attribute.KeyValue { + return HerokuReleaseCreationTimestampKey.String(val) +} + +// A host is defined as a computing instance. For example, physical servers, +// virtual machines, switches or disk array. +const ( + // HostArchKey is the attribute Key conforming to the "host.arch" semantic + // conventions. It represents the CPU architecture the host system is + // running on. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + HostArchKey = attribute.Key("host.arch") + + // HostCPUCacheL2SizeKey is the attribute Key conforming to the + // "host.cpu.cache.l2.size" semantic conventions. It represents the amount + // of level 2 memory cache available to the processor (in Bytes). + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 12288000 + HostCPUCacheL2SizeKey = attribute.Key("host.cpu.cache.l2.size") + + // HostCPUFamilyKey is the attribute Key conforming to the + // "host.cpu.family" semantic conventions. It represents the family or + // generation of the CPU. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '6', 'PA-RISC 1.1e' + HostCPUFamilyKey = attribute.Key("host.cpu.family") + + // HostCPUModelIDKey is the attribute Key conforming to the + // "host.cpu.model.id" semantic conventions. It represents the model + // identifier. It provides more granular information about the CPU, + // distinguishing it from other CPUs within the same family. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '6', '9000/778/B180L' + HostCPUModelIDKey = attribute.Key("host.cpu.model.id") + + // HostCPUModelNameKey is the attribute Key conforming to the + // "host.cpu.model.name" semantic conventions. It represents the model + // designation of the processor. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz' + HostCPUModelNameKey = attribute.Key("host.cpu.model.name") + + // HostCPUSteppingKey is the attribute Key conforming to the + // "host.cpu.stepping" semantic conventions. It represents the stepping or + // core revisions. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '1', 'r1p1' + HostCPUSteppingKey = attribute.Key("host.cpu.stepping") + + // HostCPUVendorIDKey is the attribute Key conforming to the + // "host.cpu.vendor.id" semantic conventions. It represents the processor + // manufacturer identifier. A maximum 12-character string. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'GenuineIntel' + // Note: [CPUID](https://wiki.osdev.org/CPUID) command returns the vendor + // ID string in EBX, EDX and ECX registers. Writing these to memory in this + // order results in a 12-character string. + HostCPUVendorIDKey = attribute.Key("host.cpu.vendor.id") + + // HostIDKey is the attribute Key conforming to the "host.id" semantic + // conventions. It represents the unique host ID. For Cloud, this must be + // the instance_id assigned by the cloud provider. For non-containerized + // systems, this should be the `machine-id`. See the table below for the + // sources to use to determine the `machine-id` based on operating system. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'fdbf79e8af94cb7f9e8df36789187052' + HostIDKey = attribute.Key("host.id") + + // HostImageIDKey is the attribute Key conforming to the "host.image.id" + // semantic conventions. It represents the vM image ID or host OS image ID. + // For Cloud, this value is from the provider. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'ami-07b06b442921831e5' + HostImageIDKey = attribute.Key("host.image.id") + + // HostImageNameKey is the attribute Key conforming to the + // "host.image.name" semantic conventions. It represents the name of the VM + // image or OS install the host was instantiated from. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'infra-ami-eks-worker-node-7d4ec78312', 'CentOS-8-x86_64-1905' + HostImageNameKey = attribute.Key("host.image.name") + + // HostImageVersionKey is the attribute Key conforming to the + // "host.image.version" semantic conventions. It represents the version + // string of the VM image or host OS as defined in [Version + // Attributes](/docs/resource/README.md#version-attributes). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '0.1' + HostImageVersionKey = attribute.Key("host.image.version") + + // HostIPKey is the attribute Key conforming to the "host.ip" semantic + // conventions. It represents the available IP addresses of the host, + // excluding loopback interfaces. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: '192.168.1.140', 'fe80::abc2:4a28:737a:609e' + // Note: IPv4 Addresses MUST be specified in dotted-quad notation. IPv6 + // addresses MUST be specified in the [RFC + // 5952](https://www.rfc-editor.org/rfc/rfc5952.html) format. + HostIPKey = attribute.Key("host.ip") + + // HostMacKey is the attribute Key conforming to the "host.mac" semantic + // conventions. It represents the available MAC addresses of the host, + // excluding loopback interfaces. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'AC-DE-48-23-45-67', 'AC-DE-48-23-45-67-01-9F' + // Note: MAC Addresses MUST be represented in [IEEE RA hexadecimal + // form](https://standards.ieee.org/wp-content/uploads/import/documents/tutorials/eui.pdf): + // as hyphen-separated octets in uppercase hexadecimal form from most to + // least significant. + HostMacKey = attribute.Key("host.mac") + + // HostNameKey is the attribute Key conforming to the "host.name" semantic + // conventions. It represents the name of the host. On Unix systems, it may + // contain what the hostname command returns, or the fully qualified + // hostname, or another name specified by the user. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry-test' + HostNameKey = attribute.Key("host.name") + + // HostTypeKey is the attribute Key conforming to the "host.type" semantic + // conventions. It represents the type of host. For Cloud, this must be the + // machine type. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'n1-standard-1' + HostTypeKey = attribute.Key("host.type") +) + +var ( + // AMD64 + HostArchAMD64 = HostArchKey.String("amd64") + // ARM32 + HostArchARM32 = HostArchKey.String("arm32") + // ARM64 + HostArchARM64 = HostArchKey.String("arm64") + // Itanium + HostArchIA64 = HostArchKey.String("ia64") + // 32-bit PowerPC + HostArchPPC32 = HostArchKey.String("ppc32") + // 64-bit PowerPC + HostArchPPC64 = HostArchKey.String("ppc64") + // IBM z/Architecture + HostArchS390x = HostArchKey.String("s390x") + // 32-bit x86 + HostArchX86 = HostArchKey.String("x86") +) + +// HostCPUCacheL2Size returns an attribute KeyValue conforming to the +// "host.cpu.cache.l2.size" semantic conventions. It represents the amount of +// level 2 memory cache available to the processor (in Bytes). +func HostCPUCacheL2Size(val int) attribute.KeyValue { + return HostCPUCacheL2SizeKey.Int(val) +} + +// HostCPUFamily returns an attribute KeyValue conforming to the +// "host.cpu.family" semantic conventions. It represents the family or +// generation of the CPU. +func HostCPUFamily(val string) attribute.KeyValue { + return HostCPUFamilyKey.String(val) +} + +// HostCPUModelID returns an attribute KeyValue conforming to the +// "host.cpu.model.id" semantic conventions. It represents the model +// identifier. It provides more granular information about the CPU, +// distinguishing it from other CPUs within the same family. +func HostCPUModelID(val string) attribute.KeyValue { + return HostCPUModelIDKey.String(val) +} + +// HostCPUModelName returns an attribute KeyValue conforming to the +// "host.cpu.model.name" semantic conventions. It represents the model +// designation of the processor. +func HostCPUModelName(val string) attribute.KeyValue { + return HostCPUModelNameKey.String(val) +} + +// HostCPUStepping returns an attribute KeyValue conforming to the +// "host.cpu.stepping" semantic conventions. It represents the stepping or core +// revisions. +func HostCPUStepping(val string) attribute.KeyValue { + return HostCPUSteppingKey.String(val) +} + +// HostCPUVendorID returns an attribute KeyValue conforming to the +// "host.cpu.vendor.id" semantic conventions. It represents the processor +// manufacturer identifier. A maximum 12-character string. +func HostCPUVendorID(val string) attribute.KeyValue { + return HostCPUVendorIDKey.String(val) +} + +// HostID returns an attribute KeyValue conforming to the "host.id" semantic +// conventions. It represents the unique host ID. For Cloud, this must be the +// instance_id assigned by the cloud provider. For non-containerized systems, +// this should be the `machine-id`. See the table below for the sources to use +// to determine the `machine-id` based on operating system. +func HostID(val string) attribute.KeyValue { + return HostIDKey.String(val) +} + +// HostImageID returns an attribute KeyValue conforming to the +// "host.image.id" semantic conventions. It represents the vM image ID or host +// OS image ID. For Cloud, this value is from the provider. +func HostImageID(val string) attribute.KeyValue { + return HostImageIDKey.String(val) +} + +// HostImageName returns an attribute KeyValue conforming to the +// "host.image.name" semantic conventions. It represents the name of the VM +// image or OS install the host was instantiated from. +func HostImageName(val string) attribute.KeyValue { + return HostImageNameKey.String(val) +} + +// HostImageVersion returns an attribute KeyValue conforming to the +// "host.image.version" semantic conventions. It represents the version string +// of the VM image or host OS as defined in [Version +// Attributes](/docs/resource/README.md#version-attributes). +func HostImageVersion(val string) attribute.KeyValue { + return HostImageVersionKey.String(val) +} + +// HostIP returns an attribute KeyValue conforming to the "host.ip" semantic +// conventions. It represents the available IP addresses of the host, excluding +// loopback interfaces. +func HostIP(val ...string) attribute.KeyValue { + return HostIPKey.StringSlice(val) +} + +// HostMac returns an attribute KeyValue conforming to the "host.mac" +// semantic conventions. It represents the available MAC addresses of the host, +// excluding loopback interfaces. +func HostMac(val ...string) attribute.KeyValue { + return HostMacKey.StringSlice(val) +} + +// HostName returns an attribute KeyValue conforming to the "host.name" +// semantic conventions. It represents the name of the host. On Unix systems, +// it may contain what the hostname command returns, or the fully qualified +// hostname, or another name specified by the user. +func HostName(val string) attribute.KeyValue { + return HostNameKey.String(val) +} + +// HostType returns an attribute KeyValue conforming to the "host.type" +// semantic conventions. It represents the type of host. For Cloud, this must +// be the machine type. +func HostType(val string) attribute.KeyValue { + return HostTypeKey.String(val) +} + +// Semantic convention attributes in the HTTP namespace. +const ( + // HTTPConnectionStateKey is the attribute Key conforming to the + // "http.connection.state" semantic conventions. It represents the state of + // the HTTP connection in the HTTP connection pool. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'active', 'idle' + HTTPConnectionStateKey = attribute.Key("http.connection.state") + + // HTTPRequestBodySizeKey is the attribute Key conforming to the + // "http.request.body.size" semantic conventions. It represents the size of + // the request payload body in bytes. This is the number of bytes + // transferred excluding headers and is often, but not always, present as + // the + // [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) + // header. For requests using transport encoding, this should be the + // compressed size. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 3495 + HTTPRequestBodySizeKey = attribute.Key("http.request.body.size") + + // HTTPRequestMethodKey is the attribute Key conforming to the + // "http.request.method" semantic conventions. It represents the hTTP + // request method. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'GET', 'POST', 'HEAD' + // Note: HTTP request method value SHOULD be "known" to the + // instrumentation. + // By default, this convention defines "known" methods as the ones listed + // in [RFC9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-methods) + // and the PATCH method defined in + // [RFC5789](https://www.rfc-editor.org/rfc/rfc5789.html). + // + // If the HTTP request method is not known to instrumentation, it MUST set + // the `http.request.method` attribute to `_OTHER`. + // + // If the HTTP instrumentation could end up converting valid HTTP request + // methods to `_OTHER`, then it MUST provide a way to override + // the list of known HTTP methods. If this override is done via environment + // variable, then the environment variable MUST be named + // OTEL_INSTRUMENTATION_HTTP_KNOWN_METHODS and support a comma-separated + // list of case-sensitive known HTTP methods + // (this list MUST be a full override of the default known method, it is + // not a list of known methods in addition to the defaults). + // + // HTTP method names are case-sensitive and `http.request.method` attribute + // value MUST match a known HTTP method name exactly. + // Instrumentations for specific web frameworks that consider HTTP methods + // to be case insensitive, SHOULD populate a canonical equivalent. + // Tracing instrumentations that do so, MUST also set + // `http.request.method_original` to the original value. + HTTPRequestMethodKey = attribute.Key("http.request.method") + + // HTTPRequestMethodOriginalKey is the attribute Key conforming to the + // "http.request.method_original" semantic conventions. It represents the + // original HTTP method sent by the client in the request line. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'GeT', 'ACL', 'foo' + HTTPRequestMethodOriginalKey = attribute.Key("http.request.method_original") + + // HTTPRequestResendCountKey is the attribute Key conforming to the + // "http.request.resend_count" semantic conventions. It represents the + // ordinal number of request resending attempt (for any reason, including + // redirects). + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 3 + // Note: The resend count SHOULD be updated each time an HTTP request gets + // resent by the client, regardless of what was the cause of the resending + // (e.g. redirection, authorization failure, 503 Server Unavailable, + // network issues, or any other). + HTTPRequestResendCountKey = attribute.Key("http.request.resend_count") + + // HTTPRequestSizeKey is the attribute Key conforming to the + // "http.request.size" semantic conventions. It represents the total size + // of the request in bytes. This should be the total number of bytes sent + // over the wire, including the request line (HTTP/1.1), framing (HTTP/2 + // and HTTP/3), headers, and request body if any. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1437 + HTTPRequestSizeKey = attribute.Key("http.request.size") + + // HTTPResponseBodySizeKey is the attribute Key conforming to the + // "http.response.body.size" semantic conventions. It represents the size + // of the response payload body in bytes. This is the number of bytes + // transferred excluding headers and is often, but not always, present as + // the + // [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) + // header. For requests using transport encoding, this should be the + // compressed size. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 3495 + HTTPResponseBodySizeKey = attribute.Key("http.response.body.size") + + // HTTPResponseSizeKey is the attribute Key conforming to the + // "http.response.size" semantic conventions. It represents the total size + // of the response in bytes. This should be the total number of bytes sent + // over the wire, including the status line (HTTP/1.1), framing (HTTP/2 and + // HTTP/3), headers, and response body and trailers if any. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1437 + HTTPResponseSizeKey = attribute.Key("http.response.size") + + // HTTPResponseStatusCodeKey is the attribute Key conforming to the + // "http.response.status_code" semantic conventions. It represents the + // [HTTP response status + // code](https://tools.ietf.org/html/rfc7231#section-6). + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 200 + HTTPResponseStatusCodeKey = attribute.Key("http.response.status_code") + + // HTTPRouteKey is the attribute Key conforming to the "http.route" + // semantic conventions. It represents the matched route, that is, the path + // template in the format used by the respective server framework. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '/users/:userID?', '{controller}/{action}/{id?}' + // Note: MUST NOT be populated when this is not supported by the HTTP + // server framework as the route attribute should have low-cardinality and + // the URI path can NOT substitute it. + // SHOULD include the [application + // root](/docs/http/http-spans.md#http-server-definitions) if there is one. + HTTPRouteKey = attribute.Key("http.route") +) + +var ( + // active state + HTTPConnectionStateActive = HTTPConnectionStateKey.String("active") + // idle state + HTTPConnectionStateIdle = HTTPConnectionStateKey.String("idle") +) + +var ( + // CONNECT method + HTTPRequestMethodConnect = HTTPRequestMethodKey.String("CONNECT") + // DELETE method + HTTPRequestMethodDelete = HTTPRequestMethodKey.String("DELETE") + // GET method + HTTPRequestMethodGet = HTTPRequestMethodKey.String("GET") + // HEAD method + HTTPRequestMethodHead = HTTPRequestMethodKey.String("HEAD") + // OPTIONS method + HTTPRequestMethodOptions = HTTPRequestMethodKey.String("OPTIONS") + // PATCH method + HTTPRequestMethodPatch = HTTPRequestMethodKey.String("PATCH") + // POST method + HTTPRequestMethodPost = HTTPRequestMethodKey.String("POST") + // PUT method + HTTPRequestMethodPut = HTTPRequestMethodKey.String("PUT") + // TRACE method + HTTPRequestMethodTrace = HTTPRequestMethodKey.String("TRACE") + // Any HTTP method that the instrumentation has no prior knowledge of + HTTPRequestMethodOther = HTTPRequestMethodKey.String("_OTHER") +) + +// HTTPRequestBodySize returns an attribute KeyValue conforming to the +// "http.request.body.size" semantic conventions. It represents the size of the +// request payload body in bytes. This is the number of bytes transferred +// excluding headers and is often, but not always, present as the +// [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) +// header. For requests using transport encoding, this should be the compressed +// size. +func HTTPRequestBodySize(val int) attribute.KeyValue { + return HTTPRequestBodySizeKey.Int(val) +} + +// HTTPRequestMethodOriginal returns an attribute KeyValue conforming to the +// "http.request.method_original" semantic conventions. It represents the +// original HTTP method sent by the client in the request line. +func HTTPRequestMethodOriginal(val string) attribute.KeyValue { + return HTTPRequestMethodOriginalKey.String(val) +} + +// HTTPRequestResendCount returns an attribute KeyValue conforming to the +// "http.request.resend_count" semantic conventions. It represents the ordinal +// number of request resending attempt (for any reason, including redirects). +func HTTPRequestResendCount(val int) attribute.KeyValue { + return HTTPRequestResendCountKey.Int(val) +} + +// HTTPRequestSize returns an attribute KeyValue conforming to the +// "http.request.size" semantic conventions. It represents the total size of +// the request in bytes. This should be the total number of bytes sent over the +// wire, including the request line (HTTP/1.1), framing (HTTP/2 and HTTP/3), +// headers, and request body if any. +func HTTPRequestSize(val int) attribute.KeyValue { + return HTTPRequestSizeKey.Int(val) +} + +// HTTPResponseBodySize returns an attribute KeyValue conforming to the +// "http.response.body.size" semantic conventions. It represents the size of +// the response payload body in bytes. This is the number of bytes transferred +// excluding headers and is often, but not always, present as the +// [Content-Length](https://www.rfc-editor.org/rfc/rfc9110.html#field.content-length) +// header. For requests using transport encoding, this should be the compressed +// size. +func HTTPResponseBodySize(val int) attribute.KeyValue { + return HTTPResponseBodySizeKey.Int(val) +} + +// HTTPResponseSize returns an attribute KeyValue conforming to the +// "http.response.size" semantic conventions. It represents the total size of +// the response in bytes. This should be the total number of bytes sent over +// the wire, including the status line (HTTP/1.1), framing (HTTP/2 and HTTP/3), +// headers, and response body and trailers if any. +func HTTPResponseSize(val int) attribute.KeyValue { + return HTTPResponseSizeKey.Int(val) +} + +// HTTPResponseStatusCode returns an attribute KeyValue conforming to the +// "http.response.status_code" semantic conventions. It represents the [HTTP +// response status code](https://tools.ietf.org/html/rfc7231#section-6). +func HTTPResponseStatusCode(val int) attribute.KeyValue { + return HTTPResponseStatusCodeKey.Int(val) +} + +// HTTPRoute returns an attribute KeyValue conforming to the "http.route" +// semantic conventions. It represents the matched route, that is, the path +// template in the format used by the respective server framework. +func HTTPRoute(val string) attribute.KeyValue { + return HTTPRouteKey.String(val) +} + +// Java Virtual machine related attributes. +const ( + // JvmBufferPoolNameKey is the attribute Key conforming to the + // "jvm.buffer.pool.name" semantic conventions. It represents the name of + // the buffer pool. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'mapped', 'direct' + // Note: Pool names are generally obtained via + // [BufferPoolMXBean#getName()](https://docs.oracle.com/en/java/javase/11/docs/api/java.management/java/lang/management/BufferPoolMXBean.html#getName()). + JvmBufferPoolNameKey = attribute.Key("jvm.buffer.pool.name") + + // JvmGcActionKey is the attribute Key conforming to the "jvm.gc.action" + // semantic conventions. It represents the name of the garbage collector + // action. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'end of minor GC', 'end of major GC' + // Note: Garbage collector action is generally obtained via + // [GarbageCollectionNotificationInfo#getGcAction()](https://docs.oracle.com/en/java/javase/11/docs/api/jdk.management/com/sun/management/GarbageCollectionNotificationInfo.html#getGcAction()). + JvmGcActionKey = attribute.Key("jvm.gc.action") + + // JvmGcNameKey is the attribute Key conforming to the "jvm.gc.name" + // semantic conventions. It represents the name of the garbage collector. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'G1 Young Generation', 'G1 Old Generation' + // Note: Garbage collector name is generally obtained via + // [GarbageCollectionNotificationInfo#getGcName()](https://docs.oracle.com/en/java/javase/11/docs/api/jdk.management/com/sun/management/GarbageCollectionNotificationInfo.html#getGcName()). + JvmGcNameKey = attribute.Key("jvm.gc.name") + + // JvmMemoryPoolNameKey is the attribute Key conforming to the + // "jvm.memory.pool.name" semantic conventions. It represents the name of + // the memory pool. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'G1 Old Gen', 'G1 Eden space', 'G1 Survivor Space' + // Note: Pool names are generally obtained via + // [MemoryPoolMXBean#getName()](https://docs.oracle.com/en/java/javase/11/docs/api/java.management/java/lang/management/MemoryPoolMXBean.html#getName()). + JvmMemoryPoolNameKey = attribute.Key("jvm.memory.pool.name") + + // JvmMemoryTypeKey is the attribute Key conforming to the + // "jvm.memory.type" semantic conventions. It represents the type of + // memory. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'heap', 'non_heap' + JvmMemoryTypeKey = attribute.Key("jvm.memory.type") + + // JvmThreadDaemonKey is the attribute Key conforming to the + // "jvm.thread.daemon" semantic conventions. It represents the whether the + // thread is daemon or not. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: stable + JvmThreadDaemonKey = attribute.Key("jvm.thread.daemon") + + // JvmThreadStateKey is the attribute Key conforming to the + // "jvm.thread.state" semantic conventions. It represents the state of the + // thread. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'runnable', 'blocked' + JvmThreadStateKey = attribute.Key("jvm.thread.state") +) + +var ( + // Heap memory + JvmMemoryTypeHeap = JvmMemoryTypeKey.String("heap") + // Non-heap memory + JvmMemoryTypeNonHeap = JvmMemoryTypeKey.String("non_heap") +) + +var ( + // A thread that has not yet started is in this state + JvmThreadStateNew = JvmThreadStateKey.String("new") + // A thread executing in the Java virtual machine is in this state + JvmThreadStateRunnable = JvmThreadStateKey.String("runnable") + // A thread that is blocked waiting for a monitor lock is in this state + JvmThreadStateBlocked = JvmThreadStateKey.String("blocked") + // A thread that is waiting indefinitely for another thread to perform a particular action is in this state + JvmThreadStateWaiting = JvmThreadStateKey.String("waiting") + // A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state + JvmThreadStateTimedWaiting = JvmThreadStateKey.String("timed_waiting") + // A thread that has exited is in this state + JvmThreadStateTerminated = JvmThreadStateKey.String("terminated") +) + +// JvmBufferPoolName returns an attribute KeyValue conforming to the +// "jvm.buffer.pool.name" semantic conventions. It represents the name of the +// buffer pool. +func JvmBufferPoolName(val string) attribute.KeyValue { + return JvmBufferPoolNameKey.String(val) +} + +// JvmGcAction returns an attribute KeyValue conforming to the +// "jvm.gc.action" semantic conventions. It represents the name of the garbage +// collector action. +func JvmGcAction(val string) attribute.KeyValue { + return JvmGcActionKey.String(val) +} + +// JvmGcName returns an attribute KeyValue conforming to the "jvm.gc.name" +// semantic conventions. It represents the name of the garbage collector. +func JvmGcName(val string) attribute.KeyValue { + return JvmGcNameKey.String(val) +} + +// JvmMemoryPoolName returns an attribute KeyValue conforming to the +// "jvm.memory.pool.name" semantic conventions. It represents the name of the +// memory pool. +func JvmMemoryPoolName(val string) attribute.KeyValue { + return JvmMemoryPoolNameKey.String(val) +} + +// JvmThreadDaemon returns an attribute KeyValue conforming to the +// "jvm.thread.daemon" semantic conventions. It represents the whether the +// thread is daemon or not. +func JvmThreadDaemon(val bool) attribute.KeyValue { + return JvmThreadDaemonKey.Bool(val) +} + +// Kubernetes resource attributes. +const ( + // K8SClusterNameKey is the attribute Key conforming to the + // "k8s.cluster.name" semantic conventions. It represents the name of the + // cluster. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry-cluster' + K8SClusterNameKey = attribute.Key("k8s.cluster.name") + + // K8SClusterUIDKey is the attribute Key conforming to the + // "k8s.cluster.uid" semantic conventions. It represents a pseudo-ID for + // the cluster, set to the UID of the `kube-system` namespace. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '218fc5a9-a5f1-4b54-aa05-46717d0ab26d' + // Note: K8S doesn't have support for obtaining a cluster ID. If this is + // ever + // added, we will recommend collecting the `k8s.cluster.uid` through the + // official APIs. In the meantime, we are able to use the `uid` of the + // `kube-system` namespace as a proxy for cluster ID. Read on for the + // rationale. + // + // Every object created in a K8S cluster is assigned a distinct UID. The + // `kube-system` namespace is used by Kubernetes itself and will exist + // for the lifetime of the cluster. Using the `uid` of the `kube-system` + // namespace is a reasonable proxy for the K8S ClusterID as it will only + // change if the cluster is rebuilt. Furthermore, Kubernetes UIDs are + // UUIDs as standardized by + // [ISO/IEC 9834-8 and ITU-T + // X.667](https://www.itu.int/ITU-T/studygroups/com17/oid.html). + // Which states: + // + // > If generated according to one of the mechanisms defined in Rec. + // ITU-T X.667 | ISO/IEC 9834-8, a UUID is either guaranteed to be + // different from all other UUIDs generated before 3603 A.D., or is + // extremely likely to be different (depending on the mechanism chosen). + // + // Therefore, UIDs between clusters should be extremely unlikely to + // conflict. + K8SClusterUIDKey = attribute.Key("k8s.cluster.uid") + + // K8SContainerNameKey is the attribute Key conforming to the + // "k8s.container.name" semantic conventions. It represents the name of the + // Container from Pod specification, must be unique within a Pod. Container + // runtime usually uses different globally unique name (`container.name`). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'redis' + K8SContainerNameKey = attribute.Key("k8s.container.name") + + // K8SContainerRestartCountKey is the attribute Key conforming to the + // "k8s.container.restart_count" semantic conventions. It represents the + // number of times the container was restarted. This attribute can be used + // to identify a particular container (running or stopped) within a + // container spec. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + K8SContainerRestartCountKey = attribute.Key("k8s.container.restart_count") + + // K8SContainerStatusLastTerminatedReasonKey is the attribute Key + // conforming to the "k8s.container.status.last_terminated_reason" semantic + // conventions. It represents the last terminated reason of the Container. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Evicted', 'Error' + K8SContainerStatusLastTerminatedReasonKey = attribute.Key("k8s.container.status.last_terminated_reason") + + // K8SCronJobNameKey is the attribute Key conforming to the + // "k8s.cronjob.name" semantic conventions. It represents the name of the + // CronJob. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry' + K8SCronJobNameKey = attribute.Key("k8s.cronjob.name") + + // K8SCronJobUIDKey is the attribute Key conforming to the + // "k8s.cronjob.uid" semantic conventions. It represents the UID of the + // CronJob. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SCronJobUIDKey = attribute.Key("k8s.cronjob.uid") + + // K8SDaemonSetNameKey is the attribute Key conforming to the + // "k8s.daemonset.name" semantic conventions. It represents the name of the + // DaemonSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry' + K8SDaemonSetNameKey = attribute.Key("k8s.daemonset.name") + + // K8SDaemonSetUIDKey is the attribute Key conforming to the + // "k8s.daemonset.uid" semantic conventions. It represents the UID of the + // DaemonSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SDaemonSetUIDKey = attribute.Key("k8s.daemonset.uid") + + // K8SDeploymentNameKey is the attribute Key conforming to the + // "k8s.deployment.name" semantic conventions. It represents the name of + // the Deployment. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry' + K8SDeploymentNameKey = attribute.Key("k8s.deployment.name") + + // K8SDeploymentUIDKey is the attribute Key conforming to the + // "k8s.deployment.uid" semantic conventions. It represents the UID of the + // Deployment. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SDeploymentUIDKey = attribute.Key("k8s.deployment.uid") + + // K8SJobNameKey is the attribute Key conforming to the "k8s.job.name" + // semantic conventions. It represents the name of the Job. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry' + K8SJobNameKey = attribute.Key("k8s.job.name") + + // K8SJobUIDKey is the attribute Key conforming to the "k8s.job.uid" + // semantic conventions. It represents the UID of the Job. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SJobUIDKey = attribute.Key("k8s.job.uid") + + // K8SNamespaceNameKey is the attribute Key conforming to the + // "k8s.namespace.name" semantic conventions. It represents the name of the + // namespace that the pod is running in. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'default' + K8SNamespaceNameKey = attribute.Key("k8s.namespace.name") + + // K8SNodeNameKey is the attribute Key conforming to the "k8s.node.name" + // semantic conventions. It represents the name of the Node. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'node-1' + K8SNodeNameKey = attribute.Key("k8s.node.name") + + // K8SNodeUIDKey is the attribute Key conforming to the "k8s.node.uid" + // semantic conventions. It represents the UID of the Node. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '1eb3a0c6-0477-4080-a9cb-0cb7db65c6a2' + K8SNodeUIDKey = attribute.Key("k8s.node.uid") + + // K8SPodNameKey is the attribute Key conforming to the "k8s.pod.name" + // semantic conventions. It represents the name of the Pod. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry-pod-autoconf' + K8SPodNameKey = attribute.Key("k8s.pod.name") + + // K8SPodUIDKey is the attribute Key conforming to the "k8s.pod.uid" + // semantic conventions. It represents the UID of the Pod. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SPodUIDKey = attribute.Key("k8s.pod.uid") + + // K8SReplicaSetNameKey is the attribute Key conforming to the + // "k8s.replicaset.name" semantic conventions. It represents the name of + // the ReplicaSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry' + K8SReplicaSetNameKey = attribute.Key("k8s.replicaset.name") + + // K8SReplicaSetUIDKey is the attribute Key conforming to the + // "k8s.replicaset.uid" semantic conventions. It represents the UID of the + // ReplicaSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SReplicaSetUIDKey = attribute.Key("k8s.replicaset.uid") + + // K8SStatefulSetNameKey is the attribute Key conforming to the + // "k8s.statefulset.name" semantic conventions. It represents the name of + // the StatefulSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry' + K8SStatefulSetNameKey = attribute.Key("k8s.statefulset.name") + + // K8SStatefulSetUIDKey is the attribute Key conforming to the + // "k8s.statefulset.uid" semantic conventions. It represents the UID of the + // StatefulSet. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '275ecb36-5aa8-4c2a-9c47-d8bb681b9aff' + K8SStatefulSetUIDKey = attribute.Key("k8s.statefulset.uid") +) + +// K8SClusterName returns an attribute KeyValue conforming to the +// "k8s.cluster.name" semantic conventions. It represents the name of the +// cluster. +func K8SClusterName(val string) attribute.KeyValue { + return K8SClusterNameKey.String(val) +} + +// K8SClusterUID returns an attribute KeyValue conforming to the +// "k8s.cluster.uid" semantic conventions. It represents a pseudo-ID for the +// cluster, set to the UID of the `kube-system` namespace. +func K8SClusterUID(val string) attribute.KeyValue { + return K8SClusterUIDKey.String(val) +} + +// K8SContainerName returns an attribute KeyValue conforming to the +// "k8s.container.name" semantic conventions. It represents the name of the +// Container from Pod specification, must be unique within a Pod. Container +// runtime usually uses different globally unique name (`container.name`). +func K8SContainerName(val string) attribute.KeyValue { + return K8SContainerNameKey.String(val) +} + +// K8SContainerRestartCount returns an attribute KeyValue conforming to the +// "k8s.container.restart_count" semantic conventions. It represents the number +// of times the container was restarted. This attribute can be used to identify +// a particular container (running or stopped) within a container spec. +func K8SContainerRestartCount(val int) attribute.KeyValue { + return K8SContainerRestartCountKey.Int(val) +} + +// K8SContainerStatusLastTerminatedReason returns an attribute KeyValue +// conforming to the "k8s.container.status.last_terminated_reason" semantic +// conventions. It represents the last terminated reason of the Container. +func K8SContainerStatusLastTerminatedReason(val string) attribute.KeyValue { + return K8SContainerStatusLastTerminatedReasonKey.String(val) +} + +// K8SCronJobName returns an attribute KeyValue conforming to the +// "k8s.cronjob.name" semantic conventions. It represents the name of the +// CronJob. +func K8SCronJobName(val string) attribute.KeyValue { + return K8SCronJobNameKey.String(val) +} + +// K8SCronJobUID returns an attribute KeyValue conforming to the +// "k8s.cronjob.uid" semantic conventions. It represents the UID of the +// CronJob. +func K8SCronJobUID(val string) attribute.KeyValue { + return K8SCronJobUIDKey.String(val) +} + +// K8SDaemonSetName returns an attribute KeyValue conforming to the +// "k8s.daemonset.name" semantic conventions. It represents the name of the +// DaemonSet. +func K8SDaemonSetName(val string) attribute.KeyValue { + return K8SDaemonSetNameKey.String(val) +} + +// K8SDaemonSetUID returns an attribute KeyValue conforming to the +// "k8s.daemonset.uid" semantic conventions. It represents the UID of the +// DaemonSet. +func K8SDaemonSetUID(val string) attribute.KeyValue { + return K8SDaemonSetUIDKey.String(val) +} + +// K8SDeploymentName returns an attribute KeyValue conforming to the +// "k8s.deployment.name" semantic conventions. It represents the name of the +// Deployment. +func K8SDeploymentName(val string) attribute.KeyValue { + return K8SDeploymentNameKey.String(val) +} + +// K8SDeploymentUID returns an attribute KeyValue conforming to the +// "k8s.deployment.uid" semantic conventions. It represents the UID of the +// Deployment. +func K8SDeploymentUID(val string) attribute.KeyValue { + return K8SDeploymentUIDKey.String(val) +} + +// K8SJobName returns an attribute KeyValue conforming to the "k8s.job.name" +// semantic conventions. It represents the name of the Job. +func K8SJobName(val string) attribute.KeyValue { + return K8SJobNameKey.String(val) +} + +// K8SJobUID returns an attribute KeyValue conforming to the "k8s.job.uid" +// semantic conventions. It represents the UID of the Job. +func K8SJobUID(val string) attribute.KeyValue { + return K8SJobUIDKey.String(val) +} + +// K8SNamespaceName returns an attribute KeyValue conforming to the +// "k8s.namespace.name" semantic conventions. It represents the name of the +// namespace that the pod is running in. +func K8SNamespaceName(val string) attribute.KeyValue { + return K8SNamespaceNameKey.String(val) +} + +// K8SNodeName returns an attribute KeyValue conforming to the +// "k8s.node.name" semantic conventions. It represents the name of the Node. +func K8SNodeName(val string) attribute.KeyValue { + return K8SNodeNameKey.String(val) +} + +// K8SNodeUID returns an attribute KeyValue conforming to the "k8s.node.uid" +// semantic conventions. It represents the UID of the Node. +func K8SNodeUID(val string) attribute.KeyValue { + return K8SNodeUIDKey.String(val) +} + +// K8SPodName returns an attribute KeyValue conforming to the "k8s.pod.name" +// semantic conventions. It represents the name of the Pod. +func K8SPodName(val string) attribute.KeyValue { + return K8SPodNameKey.String(val) +} + +// K8SPodUID returns an attribute KeyValue conforming to the "k8s.pod.uid" +// semantic conventions. It represents the UID of the Pod. +func K8SPodUID(val string) attribute.KeyValue { + return K8SPodUIDKey.String(val) +} + +// K8SReplicaSetName returns an attribute KeyValue conforming to the +// "k8s.replicaset.name" semantic conventions. It represents the name of the +// ReplicaSet. +func K8SReplicaSetName(val string) attribute.KeyValue { + return K8SReplicaSetNameKey.String(val) +} + +// K8SReplicaSetUID returns an attribute KeyValue conforming to the +// "k8s.replicaset.uid" semantic conventions. It represents the UID of the +// ReplicaSet. +func K8SReplicaSetUID(val string) attribute.KeyValue { + return K8SReplicaSetUIDKey.String(val) +} + +// K8SStatefulSetName returns an attribute KeyValue conforming to the +// "k8s.statefulset.name" semantic conventions. It represents the name of the +// StatefulSet. +func K8SStatefulSetName(val string) attribute.KeyValue { + return K8SStatefulSetNameKey.String(val) +} + +// K8SStatefulSetUID returns an attribute KeyValue conforming to the +// "k8s.statefulset.uid" semantic conventions. It represents the UID of the +// StatefulSet. +func K8SStatefulSetUID(val string) attribute.KeyValue { + return K8SStatefulSetUIDKey.String(val) +} + +// Log attributes +const ( + // LogIostreamKey is the attribute Key conforming to the "log.iostream" + // semantic conventions. It represents the stream associated with the log. + // See below for a list of well-known values. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + LogIostreamKey = attribute.Key("log.iostream") +) + +var ( + // Logs from stdout stream + LogIostreamStdout = LogIostreamKey.String("stdout") + // Events from stderr stream + LogIostreamStderr = LogIostreamKey.String("stderr") +) + +// Attributes for a file to which log was emitted. +const ( + // LogFileNameKey is the attribute Key conforming to the "log.file.name" + // semantic conventions. It represents the basename of the file. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'audit.log' + LogFileNameKey = attribute.Key("log.file.name") + + // LogFileNameResolvedKey is the attribute Key conforming to the + // "log.file.name_resolved" semantic conventions. It represents the + // basename of the file, with symlinks resolved. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'uuid.log' + LogFileNameResolvedKey = attribute.Key("log.file.name_resolved") + + // LogFilePathKey is the attribute Key conforming to the "log.file.path" + // semantic conventions. It represents the full path to the file. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/var/log/mysql/audit.log' + LogFilePathKey = attribute.Key("log.file.path") + + // LogFilePathResolvedKey is the attribute Key conforming to the + // "log.file.path_resolved" semantic conventions. It represents the full + // path to the file, with symlinks resolved. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/var/lib/docker/uuid.log' + LogFilePathResolvedKey = attribute.Key("log.file.path_resolved") +) + +// LogFileName returns an attribute KeyValue conforming to the +// "log.file.name" semantic conventions. It represents the basename of the +// file. +func LogFileName(val string) attribute.KeyValue { + return LogFileNameKey.String(val) +} + +// LogFileNameResolved returns an attribute KeyValue conforming to the +// "log.file.name_resolved" semantic conventions. It represents the basename of +// the file, with symlinks resolved. +func LogFileNameResolved(val string) attribute.KeyValue { + return LogFileNameResolvedKey.String(val) +} + +// LogFilePath returns an attribute KeyValue conforming to the +// "log.file.path" semantic conventions. It represents the full path to the +// file. +func LogFilePath(val string) attribute.KeyValue { + return LogFilePathKey.String(val) +} + +// LogFilePathResolved returns an attribute KeyValue conforming to the +// "log.file.path_resolved" semantic conventions. It represents the full path +// to the file, with symlinks resolved. +func LogFilePathResolved(val string) attribute.KeyValue { + return LogFilePathResolvedKey.String(val) +} + +// The generic attributes that may be used in any Log Record. +const ( + // LogRecordUIDKey is the attribute Key conforming to the "log.record.uid" + // semantic conventions. It represents a unique identifier for the Log + // Record. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '01ARZ3NDEKTSV4RRFFQ69G5FAV' + // Note: If an id is provided, other log records with the same id will be + // considered duplicates and can be removed safely. This means, that two + // distinguishable log records MUST have different values. + // The id MAY be an [Universally Unique Lexicographically Sortable + // Identifier (ULID)](https://github.com/ulid/spec), but other identifiers + // (e.g. UUID) may be used as needed. + LogRecordUIDKey = attribute.Key("log.record.uid") +) + +// LogRecordUID returns an attribute KeyValue conforming to the +// "log.record.uid" semantic conventions. It represents a unique identifier for +// the Log Record. +func LogRecordUID(val string) attribute.KeyValue { + return LogRecordUIDKey.String(val) +} + +// Attributes describing telemetry around messaging systems and messaging +// activities. +const ( + // MessagingBatchMessageCountKey is the attribute Key conforming to the + // "messaging.batch.message_count" semantic conventions. It represents the + // number of messages sent, received, or processed in the scope of the + // batching operation. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 0, 1, 2 + // Note: Instrumentations SHOULD NOT set `messaging.batch.message_count` on + // spans that operate with a single message. When a messaging client + // library supports both batch and single-message API for the same + // operation, instrumentations SHOULD use `messaging.batch.message_count` + // for batching APIs and SHOULD NOT use it for single-message APIs. + MessagingBatchMessageCountKey = attribute.Key("messaging.batch.message_count") + + // MessagingClientIDKey is the attribute Key conforming to the + // "messaging.client.id" semantic conventions. It represents a unique + // identifier for the client that consumes or produces a message. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'client-5', 'myhost@8742@s8083jm' + MessagingClientIDKey = attribute.Key("messaging.client.id") + + // MessagingDestinationAnonymousKey is the attribute Key conforming to the + // "messaging.destination.anonymous" semantic conventions. It represents a + // boolean that is true if the message destination is anonymous (could be + // unnamed or have auto-generated name). + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + MessagingDestinationAnonymousKey = attribute.Key("messaging.destination.anonymous") + + // MessagingDestinationNameKey is the attribute Key conforming to the + // "messaging.destination.name" semantic conventions. It represents the + // message destination name + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'MyQueue', 'MyTopic' + // Note: Destination name SHOULD uniquely identify a specific queue, topic + // or other entity within the broker. If + // the broker doesn't have such notion, the destination name SHOULD + // uniquely identify the broker. + MessagingDestinationNameKey = attribute.Key("messaging.destination.name") + + // MessagingDestinationPartitionIDKey is the attribute Key conforming to + // the "messaging.destination.partition.id" semantic conventions. It + // represents the identifier of the partition messages are sent to or + // received from, unique within the `messaging.destination.name`. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '1' + MessagingDestinationPartitionIDKey = attribute.Key("messaging.destination.partition.id") + + // MessagingDestinationTemplateKey is the attribute Key conforming to the + // "messaging.destination.template" semantic conventions. It represents the + // low cardinality representation of the messaging destination name + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/customers/{customerID}' + // Note: Destination names could be constructed from templates. An example + // would be a destination name involving a user name or product id. + // Although the destination name in this case is of high cardinality, the + // underlying template is of low cardinality and can be effectively used + // for grouping and aggregation. + MessagingDestinationTemplateKey = attribute.Key("messaging.destination.template") + + // MessagingDestinationTemporaryKey is the attribute Key conforming to the + // "messaging.destination.temporary" semantic conventions. It represents a + // boolean that is true if the message destination is temporary and might + // not exist anymore after messages are processed. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + MessagingDestinationTemporaryKey = attribute.Key("messaging.destination.temporary") + + // MessagingDestinationPublishAnonymousKey is the attribute Key conforming + // to the "messaging.destination_publish.anonymous" semantic conventions. + // It represents a boolean that is true if the publish message destination + // is anonymous (could be unnamed or have auto-generated name). + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + MessagingDestinationPublishAnonymousKey = attribute.Key("messaging.destination_publish.anonymous") + + // MessagingDestinationPublishNameKey is the attribute Key conforming to + // the "messaging.destination_publish.name" semantic conventions. It + // represents the name of the original destination the message was + // published to + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'MyQueue', 'MyTopic' + // Note: The name SHOULD uniquely identify a specific queue, topic, or + // other entity within the broker. If + // the broker doesn't have such notion, the original destination name + // SHOULD uniquely identify the broker. + MessagingDestinationPublishNameKey = attribute.Key("messaging.destination_publish.name") + + // MessagingMessageBodySizeKey is the attribute Key conforming to the + // "messaging.message.body.size" semantic conventions. It represents the + // size of the message body in bytes. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1439 + // Note: This can refer to both the compressed or uncompressed body size. + // If both sizes are known, the uncompressed + // body size should be used. + MessagingMessageBodySizeKey = attribute.Key("messaging.message.body.size") + + // MessagingMessageConversationIDKey is the attribute Key conforming to the + // "messaging.message.conversation_id" semantic conventions. It represents + // the conversation ID identifying the conversation to which the message + // belongs, represented as a string. Sometimes called "Correlation ID". + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'MyConversationID' + MessagingMessageConversationIDKey = attribute.Key("messaging.message.conversation_id") + + // MessagingMessageEnvelopeSizeKey is the attribute Key conforming to the + // "messaging.message.envelope.size" semantic conventions. It represents + // the size of the message body and metadata in bytes. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 2738 + // Note: This can refer to both the compressed or uncompressed size. If + // both sizes are known, the uncompressed + // size should be used. + MessagingMessageEnvelopeSizeKey = attribute.Key("messaging.message.envelope.size") + + // MessagingMessageIDKey is the attribute Key conforming to the + // "messaging.message.id" semantic conventions. It represents a value used + // by the messaging system as an identifier for the message, represented as + // a string. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '452a7c7c7c7048c2f887f61572b18fc2' + MessagingMessageIDKey = attribute.Key("messaging.message.id") + + // MessagingOperationNameKey is the attribute Key conforming to the + // "messaging.operation.name" semantic conventions. It represents the + // system-specific name of the messaging operation. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'ack', 'nack', 'send' + MessagingOperationNameKey = attribute.Key("messaging.operation.name") + + // MessagingOperationTypeKey is the attribute Key conforming to the + // "messaging.operation.type" semantic conventions. It represents a string + // identifying the type of the messaging operation. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Note: If a custom value is used, it MUST be of low cardinality. + MessagingOperationTypeKey = attribute.Key("messaging.operation.type") + + // MessagingSystemKey is the attribute Key conforming to the + // "messaging.system" semantic conventions. It represents the messaging + // system as identified by the client instrumentation. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Note: The actual messaging system may differ from the one known by the + // client. For example, when using Kafka client libraries to communicate + // with Azure Event Hubs, the `messaging.system` is set to `kafka` based on + // the instrumentation's best knowledge. + MessagingSystemKey = attribute.Key("messaging.system") +) + +var ( + // One or more messages are provided for publishing to an intermediary. If a single message is published, the context of the "Publish" span can be used as the creation context and no "Create" span needs to be created + MessagingOperationTypePublish = MessagingOperationTypeKey.String("publish") + // A message is created. "Create" spans always refer to a single message and are used to provide a unique creation context for messages in batch publishing scenarios + MessagingOperationTypeCreate = MessagingOperationTypeKey.String("create") + // One or more messages are requested by a consumer. This operation refers to pull-based scenarios, where consumers explicitly call methods of messaging SDKs to receive messages + MessagingOperationTypeReceive = MessagingOperationTypeKey.String("receive") + // One or more messages are delivered to or processed by a consumer + MessagingOperationTypeDeliver = MessagingOperationTypeKey.String("process") + // One or more messages are settled + MessagingOperationTypeSettle = MessagingOperationTypeKey.String("settle") +) + +var ( + // Apache ActiveMQ + MessagingSystemActivemq = MessagingSystemKey.String("activemq") + // Amazon Simple Queue Service (SQS) + MessagingSystemAWSSqs = MessagingSystemKey.String("aws_sqs") + // Azure Event Grid + MessagingSystemEventgrid = MessagingSystemKey.String("eventgrid") + // Azure Event Hubs + MessagingSystemEventhubs = MessagingSystemKey.String("eventhubs") + // Azure Service Bus + MessagingSystemServicebus = MessagingSystemKey.String("servicebus") + // Google Cloud Pub/Sub + MessagingSystemGCPPubsub = MessagingSystemKey.String("gcp_pubsub") + // Java Message Service + MessagingSystemJms = MessagingSystemKey.String("jms") + // Apache Kafka + MessagingSystemKafka = MessagingSystemKey.String("kafka") + // RabbitMQ + MessagingSystemRabbitmq = MessagingSystemKey.String("rabbitmq") + // Apache RocketMQ + MessagingSystemRocketmq = MessagingSystemKey.String("rocketmq") +) + +// MessagingBatchMessageCount returns an attribute KeyValue conforming to +// the "messaging.batch.message_count" semantic conventions. It represents the +// number of messages sent, received, or processed in the scope of the batching +// operation. +func MessagingBatchMessageCount(val int) attribute.KeyValue { + return MessagingBatchMessageCountKey.Int(val) +} + +// MessagingClientID returns an attribute KeyValue conforming to the +// "messaging.client.id" semantic conventions. It represents a unique +// identifier for the client that consumes or produces a message. +func MessagingClientID(val string) attribute.KeyValue { + return MessagingClientIDKey.String(val) +} + +// MessagingDestinationAnonymous returns an attribute KeyValue conforming to +// the "messaging.destination.anonymous" semantic conventions. It represents a +// boolean that is true if the message destination is anonymous (could be +// unnamed or have auto-generated name). +func MessagingDestinationAnonymous(val bool) attribute.KeyValue { + return MessagingDestinationAnonymousKey.Bool(val) +} + +// MessagingDestinationName returns an attribute KeyValue conforming to the +// "messaging.destination.name" semantic conventions. It represents the message +// destination name +func MessagingDestinationName(val string) attribute.KeyValue { + return MessagingDestinationNameKey.String(val) +} + +// MessagingDestinationPartitionID returns an attribute KeyValue conforming +// to the "messaging.destination.partition.id" semantic conventions. It +// represents the identifier of the partition messages are sent to or received +// from, unique within the `messaging.destination.name`. +func MessagingDestinationPartitionID(val string) attribute.KeyValue { + return MessagingDestinationPartitionIDKey.String(val) +} + +// MessagingDestinationTemplate returns an attribute KeyValue conforming to +// the "messaging.destination.template" semantic conventions. It represents the +// low cardinality representation of the messaging destination name +func MessagingDestinationTemplate(val string) attribute.KeyValue { + return MessagingDestinationTemplateKey.String(val) +} + +// MessagingDestinationTemporary returns an attribute KeyValue conforming to +// the "messaging.destination.temporary" semantic conventions. It represents a +// boolean that is true if the message destination is temporary and might not +// exist anymore after messages are processed. +func MessagingDestinationTemporary(val bool) attribute.KeyValue { + return MessagingDestinationTemporaryKey.Bool(val) +} + +// MessagingDestinationPublishAnonymous returns an attribute KeyValue +// conforming to the "messaging.destination_publish.anonymous" semantic +// conventions. It represents a boolean that is true if the publish message +// destination is anonymous (could be unnamed or have auto-generated name). +func MessagingDestinationPublishAnonymous(val bool) attribute.KeyValue { + return MessagingDestinationPublishAnonymousKey.Bool(val) +} + +// MessagingDestinationPublishName returns an attribute KeyValue conforming +// to the "messaging.destination_publish.name" semantic conventions. It +// represents the name of the original destination the message was published to +func MessagingDestinationPublishName(val string) attribute.KeyValue { + return MessagingDestinationPublishNameKey.String(val) +} + +// MessagingMessageBodySize returns an attribute KeyValue conforming to the +// "messaging.message.body.size" semantic conventions. It represents the size +// of the message body in bytes. +func MessagingMessageBodySize(val int) attribute.KeyValue { + return MessagingMessageBodySizeKey.Int(val) +} + +// MessagingMessageConversationID returns an attribute KeyValue conforming +// to the "messaging.message.conversation_id" semantic conventions. It +// represents the conversation ID identifying the conversation to which the +// message belongs, represented as a string. Sometimes called "Correlation ID". +func MessagingMessageConversationID(val string) attribute.KeyValue { + return MessagingMessageConversationIDKey.String(val) +} + +// MessagingMessageEnvelopeSize returns an attribute KeyValue conforming to +// the "messaging.message.envelope.size" semantic conventions. It represents +// the size of the message body and metadata in bytes. +func MessagingMessageEnvelopeSize(val int) attribute.KeyValue { + return MessagingMessageEnvelopeSizeKey.Int(val) +} + +// MessagingMessageID returns an attribute KeyValue conforming to the +// "messaging.message.id" semantic conventions. It represents a value used by +// the messaging system as an identifier for the message, represented as a +// string. +func MessagingMessageID(val string) attribute.KeyValue { + return MessagingMessageIDKey.String(val) +} + +// MessagingOperationName returns an attribute KeyValue conforming to the +// "messaging.operation.name" semantic conventions. It represents the +// system-specific name of the messaging operation. +func MessagingOperationName(val string) attribute.KeyValue { + return MessagingOperationNameKey.String(val) +} + +// This group describes attributes specific to Apache Kafka. +const ( + // MessagingKafkaConsumerGroupKey is the attribute Key conforming to the + // "messaging.kafka.consumer.group" semantic conventions. It represents the + // name of the Kafka Consumer Group that is handling the message. Only + // applies to consumers, not producers. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'my-group' + MessagingKafkaConsumerGroupKey = attribute.Key("messaging.kafka.consumer.group") + + // MessagingKafkaMessageKeyKey is the attribute Key conforming to the + // "messaging.kafka.message.key" semantic conventions. It represents the + // message keys in Kafka are used for grouping alike messages to ensure + // they're processed on the same partition. They differ from + // `messaging.message.id` in that they're not unique. If the key is `null`, + // the attribute MUST NOT be set. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'myKey' + // Note: If the key type is not string, it's string representation has to + // be supplied for the attribute. If the key has no unambiguous, canonical + // string form, don't include its value. + MessagingKafkaMessageKeyKey = attribute.Key("messaging.kafka.message.key") + + // MessagingKafkaMessageOffsetKey is the attribute Key conforming to the + // "messaging.kafka.message.offset" semantic conventions. It represents the + // offset of a record in the corresponding Kafka partition. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 42 + MessagingKafkaMessageOffsetKey = attribute.Key("messaging.kafka.message.offset") + + // MessagingKafkaMessageTombstoneKey is the attribute Key conforming to the + // "messaging.kafka.message.tombstone" semantic conventions. It represents + // a boolean that is true if the message is a tombstone. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + MessagingKafkaMessageTombstoneKey = attribute.Key("messaging.kafka.message.tombstone") +) + +// MessagingKafkaConsumerGroup returns an attribute KeyValue conforming to +// the "messaging.kafka.consumer.group" semantic conventions. It represents the +// name of the Kafka Consumer Group that is handling the message. Only applies +// to consumers, not producers. +func MessagingKafkaConsumerGroup(val string) attribute.KeyValue { + return MessagingKafkaConsumerGroupKey.String(val) +} + +// MessagingKafkaMessageKey returns an attribute KeyValue conforming to the +// "messaging.kafka.message.key" semantic conventions. It represents the +// message keys in Kafka are used for grouping alike messages to ensure they're +// processed on the same partition. They differ from `messaging.message.id` in +// that they're not unique. If the key is `null`, the attribute MUST NOT be +// set. +func MessagingKafkaMessageKey(val string) attribute.KeyValue { + return MessagingKafkaMessageKeyKey.String(val) +} + +// MessagingKafkaMessageOffset returns an attribute KeyValue conforming to +// the "messaging.kafka.message.offset" semantic conventions. It represents the +// offset of a record in the corresponding Kafka partition. +func MessagingKafkaMessageOffset(val int) attribute.KeyValue { + return MessagingKafkaMessageOffsetKey.Int(val) +} + +// MessagingKafkaMessageTombstone returns an attribute KeyValue conforming +// to the "messaging.kafka.message.tombstone" semantic conventions. It +// represents a boolean that is true if the message is a tombstone. +func MessagingKafkaMessageTombstone(val bool) attribute.KeyValue { + return MessagingKafkaMessageTombstoneKey.Bool(val) +} + +// This group describes attributes specific to RabbitMQ. +const ( + // MessagingRabbitmqDestinationRoutingKeyKey is the attribute Key + // conforming to the "messaging.rabbitmq.destination.routing_key" semantic + // conventions. It represents the rabbitMQ message routing key. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'myKey' + MessagingRabbitmqDestinationRoutingKeyKey = attribute.Key("messaging.rabbitmq.destination.routing_key") + + // MessagingRabbitmqMessageDeliveryTagKey is the attribute Key conforming + // to the "messaging.rabbitmq.message.delivery_tag" semantic conventions. + // It represents the rabbitMQ message delivery tag + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 123 + MessagingRabbitmqMessageDeliveryTagKey = attribute.Key("messaging.rabbitmq.message.delivery_tag") +) + +// MessagingRabbitmqDestinationRoutingKey returns an attribute KeyValue +// conforming to the "messaging.rabbitmq.destination.routing_key" semantic +// conventions. It represents the rabbitMQ message routing key. +func MessagingRabbitmqDestinationRoutingKey(val string) attribute.KeyValue { + return MessagingRabbitmqDestinationRoutingKeyKey.String(val) +} + +// MessagingRabbitmqMessageDeliveryTag returns an attribute KeyValue +// conforming to the "messaging.rabbitmq.message.delivery_tag" semantic +// conventions. It represents the rabbitMQ message delivery tag +func MessagingRabbitmqMessageDeliveryTag(val int) attribute.KeyValue { + return MessagingRabbitmqMessageDeliveryTagKey.Int(val) +} + +// This group describes attributes specific to RocketMQ. +const ( + // MessagingRocketmqClientGroupKey is the attribute Key conforming to the + // "messaging.rocketmq.client_group" semantic conventions. It represents + // the name of the RocketMQ producer/consumer group that is handling the + // message. The client type is identified by the SpanKind. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'myConsumerGroup' + MessagingRocketmqClientGroupKey = attribute.Key("messaging.rocketmq.client_group") + + // MessagingRocketmqConsumptionModelKey is the attribute Key conforming to + // the "messaging.rocketmq.consumption_model" semantic conventions. It + // represents the model of message consumption. This only applies to + // consumer spans. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + MessagingRocketmqConsumptionModelKey = attribute.Key("messaging.rocketmq.consumption_model") + + // MessagingRocketmqMessageDelayTimeLevelKey is the attribute Key + // conforming to the "messaging.rocketmq.message.delay_time_level" semantic + // conventions. It represents the delay time level for delay message, which + // determines the message delay time. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 3 + MessagingRocketmqMessageDelayTimeLevelKey = attribute.Key("messaging.rocketmq.message.delay_time_level") + + // MessagingRocketmqMessageDeliveryTimestampKey is the attribute Key + // conforming to the "messaging.rocketmq.message.delivery_timestamp" + // semantic conventions. It represents the timestamp in milliseconds that + // the delay message is expected to be delivered to consumer. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1665987217045 + MessagingRocketmqMessageDeliveryTimestampKey = attribute.Key("messaging.rocketmq.message.delivery_timestamp") + + // MessagingRocketmqMessageGroupKey is the attribute Key conforming to the + // "messaging.rocketmq.message.group" semantic conventions. It represents + // the it is essential for FIFO message. Messages that belong to the same + // message group are always processed one by one within the same consumer + // group. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'myMessageGroup' + MessagingRocketmqMessageGroupKey = attribute.Key("messaging.rocketmq.message.group") + + // MessagingRocketmqMessageKeysKey is the attribute Key conforming to the + // "messaging.rocketmq.message.keys" semantic conventions. It represents + // the key(s) of message, another way to mark message besides message id. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'keyA', 'keyB' + MessagingRocketmqMessageKeysKey = attribute.Key("messaging.rocketmq.message.keys") + + // MessagingRocketmqMessageTagKey is the attribute Key conforming to the + // "messaging.rocketmq.message.tag" semantic conventions. It represents the + // secondary classifier of message besides topic. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'tagA' + MessagingRocketmqMessageTagKey = attribute.Key("messaging.rocketmq.message.tag") + + // MessagingRocketmqMessageTypeKey is the attribute Key conforming to the + // "messaging.rocketmq.message.type" semantic conventions. It represents + // the type of message. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + MessagingRocketmqMessageTypeKey = attribute.Key("messaging.rocketmq.message.type") + + // MessagingRocketmqNamespaceKey is the attribute Key conforming to the + // "messaging.rocketmq.namespace" semantic conventions. It represents the + // namespace of RocketMQ resources, resources in different namespaces are + // individual. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'myNamespace' + MessagingRocketmqNamespaceKey = attribute.Key("messaging.rocketmq.namespace") +) + +var ( + // Clustering consumption model + MessagingRocketmqConsumptionModelClustering = MessagingRocketmqConsumptionModelKey.String("clustering") + // Broadcasting consumption model + MessagingRocketmqConsumptionModelBroadcasting = MessagingRocketmqConsumptionModelKey.String("broadcasting") +) + +var ( + // Normal message + MessagingRocketmqMessageTypeNormal = MessagingRocketmqMessageTypeKey.String("normal") + // FIFO message + MessagingRocketmqMessageTypeFifo = MessagingRocketmqMessageTypeKey.String("fifo") + // Delay message + MessagingRocketmqMessageTypeDelay = MessagingRocketmqMessageTypeKey.String("delay") + // Transaction message + MessagingRocketmqMessageTypeTransaction = MessagingRocketmqMessageTypeKey.String("transaction") +) + +// MessagingRocketmqClientGroup returns an attribute KeyValue conforming to +// the "messaging.rocketmq.client_group" semantic conventions. It represents +// the name of the RocketMQ producer/consumer group that is handling the +// message. The client type is identified by the SpanKind. +func MessagingRocketmqClientGroup(val string) attribute.KeyValue { + return MessagingRocketmqClientGroupKey.String(val) +} + +// MessagingRocketmqMessageDelayTimeLevel returns an attribute KeyValue +// conforming to the "messaging.rocketmq.message.delay_time_level" semantic +// conventions. It represents the delay time level for delay message, which +// determines the message delay time. +func MessagingRocketmqMessageDelayTimeLevel(val int) attribute.KeyValue { + return MessagingRocketmqMessageDelayTimeLevelKey.Int(val) +} + +// MessagingRocketmqMessageDeliveryTimestamp returns an attribute KeyValue +// conforming to the "messaging.rocketmq.message.delivery_timestamp" semantic +// conventions. It represents the timestamp in milliseconds that the delay +// message is expected to be delivered to consumer. +func MessagingRocketmqMessageDeliveryTimestamp(val int) attribute.KeyValue { + return MessagingRocketmqMessageDeliveryTimestampKey.Int(val) +} + +// MessagingRocketmqMessageGroup returns an attribute KeyValue conforming to +// the "messaging.rocketmq.message.group" semantic conventions. It represents +// the it is essential for FIFO message. Messages that belong to the same +// message group are always processed one by one within the same consumer +// group. +func MessagingRocketmqMessageGroup(val string) attribute.KeyValue { + return MessagingRocketmqMessageGroupKey.String(val) +} + +// MessagingRocketmqMessageKeys returns an attribute KeyValue conforming to +// the "messaging.rocketmq.message.keys" semantic conventions. It represents +// the key(s) of message, another way to mark message besides message id. +func MessagingRocketmqMessageKeys(val ...string) attribute.KeyValue { + return MessagingRocketmqMessageKeysKey.StringSlice(val) +} + +// MessagingRocketmqMessageTag returns an attribute KeyValue conforming to +// the "messaging.rocketmq.message.tag" semantic conventions. It represents the +// secondary classifier of message besides topic. +func MessagingRocketmqMessageTag(val string) attribute.KeyValue { + return MessagingRocketmqMessageTagKey.String(val) +} + +// MessagingRocketmqNamespace returns an attribute KeyValue conforming to +// the "messaging.rocketmq.namespace" semantic conventions. It represents the +// namespace of RocketMQ resources, resources in different namespaces are +// individual. +func MessagingRocketmqNamespace(val string) attribute.KeyValue { + return MessagingRocketmqNamespaceKey.String(val) +} + +// This group describes attributes specific to GCP Pub/Sub. +const ( + // MessagingGCPPubsubMessageAckDeadlineKey is the attribute Key conforming + // to the "messaging.gcp_pubsub.message.ack_deadline" semantic conventions. + // It represents the ack deadline in seconds set for the modify ack + // deadline request. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 10 + MessagingGCPPubsubMessageAckDeadlineKey = attribute.Key("messaging.gcp_pubsub.message.ack_deadline") + + // MessagingGCPPubsubMessageAckIDKey is the attribute Key conforming to the + // "messaging.gcp_pubsub.message.ack_id" semantic conventions. It + // represents the ack id for a given message. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'ack_id' + MessagingGCPPubsubMessageAckIDKey = attribute.Key("messaging.gcp_pubsub.message.ack_id") + + // MessagingGCPPubsubMessageDeliveryAttemptKey is the attribute Key + // conforming to the "messaging.gcp_pubsub.message.delivery_attempt" + // semantic conventions. It represents the delivery attempt for a given + // message. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 2 + MessagingGCPPubsubMessageDeliveryAttemptKey = attribute.Key("messaging.gcp_pubsub.message.delivery_attempt") + + // MessagingGCPPubsubMessageOrderingKeyKey is the attribute Key conforming + // to the "messaging.gcp_pubsub.message.ordering_key" semantic conventions. + // It represents the ordering key for a given message. If the attribute is + // not present, the message does not have an ordering key. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'ordering_key' + MessagingGCPPubsubMessageOrderingKeyKey = attribute.Key("messaging.gcp_pubsub.message.ordering_key") +) + +// MessagingGCPPubsubMessageAckDeadline returns an attribute KeyValue +// conforming to the "messaging.gcp_pubsub.message.ack_deadline" semantic +// conventions. It represents the ack deadline in seconds set for the modify +// ack deadline request. +func MessagingGCPPubsubMessageAckDeadline(val int) attribute.KeyValue { + return MessagingGCPPubsubMessageAckDeadlineKey.Int(val) +} + +// MessagingGCPPubsubMessageAckID returns an attribute KeyValue conforming +// to the "messaging.gcp_pubsub.message.ack_id" semantic conventions. It +// represents the ack id for a given message. +func MessagingGCPPubsubMessageAckID(val string) attribute.KeyValue { + return MessagingGCPPubsubMessageAckIDKey.String(val) +} + +// MessagingGCPPubsubMessageDeliveryAttempt returns an attribute KeyValue +// conforming to the "messaging.gcp_pubsub.message.delivery_attempt" semantic +// conventions. It represents the delivery attempt for a given message. +func MessagingGCPPubsubMessageDeliveryAttempt(val int) attribute.KeyValue { + return MessagingGCPPubsubMessageDeliveryAttemptKey.Int(val) +} + +// MessagingGCPPubsubMessageOrderingKey returns an attribute KeyValue +// conforming to the "messaging.gcp_pubsub.message.ordering_key" semantic +// conventions. It represents the ordering key for a given message. If the +// attribute is not present, the message does not have an ordering key. +func MessagingGCPPubsubMessageOrderingKey(val string) attribute.KeyValue { + return MessagingGCPPubsubMessageOrderingKeyKey.String(val) +} + +// This group describes attributes specific to Azure Service Bus. +const ( + // MessagingServicebusDestinationSubscriptionNameKey is the attribute Key + // conforming to the "messaging.servicebus.destination.subscription_name" + // semantic conventions. It represents the name of the subscription in the + // topic messages are received from. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'mySubscription' + MessagingServicebusDestinationSubscriptionNameKey = attribute.Key("messaging.servicebus.destination.subscription_name") + + // MessagingServicebusDispositionStatusKey is the attribute Key conforming + // to the "messaging.servicebus.disposition_status" semantic conventions. + // It represents the describes the [settlement + // type](https://learn.microsoft.com/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock). + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + MessagingServicebusDispositionStatusKey = attribute.Key("messaging.servicebus.disposition_status") + + // MessagingServicebusMessageDeliveryCountKey is the attribute Key + // conforming to the "messaging.servicebus.message.delivery_count" semantic + // conventions. It represents the number of deliveries that have been + // attempted for this message. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 2 + MessagingServicebusMessageDeliveryCountKey = attribute.Key("messaging.servicebus.message.delivery_count") + + // MessagingServicebusMessageEnqueuedTimeKey is the attribute Key + // conforming to the "messaging.servicebus.message.enqueued_time" semantic + // conventions. It represents the UTC epoch seconds at which the message + // has been accepted and stored in the entity. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1701393730 + MessagingServicebusMessageEnqueuedTimeKey = attribute.Key("messaging.servicebus.message.enqueued_time") +) + +var ( + // Message is completed + MessagingServicebusDispositionStatusComplete = MessagingServicebusDispositionStatusKey.String("complete") + // Message is abandoned + MessagingServicebusDispositionStatusAbandon = MessagingServicebusDispositionStatusKey.String("abandon") + // Message is sent to dead letter queue + MessagingServicebusDispositionStatusDeadLetter = MessagingServicebusDispositionStatusKey.String("dead_letter") + // Message is deferred + MessagingServicebusDispositionStatusDefer = MessagingServicebusDispositionStatusKey.String("defer") +) + +// MessagingServicebusDestinationSubscriptionName returns an attribute +// KeyValue conforming to the +// "messaging.servicebus.destination.subscription_name" semantic conventions. +// It represents the name of the subscription in the topic messages are +// received from. +func MessagingServicebusDestinationSubscriptionName(val string) attribute.KeyValue { + return MessagingServicebusDestinationSubscriptionNameKey.String(val) +} + +// MessagingServicebusMessageDeliveryCount returns an attribute KeyValue +// conforming to the "messaging.servicebus.message.delivery_count" semantic +// conventions. It represents the number of deliveries that have been attempted +// for this message. +func MessagingServicebusMessageDeliveryCount(val int) attribute.KeyValue { + return MessagingServicebusMessageDeliveryCountKey.Int(val) +} + +// MessagingServicebusMessageEnqueuedTime returns an attribute KeyValue +// conforming to the "messaging.servicebus.message.enqueued_time" semantic +// conventions. It represents the UTC epoch seconds at which the message has +// been accepted and stored in the entity. +func MessagingServicebusMessageEnqueuedTime(val int) attribute.KeyValue { + return MessagingServicebusMessageEnqueuedTimeKey.Int(val) +} + +// This group describes attributes specific to Azure Event Hubs. +const ( + // MessagingEventhubsConsumerGroupKey is the attribute Key conforming to + // the "messaging.eventhubs.consumer.group" semantic conventions. It + // represents the name of the consumer group the event consumer is + // associated with. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'indexer' + MessagingEventhubsConsumerGroupKey = attribute.Key("messaging.eventhubs.consumer.group") + + // MessagingEventhubsMessageEnqueuedTimeKey is the attribute Key conforming + // to the "messaging.eventhubs.message.enqueued_time" semantic conventions. + // It represents the UTC epoch seconds at which the message has been + // accepted and stored in the entity. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1701393730 + MessagingEventhubsMessageEnqueuedTimeKey = attribute.Key("messaging.eventhubs.message.enqueued_time") +) + +// MessagingEventhubsConsumerGroup returns an attribute KeyValue conforming +// to the "messaging.eventhubs.consumer.group" semantic conventions. It +// represents the name of the consumer group the event consumer is associated +// with. +func MessagingEventhubsConsumerGroup(val string) attribute.KeyValue { + return MessagingEventhubsConsumerGroupKey.String(val) +} + +// MessagingEventhubsMessageEnqueuedTime returns an attribute KeyValue +// conforming to the "messaging.eventhubs.message.enqueued_time" semantic +// conventions. It represents the UTC epoch seconds at which the message has +// been accepted and stored in the entity. +func MessagingEventhubsMessageEnqueuedTime(val int) attribute.KeyValue { + return MessagingEventhubsMessageEnqueuedTimeKey.Int(val) +} + +// These attributes may be used for any network related operation. +const ( + // NetworkCarrierIccKey is the attribute Key conforming to the + // "network.carrier.icc" semantic conventions. It represents the ISO 3166-1 + // alpha-2 2-character country code associated with the mobile carrier + // network. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'DE' + NetworkCarrierIccKey = attribute.Key("network.carrier.icc") + + // NetworkCarrierMccKey is the attribute Key conforming to the + // "network.carrier.mcc" semantic conventions. It represents the mobile + // carrier country code. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '310' + NetworkCarrierMccKey = attribute.Key("network.carrier.mcc") + + // NetworkCarrierMncKey is the attribute Key conforming to the + // "network.carrier.mnc" semantic conventions. It represents the mobile + // carrier network code. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '001' + NetworkCarrierMncKey = attribute.Key("network.carrier.mnc") + + // NetworkCarrierNameKey is the attribute Key conforming to the + // "network.carrier.name" semantic conventions. It represents the name of + // the mobile carrier. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'sprint' + NetworkCarrierNameKey = attribute.Key("network.carrier.name") + + // NetworkConnectionSubtypeKey is the attribute Key conforming to the + // "network.connection.subtype" semantic conventions. It represents the + // this describes more details regarding the connection.type. It may be the + // type of cell technology connection, but it could be used for describing + // details about a wifi connection. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'LTE' + NetworkConnectionSubtypeKey = attribute.Key("network.connection.subtype") + + // NetworkConnectionTypeKey is the attribute Key conforming to the + // "network.connection.type" semantic conventions. It represents the + // internet connection type. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'wifi' + NetworkConnectionTypeKey = attribute.Key("network.connection.type") + + // NetworkIoDirectionKey is the attribute Key conforming to the + // "network.io.direction" semantic conventions. It represents the network + // IO operation direction. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'transmit' + NetworkIoDirectionKey = attribute.Key("network.io.direction") + + // NetworkLocalAddressKey is the attribute Key conforming to the + // "network.local.address" semantic conventions. It represents the local + // address of the network connection - IP address or Unix domain socket + // name. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '10.1.2.80', '/tmp/my.sock' + NetworkLocalAddressKey = attribute.Key("network.local.address") + + // NetworkLocalPortKey is the attribute Key conforming to the + // "network.local.port" semantic conventions. It represents the local port + // number of the network connection. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 65123 + NetworkLocalPortKey = attribute.Key("network.local.port") + + // NetworkPeerAddressKey is the attribute Key conforming to the + // "network.peer.address" semantic conventions. It represents the peer + // address of the network connection - IP address or Unix domain socket + // name. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '10.1.2.80', '/tmp/my.sock' + NetworkPeerAddressKey = attribute.Key("network.peer.address") + + // NetworkPeerPortKey is the attribute Key conforming to the + // "network.peer.port" semantic conventions. It represents the peer port + // number of the network connection. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 65123 + NetworkPeerPortKey = attribute.Key("network.peer.port") + + // NetworkProtocolNameKey is the attribute Key conforming to the + // "network.protocol.name" semantic conventions. It represents the [OSI + // application layer](https://osi-model.com/application-layer/) or non-OSI + // equivalent. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'amqp', 'http', 'mqtt' + // Note: The value SHOULD be normalized to lowercase. + NetworkProtocolNameKey = attribute.Key("network.protocol.name") + + // NetworkProtocolVersionKey is the attribute Key conforming to the + // "network.protocol.version" semantic conventions. It represents the + // actual version of the protocol used for network communication. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '1.1', '2' + // Note: If protocol version is subject to negotiation (for example using + // [ALPN](https://www.rfc-editor.org/rfc/rfc7301.html)), this attribute + // SHOULD be set to the negotiated version. If the actual protocol version + // is not known, this attribute SHOULD NOT be set. + NetworkProtocolVersionKey = attribute.Key("network.protocol.version") + + // NetworkTransportKey is the attribute Key conforming to the + // "network.transport" semantic conventions. It represents the [OSI + // transport layer](https://osi-model.com/transport-layer/) or + // [inter-process communication + // method](https://wikipedia.org/wiki/Inter-process_communication). + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'tcp', 'udp' + // Note: The value SHOULD be normalized to lowercase. + // + // Consider always setting the transport when setting a port number, since + // a port number is ambiguous without knowing the transport. For example + // different processes could be listening on TCP port 12345 and UDP port + // 12345. + NetworkTransportKey = attribute.Key("network.transport") + + // NetworkTypeKey is the attribute Key conforming to the "network.type" + // semantic conventions. It represents the [OSI network + // layer](https://osi-model.com/network-layer/) or non-OSI equivalent. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'ipv4', 'ipv6' + // Note: The value SHOULD be normalized to lowercase. + NetworkTypeKey = attribute.Key("network.type") +) + +var ( + // GPRS + NetworkConnectionSubtypeGprs = NetworkConnectionSubtypeKey.String("gprs") + // EDGE + NetworkConnectionSubtypeEdge = NetworkConnectionSubtypeKey.String("edge") + // UMTS + NetworkConnectionSubtypeUmts = NetworkConnectionSubtypeKey.String("umts") + // CDMA + NetworkConnectionSubtypeCdma = NetworkConnectionSubtypeKey.String("cdma") + // EVDO Rel. 0 + NetworkConnectionSubtypeEvdo0 = NetworkConnectionSubtypeKey.String("evdo_0") + // EVDO Rev. A + NetworkConnectionSubtypeEvdoA = NetworkConnectionSubtypeKey.String("evdo_a") + // CDMA2000 1XRTT + NetworkConnectionSubtypeCdma20001xrtt = NetworkConnectionSubtypeKey.String("cdma2000_1xrtt") + // HSDPA + NetworkConnectionSubtypeHsdpa = NetworkConnectionSubtypeKey.String("hsdpa") + // HSUPA + NetworkConnectionSubtypeHsupa = NetworkConnectionSubtypeKey.String("hsupa") + // HSPA + NetworkConnectionSubtypeHspa = NetworkConnectionSubtypeKey.String("hspa") + // IDEN + NetworkConnectionSubtypeIden = NetworkConnectionSubtypeKey.String("iden") + // EVDO Rev. B + NetworkConnectionSubtypeEvdoB = NetworkConnectionSubtypeKey.String("evdo_b") + // LTE + NetworkConnectionSubtypeLte = NetworkConnectionSubtypeKey.String("lte") + // EHRPD + NetworkConnectionSubtypeEhrpd = NetworkConnectionSubtypeKey.String("ehrpd") + // HSPAP + NetworkConnectionSubtypeHspap = NetworkConnectionSubtypeKey.String("hspap") + // GSM + NetworkConnectionSubtypeGsm = NetworkConnectionSubtypeKey.String("gsm") + // TD-SCDMA + NetworkConnectionSubtypeTdScdma = NetworkConnectionSubtypeKey.String("td_scdma") + // IWLAN + NetworkConnectionSubtypeIwlan = NetworkConnectionSubtypeKey.String("iwlan") + // 5G NR (New Radio) + NetworkConnectionSubtypeNr = NetworkConnectionSubtypeKey.String("nr") + // 5G NRNSA (New Radio Non-Standalone) + NetworkConnectionSubtypeNrnsa = NetworkConnectionSubtypeKey.String("nrnsa") + // LTE CA + NetworkConnectionSubtypeLteCa = NetworkConnectionSubtypeKey.String("lte_ca") +) + +var ( + // wifi + NetworkConnectionTypeWifi = NetworkConnectionTypeKey.String("wifi") + // wired + NetworkConnectionTypeWired = NetworkConnectionTypeKey.String("wired") + // cell + NetworkConnectionTypeCell = NetworkConnectionTypeKey.String("cell") + // unavailable + NetworkConnectionTypeUnavailable = NetworkConnectionTypeKey.String("unavailable") + // unknown + NetworkConnectionTypeUnknown = NetworkConnectionTypeKey.String("unknown") +) + +var ( + // transmit + NetworkIoDirectionTransmit = NetworkIoDirectionKey.String("transmit") + // receive + NetworkIoDirectionReceive = NetworkIoDirectionKey.String("receive") +) + +var ( + // TCP + NetworkTransportTCP = NetworkTransportKey.String("tcp") + // UDP + NetworkTransportUDP = NetworkTransportKey.String("udp") + // Named or anonymous pipe + NetworkTransportPipe = NetworkTransportKey.String("pipe") + // Unix domain socket + NetworkTransportUnix = NetworkTransportKey.String("unix") +) + +var ( + // IPv4 + NetworkTypeIpv4 = NetworkTypeKey.String("ipv4") + // IPv6 + NetworkTypeIpv6 = NetworkTypeKey.String("ipv6") +) + +// NetworkCarrierIcc returns an attribute KeyValue conforming to the +// "network.carrier.icc" semantic conventions. It represents the ISO 3166-1 +// alpha-2 2-character country code associated with the mobile carrier network. +func NetworkCarrierIcc(val string) attribute.KeyValue { + return NetworkCarrierIccKey.String(val) +} + +// NetworkCarrierMcc returns an attribute KeyValue conforming to the +// "network.carrier.mcc" semantic conventions. It represents the mobile carrier +// country code. +func NetworkCarrierMcc(val string) attribute.KeyValue { + return NetworkCarrierMccKey.String(val) +} + +// NetworkCarrierMnc returns an attribute KeyValue conforming to the +// "network.carrier.mnc" semantic conventions. It represents the mobile carrier +// network code. +func NetworkCarrierMnc(val string) attribute.KeyValue { + return NetworkCarrierMncKey.String(val) +} + +// NetworkCarrierName returns an attribute KeyValue conforming to the +// "network.carrier.name" semantic conventions. It represents the name of the +// mobile carrier. +func NetworkCarrierName(val string) attribute.KeyValue { + return NetworkCarrierNameKey.String(val) +} + +// NetworkLocalAddress returns an attribute KeyValue conforming to the +// "network.local.address" semantic conventions. It represents the local +// address of the network connection - IP address or Unix domain socket name. +func NetworkLocalAddress(val string) attribute.KeyValue { + return NetworkLocalAddressKey.String(val) +} + +// NetworkLocalPort returns an attribute KeyValue conforming to the +// "network.local.port" semantic conventions. It represents the local port +// number of the network connection. +func NetworkLocalPort(val int) attribute.KeyValue { + return NetworkLocalPortKey.Int(val) +} + +// NetworkPeerAddress returns an attribute KeyValue conforming to the +// "network.peer.address" semantic conventions. It represents the peer address +// of the network connection - IP address or Unix domain socket name. +func NetworkPeerAddress(val string) attribute.KeyValue { + return NetworkPeerAddressKey.String(val) +} + +// NetworkPeerPort returns an attribute KeyValue conforming to the +// "network.peer.port" semantic conventions. It represents the peer port number +// of the network connection. +func NetworkPeerPort(val int) attribute.KeyValue { + return NetworkPeerPortKey.Int(val) +} + +// NetworkProtocolName returns an attribute KeyValue conforming to the +// "network.protocol.name" semantic conventions. It represents the [OSI +// application layer](https://osi-model.com/application-layer/) or non-OSI +// equivalent. +func NetworkProtocolName(val string) attribute.KeyValue { + return NetworkProtocolNameKey.String(val) +} + +// NetworkProtocolVersion returns an attribute KeyValue conforming to the +// "network.protocol.version" semantic conventions. It represents the actual +// version of the protocol used for network communication. +func NetworkProtocolVersion(val string) attribute.KeyValue { + return NetworkProtocolVersionKey.String(val) +} + +// An OCI image manifest. +const ( + // OciManifestDigestKey is the attribute Key conforming to the + // "oci.manifest.digest" semantic conventions. It represents the digest of + // the OCI image manifest. For container images specifically is the digest + // by which the container image is known. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // 'sha256:e4ca62c0d62f3e886e684806dfe9d4e0cda60d54986898173c1083856cfda0f4' + // Note: Follows [OCI Image Manifest + // Specification](https://github.com/opencontainers/image-spec/blob/main/manifest.md), + // and specifically the [Digest + // property](https://github.com/opencontainers/image-spec/blob/main/descriptor.md#digests). + // An example can be found in [Example Image + // Manifest](https://docs.docker.com/registry/spec/manifest-v2-2/#example-image-manifest). + OciManifestDigestKey = attribute.Key("oci.manifest.digest") +) + +// OciManifestDigest returns an attribute KeyValue conforming to the +// "oci.manifest.digest" semantic conventions. It represents the digest of the +// OCI image manifest. For container images specifically is the digest by which +// the container image is known. +func OciManifestDigest(val string) attribute.KeyValue { + return OciManifestDigestKey.String(val) +} + +// Attributes used by the OpenTracing Shim layer. +const ( + // OpentracingRefTypeKey is the attribute Key conforming to the + // "opentracing.ref_type" semantic conventions. It represents the + // parent-child Reference type + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Note: The causal relationship between a child Span and a parent Span. + OpentracingRefTypeKey = attribute.Key("opentracing.ref_type") +) + +var ( + // The parent Span depends on the child Span in some capacity + OpentracingRefTypeChildOf = OpentracingRefTypeKey.String("child_of") + // The parent Span doesn't depend in any way on the result of the child Span + OpentracingRefTypeFollowsFrom = OpentracingRefTypeKey.String("follows_from") +) + +// The operating system (OS) on which the process represented by this resource +// is running. +const ( + // OSBuildIDKey is the attribute Key conforming to the "os.build_id" + // semantic conventions. It represents the unique identifier for a + // particular build or compilation of the operating system. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'TQ3C.230805.001.B2', '20E247', '22621' + OSBuildIDKey = attribute.Key("os.build_id") + + // OSDescriptionKey is the attribute Key conforming to the "os.description" + // semantic conventions. It represents the human readable (not intended to + // be parsed) OS version information, like e.g. reported by `ver` or + // `lsb_release -a` commands. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Microsoft Windows [Version 10.0.18363.778]', 'Ubuntu 18.04.1 + // LTS' + OSDescriptionKey = attribute.Key("os.description") + + // OSNameKey is the attribute Key conforming to the "os.name" semantic + // conventions. It represents the human readable operating system name. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'iOS', 'Android', 'Ubuntu' + OSNameKey = attribute.Key("os.name") + + // OSTypeKey is the attribute Key conforming to the "os.type" semantic + // conventions. It represents the operating system type. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + OSTypeKey = attribute.Key("os.type") + + // OSVersionKey is the attribute Key conforming to the "os.version" + // semantic conventions. It represents the version string of the operating + // system as defined in [Version + // Attributes](/docs/resource/README.md#version-attributes). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '14.2.1', '18.04.1' + OSVersionKey = attribute.Key("os.version") +) + +var ( + // Microsoft Windows + OSTypeWindows = OSTypeKey.String("windows") + // Linux + OSTypeLinux = OSTypeKey.String("linux") + // Apple Darwin + OSTypeDarwin = OSTypeKey.String("darwin") + // FreeBSD + OSTypeFreeBSD = OSTypeKey.String("freebsd") + // NetBSD + OSTypeNetBSD = OSTypeKey.String("netbsd") + // OpenBSD + OSTypeOpenBSD = OSTypeKey.String("openbsd") + // DragonFly BSD + OSTypeDragonflyBSD = OSTypeKey.String("dragonflybsd") + // HP-UX (Hewlett Packard Unix) + OSTypeHPUX = OSTypeKey.String("hpux") + // AIX (Advanced Interactive eXecutive) + OSTypeAIX = OSTypeKey.String("aix") + // SunOS, Oracle Solaris + OSTypeSolaris = OSTypeKey.String("solaris") + // IBM z/OS + OSTypeZOS = OSTypeKey.String("z_os") +) + +// OSBuildID returns an attribute KeyValue conforming to the "os.build_id" +// semantic conventions. It represents the unique identifier for a particular +// build or compilation of the operating system. +func OSBuildID(val string) attribute.KeyValue { + return OSBuildIDKey.String(val) +} + +// OSDescription returns an attribute KeyValue conforming to the +// "os.description" semantic conventions. It represents the human readable (not +// intended to be parsed) OS version information, like e.g. reported by `ver` +// or `lsb_release -a` commands. +func OSDescription(val string) attribute.KeyValue { + return OSDescriptionKey.String(val) +} + +// OSName returns an attribute KeyValue conforming to the "os.name" semantic +// conventions. It represents the human readable operating system name. +func OSName(val string) attribute.KeyValue { + return OSNameKey.String(val) +} + +// OSVersion returns an attribute KeyValue conforming to the "os.version" +// semantic conventions. It represents the version string of the operating +// system as defined in [Version +// Attributes](/docs/resource/README.md#version-attributes). +func OSVersion(val string) attribute.KeyValue { + return OSVersionKey.String(val) +} + +// Attributes reserved for OpenTelemetry +const ( + // OTelStatusCodeKey is the attribute Key conforming to the + // "otel.status_code" semantic conventions. It represents the name of the + // code, either "OK" or "ERROR". MUST NOT be set if the status code is + // UNSET. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + OTelStatusCodeKey = attribute.Key("otel.status_code") + + // OTelStatusDescriptionKey is the attribute Key conforming to the + // "otel.status_description" semantic conventions. It represents the + // description of the Status if it has a value, otherwise not set. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'resource not found' + OTelStatusDescriptionKey = attribute.Key("otel.status_description") +) + +var ( + // The operation has been validated by an Application developer or Operator to have completed successfully + OTelStatusCodeOk = OTelStatusCodeKey.String("OK") + // The operation contains an error + OTelStatusCodeError = OTelStatusCodeKey.String("ERROR") +) + +// OTelStatusDescription returns an attribute KeyValue conforming to the +// "otel.status_description" semantic conventions. It represents the +// description of the Status if it has a value, otherwise not set. +func OTelStatusDescription(val string) attribute.KeyValue { + return OTelStatusDescriptionKey.String(val) +} + +// Attributes used by non-OTLP exporters to represent OpenTelemetry Scope's +// concepts. +const ( + // OTelScopeNameKey is the attribute Key conforming to the + // "otel.scope.name" semantic conventions. It represents the name of the + // instrumentation scope - (`InstrumentationScope.Name` in OTLP). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'io.opentelemetry.contrib.mongodb' + OTelScopeNameKey = attribute.Key("otel.scope.name") + + // OTelScopeVersionKey is the attribute Key conforming to the + // "otel.scope.version" semantic conventions. It represents the version of + // the instrumentation scope - (`InstrumentationScope.Version` in OTLP). + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '1.0.0' + OTelScopeVersionKey = attribute.Key("otel.scope.version") +) + +// OTelScopeName returns an attribute KeyValue conforming to the +// "otel.scope.name" semantic conventions. It represents the name of the +// instrumentation scope - (`InstrumentationScope.Name` in OTLP). +func OTelScopeName(val string) attribute.KeyValue { + return OTelScopeNameKey.String(val) +} + +// OTelScopeVersion returns an attribute KeyValue conforming to the +// "otel.scope.version" semantic conventions. It represents the version of the +// instrumentation scope - (`InstrumentationScope.Version` in OTLP). +func OTelScopeVersion(val string) attribute.KeyValue { + return OTelScopeVersionKey.String(val) +} + +// Operations that access some remote service. +const ( + // PeerServiceKey is the attribute Key conforming to the "peer.service" + // semantic conventions. It represents the + // [`service.name`](/docs/resource/README.md#service) of the remote + // service. SHOULD be equal to the actual `service.name` resource attribute + // of the remote service if any. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'AuthTokenCache' + PeerServiceKey = attribute.Key("peer.service") +) + +// PeerService returns an attribute KeyValue conforming to the +// "peer.service" semantic conventions. It represents the +// [`service.name`](/docs/resource/README.md#service) of the remote service. +// SHOULD be equal to the actual `service.name` resource attribute of the +// remote service if any. +func PeerService(val string) attribute.KeyValue { + return PeerServiceKey.String(val) +} + +// An operating system process. +const ( + // ProcessCommandKey is the attribute Key conforming to the + // "process.command" semantic conventions. It represents the command used + // to launch the process (i.e. the command name). On Linux based systems, + // can be set to the zeroth string in `proc/[pid]/cmdline`. On Windows, can + // be set to the first parameter extracted from `GetCommandLineW`. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'cmd/otelcol' + ProcessCommandKey = attribute.Key("process.command") + + // ProcessCommandArgsKey is the attribute Key conforming to the + // "process.command_args" semantic conventions. It represents the all the + // command arguments (including the command/executable itself) as received + // by the process. On Linux-based systems (and some other Unixoid systems + // supporting procfs), can be set according to the list of null-delimited + // strings extracted from `proc/[pid]/cmdline`. For libc-based executables, + // this would be the full argv vector passed to `main`. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'cmd/otecol', '--config=config.yaml' + ProcessCommandArgsKey = attribute.Key("process.command_args") + + // ProcessCommandLineKey is the attribute Key conforming to the + // "process.command_line" semantic conventions. It represents the full + // command used to launch the process as a single string representing the + // full command. On Windows, can be set to the result of `GetCommandLineW`. + // Do not set this if you have to assemble it just for monitoring; use + // `process.command_args` instead. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'C:\\cmd\\otecol --config="my directory\\config.yaml"' + ProcessCommandLineKey = attribute.Key("process.command_line") + + // ProcessContextSwitchTypeKey is the attribute Key conforming to the + // "process.context_switch_type" semantic conventions. It represents the + // specifies whether the context switches for this data point were + // voluntary or involuntary. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + ProcessContextSwitchTypeKey = attribute.Key("process.context_switch_type") + + // ProcessCreationTimeKey is the attribute Key conforming to the + // "process.creation.time" semantic conventions. It represents the date and + // time the process was created, in ISO 8601 format. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2023-11-21T09:25:34.853Z' + ProcessCreationTimeKey = attribute.Key("process.creation.time") + + // ProcessExecutableNameKey is the attribute Key conforming to the + // "process.executable.name" semantic conventions. It represents the name + // of the process executable. On Linux based systems, can be set to the + // `Name` in `proc/[pid]/status`. On Windows, can be set to the base name + // of `GetProcessImageFileNameW`. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'otelcol' + ProcessExecutableNameKey = attribute.Key("process.executable.name") + + // ProcessExecutablePathKey is the attribute Key conforming to the + // "process.executable.path" semantic conventions. It represents the full + // path to the process executable. On Linux based systems, can be set to + // the target of `proc/[pid]/exe`. On Windows, can be set to the result of + // `GetProcessImageFileNameW`. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/usr/bin/cmd/otelcol' + ProcessExecutablePathKey = attribute.Key("process.executable.path") + + // ProcessExitCodeKey is the attribute Key conforming to the + // "process.exit.code" semantic conventions. It represents the exit code of + // the process. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 127 + ProcessExitCodeKey = attribute.Key("process.exit.code") + + // ProcessExitTimeKey is the attribute Key conforming to the + // "process.exit.time" semantic conventions. It represents the date and + // time the process exited, in ISO 8601 format. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2023-11-21T09:26:12.315Z' + ProcessExitTimeKey = attribute.Key("process.exit.time") + + // ProcessGroupLeaderPIDKey is the attribute Key conforming to the + // "process.group_leader.pid" semantic conventions. It represents the PID + // of the process's group leader. This is also the process group ID (PGID) + // of the process. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 23 + ProcessGroupLeaderPIDKey = attribute.Key("process.group_leader.pid") + + // ProcessInteractiveKey is the attribute Key conforming to the + // "process.interactive" semantic conventions. It represents the whether + // the process is connected to an interactive shell. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + ProcessInteractiveKey = attribute.Key("process.interactive") + + // ProcessOwnerKey is the attribute Key conforming to the "process.owner" + // semantic conventions. It represents the username of the user that owns + // the process. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'root' + ProcessOwnerKey = attribute.Key("process.owner") + + // ProcessPagingFaultTypeKey is the attribute Key conforming to the + // "process.paging.fault_type" semantic conventions. It represents the type + // of page fault for this data point. Type `major` is for major/hard page + // faults, and `minor` is for minor/soft page faults. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + ProcessPagingFaultTypeKey = attribute.Key("process.paging.fault_type") + + // ProcessParentPIDKey is the attribute Key conforming to the + // "process.parent_pid" semantic conventions. It represents the parent + // Process identifier (PPID). + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 111 + ProcessParentPIDKey = attribute.Key("process.parent_pid") + + // ProcessPIDKey is the attribute Key conforming to the "process.pid" + // semantic conventions. It represents the process identifier (PID). + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1234 + ProcessPIDKey = attribute.Key("process.pid") + + // ProcessRealUserIDKey is the attribute Key conforming to the + // "process.real_user.id" semantic conventions. It represents the real user + // ID (RUID) of the process. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1000 + ProcessRealUserIDKey = attribute.Key("process.real_user.id") + + // ProcessRealUserNameKey is the attribute Key conforming to the + // "process.real_user.name" semantic conventions. It represents the + // username of the real user of the process. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'operator' + ProcessRealUserNameKey = attribute.Key("process.real_user.name") + + // ProcessRuntimeDescriptionKey is the attribute Key conforming to the + // "process.runtime.description" semantic conventions. It represents an + // additional description about the runtime of the process, for example a + // specific vendor customization of the runtime environment. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Eclipse OpenJ9 Eclipse OpenJ9 VM openj9-0.21.0' + ProcessRuntimeDescriptionKey = attribute.Key("process.runtime.description") + + // ProcessRuntimeNameKey is the attribute Key conforming to the + // "process.runtime.name" semantic conventions. It represents the name of + // the runtime of this process. For compiled native binaries, this SHOULD + // be the name of the compiler. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'OpenJDK Runtime Environment' + ProcessRuntimeNameKey = attribute.Key("process.runtime.name") + + // ProcessRuntimeVersionKey is the attribute Key conforming to the + // "process.runtime.version" semantic conventions. It represents the + // version of the runtime of this process, as returned by the runtime + // without modification. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '14.0.2' + ProcessRuntimeVersionKey = attribute.Key("process.runtime.version") + + // ProcessSavedUserIDKey is the attribute Key conforming to the + // "process.saved_user.id" semantic conventions. It represents the saved + // user ID (SUID) of the process. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1002 + ProcessSavedUserIDKey = attribute.Key("process.saved_user.id") + + // ProcessSavedUserNameKey is the attribute Key conforming to the + // "process.saved_user.name" semantic conventions. It represents the + // username of the saved user. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'operator' + ProcessSavedUserNameKey = attribute.Key("process.saved_user.name") + + // ProcessSessionLeaderPIDKey is the attribute Key conforming to the + // "process.session_leader.pid" semantic conventions. It represents the PID + // of the process's session leader. This is also the session ID (SID) of + // the process. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 14 + ProcessSessionLeaderPIDKey = attribute.Key("process.session_leader.pid") + + // ProcessUserIDKey is the attribute Key conforming to the + // "process.user.id" semantic conventions. It represents the effective user + // ID (EUID) of the process. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1001 + ProcessUserIDKey = attribute.Key("process.user.id") + + // ProcessUserNameKey is the attribute Key conforming to the + // "process.user.name" semantic conventions. It represents the username of + // the effective user of the process. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'root' + ProcessUserNameKey = attribute.Key("process.user.name") + + // ProcessVpidKey is the attribute Key conforming to the "process.vpid" + // semantic conventions. It represents the virtual process identifier. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 12 + // Note: The process ID within a PID namespace. This is not necessarily + // unique across all processes on the host but it is unique within the + // process namespace that the process exists within. + ProcessVpidKey = attribute.Key("process.vpid") +) + +var ( + // voluntary + ProcessContextSwitchTypeVoluntary = ProcessContextSwitchTypeKey.String("voluntary") + // involuntary + ProcessContextSwitchTypeInvoluntary = ProcessContextSwitchTypeKey.String("involuntary") +) + +var ( + // major + ProcessPagingFaultTypeMajor = ProcessPagingFaultTypeKey.String("major") + // minor + ProcessPagingFaultTypeMinor = ProcessPagingFaultTypeKey.String("minor") +) + +// ProcessCommand returns an attribute KeyValue conforming to the +// "process.command" semantic conventions. It represents the command used to +// launch the process (i.e. the command name). On Linux based systems, can be +// set to the zeroth string in `proc/[pid]/cmdline`. On Windows, can be set to +// the first parameter extracted from `GetCommandLineW`. +func ProcessCommand(val string) attribute.KeyValue { + return ProcessCommandKey.String(val) +} + +// ProcessCommandArgs returns an attribute KeyValue conforming to the +// "process.command_args" semantic conventions. It represents the all the +// command arguments (including the command/executable itself) as received by +// the process. On Linux-based systems (and some other Unixoid systems +// supporting procfs), can be set according to the list of null-delimited +// strings extracted from `proc/[pid]/cmdline`. For libc-based executables, +// this would be the full argv vector passed to `main`. +func ProcessCommandArgs(val ...string) attribute.KeyValue { + return ProcessCommandArgsKey.StringSlice(val) +} + +// ProcessCommandLine returns an attribute KeyValue conforming to the +// "process.command_line" semantic conventions. It represents the full command +// used to launch the process as a single string representing the full command. +// On Windows, can be set to the result of `GetCommandLineW`. Do not set this +// if you have to assemble it just for monitoring; use `process.command_args` +// instead. +func ProcessCommandLine(val string) attribute.KeyValue { + return ProcessCommandLineKey.String(val) +} + +// ProcessCreationTime returns an attribute KeyValue conforming to the +// "process.creation.time" semantic conventions. It represents the date and +// time the process was created, in ISO 8601 format. +func ProcessCreationTime(val string) attribute.KeyValue { + return ProcessCreationTimeKey.String(val) +} + +// ProcessExecutableName returns an attribute KeyValue conforming to the +// "process.executable.name" semantic conventions. It represents the name of +// the process executable. On Linux based systems, can be set to the `Name` in +// `proc/[pid]/status`. On Windows, can be set to the base name of +// `GetProcessImageFileNameW`. +func ProcessExecutableName(val string) attribute.KeyValue { + return ProcessExecutableNameKey.String(val) +} + +// ProcessExecutablePath returns an attribute KeyValue conforming to the +// "process.executable.path" semantic conventions. It represents the full path +// to the process executable. On Linux based systems, can be set to the target +// of `proc/[pid]/exe`. On Windows, can be set to the result of +// `GetProcessImageFileNameW`. +func ProcessExecutablePath(val string) attribute.KeyValue { + return ProcessExecutablePathKey.String(val) +} + +// ProcessExitCode returns an attribute KeyValue conforming to the +// "process.exit.code" semantic conventions. It represents the exit code of the +// process. +func ProcessExitCode(val int) attribute.KeyValue { + return ProcessExitCodeKey.Int(val) +} + +// ProcessExitTime returns an attribute KeyValue conforming to the +// "process.exit.time" semantic conventions. It represents the date and time +// the process exited, in ISO 8601 format. +func ProcessExitTime(val string) attribute.KeyValue { + return ProcessExitTimeKey.String(val) +} + +// ProcessGroupLeaderPID returns an attribute KeyValue conforming to the +// "process.group_leader.pid" semantic conventions. It represents the PID of +// the process's group leader. This is also the process group ID (PGID) of the +// process. +func ProcessGroupLeaderPID(val int) attribute.KeyValue { + return ProcessGroupLeaderPIDKey.Int(val) +} + +// ProcessInteractive returns an attribute KeyValue conforming to the +// "process.interactive" semantic conventions. It represents the whether the +// process is connected to an interactive shell. +func ProcessInteractive(val bool) attribute.KeyValue { + return ProcessInteractiveKey.Bool(val) +} + +// ProcessOwner returns an attribute KeyValue conforming to the +// "process.owner" semantic conventions. It represents the username of the user +// that owns the process. +func ProcessOwner(val string) attribute.KeyValue { + return ProcessOwnerKey.String(val) +} + +// ProcessParentPID returns an attribute KeyValue conforming to the +// "process.parent_pid" semantic conventions. It represents the parent Process +// identifier (PPID). +func ProcessParentPID(val int) attribute.KeyValue { + return ProcessParentPIDKey.Int(val) +} + +// ProcessPID returns an attribute KeyValue conforming to the "process.pid" +// semantic conventions. It represents the process identifier (PID). +func ProcessPID(val int) attribute.KeyValue { + return ProcessPIDKey.Int(val) +} + +// ProcessRealUserID returns an attribute KeyValue conforming to the +// "process.real_user.id" semantic conventions. It represents the real user ID +// (RUID) of the process. +func ProcessRealUserID(val int) attribute.KeyValue { + return ProcessRealUserIDKey.Int(val) +} + +// ProcessRealUserName returns an attribute KeyValue conforming to the +// "process.real_user.name" semantic conventions. It represents the username of +// the real user of the process. +func ProcessRealUserName(val string) attribute.KeyValue { + return ProcessRealUserNameKey.String(val) +} + +// ProcessRuntimeDescription returns an attribute KeyValue conforming to the +// "process.runtime.description" semantic conventions. It represents an +// additional description about the runtime of the process, for example a +// specific vendor customization of the runtime environment. +func ProcessRuntimeDescription(val string) attribute.KeyValue { + return ProcessRuntimeDescriptionKey.String(val) +} + +// ProcessRuntimeName returns an attribute KeyValue conforming to the +// "process.runtime.name" semantic conventions. It represents the name of the +// runtime of this process. For compiled native binaries, this SHOULD be the +// name of the compiler. +func ProcessRuntimeName(val string) attribute.KeyValue { + return ProcessRuntimeNameKey.String(val) +} + +// ProcessRuntimeVersion returns an attribute KeyValue conforming to the +// "process.runtime.version" semantic conventions. It represents the version of +// the runtime of this process, as returned by the runtime without +// modification. +func ProcessRuntimeVersion(val string) attribute.KeyValue { + return ProcessRuntimeVersionKey.String(val) +} + +// ProcessSavedUserID returns an attribute KeyValue conforming to the +// "process.saved_user.id" semantic conventions. It represents the saved user +// ID (SUID) of the process. +func ProcessSavedUserID(val int) attribute.KeyValue { + return ProcessSavedUserIDKey.Int(val) +} + +// ProcessSavedUserName returns an attribute KeyValue conforming to the +// "process.saved_user.name" semantic conventions. It represents the username +// of the saved user. +func ProcessSavedUserName(val string) attribute.KeyValue { + return ProcessSavedUserNameKey.String(val) +} + +// ProcessSessionLeaderPID returns an attribute KeyValue conforming to the +// "process.session_leader.pid" semantic conventions. It represents the PID of +// the process's session leader. This is also the session ID (SID) of the +// process. +func ProcessSessionLeaderPID(val int) attribute.KeyValue { + return ProcessSessionLeaderPIDKey.Int(val) +} + +// ProcessUserID returns an attribute KeyValue conforming to the +// "process.user.id" semantic conventions. It represents the effective user ID +// (EUID) of the process. +func ProcessUserID(val int) attribute.KeyValue { + return ProcessUserIDKey.Int(val) +} + +// ProcessUserName returns an attribute KeyValue conforming to the +// "process.user.name" semantic conventions. It represents the username of the +// effective user of the process. +func ProcessUserName(val string) attribute.KeyValue { + return ProcessUserNameKey.String(val) +} + +// ProcessVpid returns an attribute KeyValue conforming to the +// "process.vpid" semantic conventions. It represents the virtual process +// identifier. +func ProcessVpid(val int) attribute.KeyValue { + return ProcessVpidKey.Int(val) +} + +// Attributes for process CPU +const ( + // ProcessCPUStateKey is the attribute Key conforming to the + // "process.cpu.state" semantic conventions. It represents the CPU state of + // the process. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + ProcessCPUStateKey = attribute.Key("process.cpu.state") +) + +var ( + // system + ProcessCPUStateSystem = ProcessCPUStateKey.String("system") + // user + ProcessCPUStateUser = ProcessCPUStateKey.String("user") + // wait + ProcessCPUStateWait = ProcessCPUStateKey.String("wait") +) + +// Attributes for remote procedure calls. +const ( + // RPCConnectRPCErrorCodeKey is the attribute Key conforming to the + // "rpc.connect_rpc.error_code" semantic conventions. It represents the + // [error codes](https://connect.build/docs/protocol/#error-codes) of the + // Connect request. Error codes are always string values. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + RPCConnectRPCErrorCodeKey = attribute.Key("rpc.connect_rpc.error_code") + + // RPCGRPCStatusCodeKey is the attribute Key conforming to the + // "rpc.grpc.status_code" semantic conventions. It represents the [numeric + // status + // code](https://github.com/grpc/grpc/blob/v1.33.2/doc/statuscodes.md) of + // the gRPC request. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + RPCGRPCStatusCodeKey = attribute.Key("rpc.grpc.status_code") + + // RPCJsonrpcErrorCodeKey is the attribute Key conforming to the + // "rpc.jsonrpc.error_code" semantic conventions. It represents the + // `error.code` property of response if it is an error response. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: -32700, 100 + RPCJsonrpcErrorCodeKey = attribute.Key("rpc.jsonrpc.error_code") + + // RPCJsonrpcErrorMessageKey is the attribute Key conforming to the + // "rpc.jsonrpc.error_message" semantic conventions. It represents the + // `error.message` property of response if it is an error response. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Parse error', 'User already exists' + RPCJsonrpcErrorMessageKey = attribute.Key("rpc.jsonrpc.error_message") + + // RPCJsonrpcRequestIDKey is the attribute Key conforming to the + // "rpc.jsonrpc.request_id" semantic conventions. It represents the `id` + // property of request or response. Since protocol allows id to be int, + // string, `null` or missing (for notifications), value is expected to be + // cast to string for simplicity. Use empty string in case of `null` value. + // Omit entirely if this is a notification. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '10', 'request-7', '' + RPCJsonrpcRequestIDKey = attribute.Key("rpc.jsonrpc.request_id") + + // RPCJsonrpcVersionKey is the attribute Key conforming to the + // "rpc.jsonrpc.version" semantic conventions. It represents the protocol + // version as in `jsonrpc` property of request/response. Since JSON-RPC 1.0 + // doesn't specify this, the value can be omitted. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2.0', '1.0' + RPCJsonrpcVersionKey = attribute.Key("rpc.jsonrpc.version") + + // RPCMessageCompressedSizeKey is the attribute Key conforming to the + // "rpc.message.compressed_size" semantic conventions. It represents the + // compressed size of the message in bytes. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + RPCMessageCompressedSizeKey = attribute.Key("rpc.message.compressed_size") + + // RPCMessageIDKey is the attribute Key conforming to the "rpc.message.id" + // semantic conventions. It represents the mUST be calculated as two + // different counters starting from `1` one for sent messages and one for + // received message. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Note: This way we guarantee that the values will be consistent between + // different implementations. + RPCMessageIDKey = attribute.Key("rpc.message.id") + + // RPCMessageTypeKey is the attribute Key conforming to the + // "rpc.message.type" semantic conventions. It represents the whether this + // is a received or sent message. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + RPCMessageTypeKey = attribute.Key("rpc.message.type") + + // RPCMessageUncompressedSizeKey is the attribute Key conforming to the + // "rpc.message.uncompressed_size" semantic conventions. It represents the + // uncompressed size of the message in bytes. + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + RPCMessageUncompressedSizeKey = attribute.Key("rpc.message.uncompressed_size") + + // RPCMethodKey is the attribute Key conforming to the "rpc.method" + // semantic conventions. It represents the name of the (logical) method + // being called, must be equal to the $method part in the span name. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'exampleMethod' + // Note: This is the logical name of the method from the RPC interface + // perspective, which can be different from the name of any implementing + // method/function. The `code.function` attribute may be used to store the + // latter (e.g., method actually executing the call on the server side, RPC + // client stub method on the client side). + RPCMethodKey = attribute.Key("rpc.method") + + // RPCServiceKey is the attribute Key conforming to the "rpc.service" + // semantic conventions. It represents the full (logical) name of the + // service being called, including its package name, if applicable. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'myservice.EchoService' + // Note: This is the logical name of the service from the RPC interface + // perspective, which can be different from the name of any implementing + // class. The `code.namespace` attribute may be used to store the latter + // (despite the attribute name, it may include a class name; e.g., class + // with method actually executing the call on the server side, RPC client + // stub class on the client side). + RPCServiceKey = attribute.Key("rpc.service") + + // RPCSystemKey is the attribute Key conforming to the "rpc.system" + // semantic conventions. It represents a string identifying the remoting + // system. See below for a list of well-known identifiers. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + RPCSystemKey = attribute.Key("rpc.system") +) + +var ( + // cancelled + RPCConnectRPCErrorCodeCancelled = RPCConnectRPCErrorCodeKey.String("cancelled") + // unknown + RPCConnectRPCErrorCodeUnknown = RPCConnectRPCErrorCodeKey.String("unknown") + // invalid_argument + RPCConnectRPCErrorCodeInvalidArgument = RPCConnectRPCErrorCodeKey.String("invalid_argument") + // deadline_exceeded + RPCConnectRPCErrorCodeDeadlineExceeded = RPCConnectRPCErrorCodeKey.String("deadline_exceeded") + // not_found + RPCConnectRPCErrorCodeNotFound = RPCConnectRPCErrorCodeKey.String("not_found") + // already_exists + RPCConnectRPCErrorCodeAlreadyExists = RPCConnectRPCErrorCodeKey.String("already_exists") + // permission_denied + RPCConnectRPCErrorCodePermissionDenied = RPCConnectRPCErrorCodeKey.String("permission_denied") + // resource_exhausted + RPCConnectRPCErrorCodeResourceExhausted = RPCConnectRPCErrorCodeKey.String("resource_exhausted") + // failed_precondition + RPCConnectRPCErrorCodeFailedPrecondition = RPCConnectRPCErrorCodeKey.String("failed_precondition") + // aborted + RPCConnectRPCErrorCodeAborted = RPCConnectRPCErrorCodeKey.String("aborted") + // out_of_range + RPCConnectRPCErrorCodeOutOfRange = RPCConnectRPCErrorCodeKey.String("out_of_range") + // unimplemented + RPCConnectRPCErrorCodeUnimplemented = RPCConnectRPCErrorCodeKey.String("unimplemented") + // internal + RPCConnectRPCErrorCodeInternal = RPCConnectRPCErrorCodeKey.String("internal") + // unavailable + RPCConnectRPCErrorCodeUnavailable = RPCConnectRPCErrorCodeKey.String("unavailable") + // data_loss + RPCConnectRPCErrorCodeDataLoss = RPCConnectRPCErrorCodeKey.String("data_loss") + // unauthenticated + RPCConnectRPCErrorCodeUnauthenticated = RPCConnectRPCErrorCodeKey.String("unauthenticated") +) + +var ( + // OK + RPCGRPCStatusCodeOk = RPCGRPCStatusCodeKey.Int(0) + // CANCELLED + RPCGRPCStatusCodeCancelled = RPCGRPCStatusCodeKey.Int(1) + // UNKNOWN + RPCGRPCStatusCodeUnknown = RPCGRPCStatusCodeKey.Int(2) + // INVALID_ARGUMENT + RPCGRPCStatusCodeInvalidArgument = RPCGRPCStatusCodeKey.Int(3) + // DEADLINE_EXCEEDED + RPCGRPCStatusCodeDeadlineExceeded = RPCGRPCStatusCodeKey.Int(4) + // NOT_FOUND + RPCGRPCStatusCodeNotFound = RPCGRPCStatusCodeKey.Int(5) + // ALREADY_EXISTS + RPCGRPCStatusCodeAlreadyExists = RPCGRPCStatusCodeKey.Int(6) + // PERMISSION_DENIED + RPCGRPCStatusCodePermissionDenied = RPCGRPCStatusCodeKey.Int(7) + // RESOURCE_EXHAUSTED + RPCGRPCStatusCodeResourceExhausted = RPCGRPCStatusCodeKey.Int(8) + // FAILED_PRECONDITION + RPCGRPCStatusCodeFailedPrecondition = RPCGRPCStatusCodeKey.Int(9) + // ABORTED + RPCGRPCStatusCodeAborted = RPCGRPCStatusCodeKey.Int(10) + // OUT_OF_RANGE + RPCGRPCStatusCodeOutOfRange = RPCGRPCStatusCodeKey.Int(11) + // UNIMPLEMENTED + RPCGRPCStatusCodeUnimplemented = RPCGRPCStatusCodeKey.Int(12) + // INTERNAL + RPCGRPCStatusCodeInternal = RPCGRPCStatusCodeKey.Int(13) + // UNAVAILABLE + RPCGRPCStatusCodeUnavailable = RPCGRPCStatusCodeKey.Int(14) + // DATA_LOSS + RPCGRPCStatusCodeDataLoss = RPCGRPCStatusCodeKey.Int(15) + // UNAUTHENTICATED + RPCGRPCStatusCodeUnauthenticated = RPCGRPCStatusCodeKey.Int(16) +) + +var ( + // sent + RPCMessageTypeSent = RPCMessageTypeKey.String("SENT") + // received + RPCMessageTypeReceived = RPCMessageTypeKey.String("RECEIVED") +) + +var ( + // gRPC + RPCSystemGRPC = RPCSystemKey.String("grpc") + // Java RMI + RPCSystemJavaRmi = RPCSystemKey.String("java_rmi") + // .NET WCF + RPCSystemDotnetWcf = RPCSystemKey.String("dotnet_wcf") + // Apache Dubbo + RPCSystemApacheDubbo = RPCSystemKey.String("apache_dubbo") + // Connect RPC + RPCSystemConnectRPC = RPCSystemKey.String("connect_rpc") +) + +// RPCJsonrpcErrorCode returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.error_code" semantic conventions. It represents the +// `error.code` property of response if it is an error response. +func RPCJsonrpcErrorCode(val int) attribute.KeyValue { + return RPCJsonrpcErrorCodeKey.Int(val) +} + +// RPCJsonrpcErrorMessage returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.error_message" semantic conventions. It represents the +// `error.message` property of response if it is an error response. +func RPCJsonrpcErrorMessage(val string) attribute.KeyValue { + return RPCJsonrpcErrorMessageKey.String(val) +} + +// RPCJsonrpcRequestID returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.request_id" semantic conventions. It represents the `id` +// property of request or response. Since protocol allows id to be int, string, +// `null` or missing (for notifications), value is expected to be cast to +// string for simplicity. Use empty string in case of `null` value. Omit +// entirely if this is a notification. +func RPCJsonrpcRequestID(val string) attribute.KeyValue { + return RPCJsonrpcRequestIDKey.String(val) +} + +// RPCJsonrpcVersion returns an attribute KeyValue conforming to the +// "rpc.jsonrpc.version" semantic conventions. It represents the protocol +// version as in `jsonrpc` property of request/response. Since JSON-RPC 1.0 +// doesn't specify this, the value can be omitted. +func RPCJsonrpcVersion(val string) attribute.KeyValue { + return RPCJsonrpcVersionKey.String(val) +} + +// RPCMessageCompressedSize returns an attribute KeyValue conforming to the +// "rpc.message.compressed_size" semantic conventions. It represents the +// compressed size of the message in bytes. +func RPCMessageCompressedSize(val int) attribute.KeyValue { + return RPCMessageCompressedSizeKey.Int(val) +} + +// RPCMessageID returns an attribute KeyValue conforming to the +// "rpc.message.id" semantic conventions. It represents the mUST be calculated +// as two different counters starting from `1` one for sent messages and one +// for received message. +func RPCMessageID(val int) attribute.KeyValue { + return RPCMessageIDKey.Int(val) +} + +// RPCMessageUncompressedSize returns an attribute KeyValue conforming to +// the "rpc.message.uncompressed_size" semantic conventions. It represents the +// uncompressed size of the message in bytes. +func RPCMessageUncompressedSize(val int) attribute.KeyValue { + return RPCMessageUncompressedSizeKey.Int(val) +} + +// RPCMethod returns an attribute KeyValue conforming to the "rpc.method" +// semantic conventions. It represents the name of the (logical) method being +// called, must be equal to the $method part in the span name. +func RPCMethod(val string) attribute.KeyValue { + return RPCMethodKey.String(val) +} + +// RPCService returns an attribute KeyValue conforming to the "rpc.service" +// semantic conventions. It represents the full (logical) name of the service +// being called, including its package name, if applicable. +func RPCService(val string) attribute.KeyValue { + return RPCServiceKey.String(val) +} + +// These attributes may be used to describe the server in a connection-based +// network interaction where there is one side that initiates the connection +// (the client is the side that initiates the connection). This covers all TCP +// network interactions since TCP is connection-based and one side initiates +// the connection (an exception is made for peer-to-peer communication over TCP +// where the "user-facing" surface of the protocol / API doesn't expose a clear +// notion of client and server). This also covers UDP network interactions +// where one side initiates the interaction, e.g. QUIC (HTTP/3) and DNS. +const ( + // ServerAddressKey is the attribute Key conforming to the "server.address" + // semantic conventions. It represents the server domain name if available + // without reverse DNS lookup; otherwise, IP address or Unix domain socket + // name. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'example.com', '10.1.2.80', '/tmp/my.sock' + // Note: When observed from the client side, and when communicating through + // an intermediary, `server.address` SHOULD represent the server address + // behind any intermediaries, for example proxies, if it's available. + ServerAddressKey = attribute.Key("server.address") + + // ServerPortKey is the attribute Key conforming to the "server.port" + // semantic conventions. It represents the server port number. + // + // Type: int + // RequirementLevel: Optional + // Stability: stable + // Examples: 80, 8080, 443 + // Note: When observed from the client side, and when communicating through + // an intermediary, `server.port` SHOULD represent the server port behind + // any intermediaries, for example proxies, if it's available. + ServerPortKey = attribute.Key("server.port") +) + +// ServerAddress returns an attribute KeyValue conforming to the +// "server.address" semantic conventions. It represents the server domain name +// if available without reverse DNS lookup; otherwise, IP address or Unix +// domain socket name. +func ServerAddress(val string) attribute.KeyValue { + return ServerAddressKey.String(val) +} + +// ServerPort returns an attribute KeyValue conforming to the "server.port" +// semantic conventions. It represents the server port number. +func ServerPort(val int) attribute.KeyValue { + return ServerPortKey.Int(val) +} + +// A service instance. +const ( + // ServiceInstanceIDKey is the attribute Key conforming to the + // "service.instance.id" semantic conventions. It represents the string ID + // of the service instance. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '627cc493-f310-47de-96bd-71410b7dec09' + // Note: MUST be unique for each instance of the same + // `service.namespace,service.name` pair (in other words + // `service.namespace,service.name,service.instance.id` triplet MUST be + // globally unique). The ID helps to + // distinguish instances of the same service that exist at the same time + // (e.g. instances of a horizontally scaled + // service). + // + // Implementations, such as SDKs, are recommended to generate a random + // Version 1 or Version 4 [RFC + // 4122](https://www.ietf.org/rfc/rfc4122.txt) UUID, but are free to use an + // inherent unique ID as the source of + // this value if stability is desirable. In that case, the ID SHOULD be + // used as source of a UUID Version 5 and + // SHOULD use the following UUID as the namespace: + // `4d63009a-8d0f-11ee-aad7-4c796ed8e320`. + // + // UUIDs are typically recommended, as only an opaque value for the + // purposes of identifying a service instance is + // needed. Similar to what can be seen in the man page for the + // [`/etc/machine-id`](https://www.freedesktop.org/software/systemd/man/machine-id.html) + // file, the underlying + // data, such as pod name and namespace should be treated as confidential, + // being the user's choice to expose it + // or not via another resource attribute. + // + // For applications running behind an application server (like unicorn), we + // do not recommend using one identifier + // for all processes participating in the application. Instead, it's + // recommended each division (e.g. a worker + // thread in unicorn) to have its own instance.id. + // + // It's not recommended for a Collector to set `service.instance.id` if it + // can't unambiguously determine the + // service instance that is generating that telemetry. For instance, + // creating an UUID based on `pod.name` will + // likely be wrong, as the Collector might not know from which container + // within that pod the telemetry originated. + // However, Collectors can set the `service.instance.id` if they can + // unambiguously determine the service instance + // for that telemetry. This is typically the case for scraping receivers, + // as they know the target address and + // port. + ServiceInstanceIDKey = attribute.Key("service.instance.id") + + // ServiceNameKey is the attribute Key conforming to the "service.name" + // semantic conventions. It represents the logical name of the service. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'shoppingcart' + // Note: MUST be the same for all instances of horizontally scaled + // services. If the value was not specified, SDKs MUST fallback to + // `unknown_service:` concatenated with + // [`process.executable.name`](process.md), e.g. `unknown_service:bash`. If + // `process.executable.name` is not available, the value MUST be set to + // `unknown_service`. + ServiceNameKey = attribute.Key("service.name") + + // ServiceNamespaceKey is the attribute Key conforming to the + // "service.namespace" semantic conventions. It represents a namespace for + // `service.name`. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Shop' + // Note: A string value having a meaning that helps to distinguish a group + // of services, for example the team name that owns a group of services. + // `service.name` is expected to be unique within the same namespace. If + // `service.namespace` is not specified in the Resource then `service.name` + // is expected to be unique for all services that have no explicit + // namespace defined (so the empty/unspecified namespace is simply one more + // valid namespace). Zero-length namespace string is assumed equal to + // unspecified namespace. + ServiceNamespaceKey = attribute.Key("service.namespace") + + // ServiceVersionKey is the attribute Key conforming to the + // "service.version" semantic conventions. It represents the version string + // of the service API or implementation. The format is not defined by these + // conventions. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '2.0.0', 'a01dbef8a' + ServiceVersionKey = attribute.Key("service.version") +) + +// ServiceInstanceID returns an attribute KeyValue conforming to the +// "service.instance.id" semantic conventions. It represents the string ID of +// the service instance. +func ServiceInstanceID(val string) attribute.KeyValue { + return ServiceInstanceIDKey.String(val) +} + +// ServiceName returns an attribute KeyValue conforming to the +// "service.name" semantic conventions. It represents the logical name of the +// service. +func ServiceName(val string) attribute.KeyValue { + return ServiceNameKey.String(val) +} + +// ServiceNamespace returns an attribute KeyValue conforming to the +// "service.namespace" semantic conventions. It represents a namespace for +// `service.name`. +func ServiceNamespace(val string) attribute.KeyValue { + return ServiceNamespaceKey.String(val) +} + +// ServiceVersion returns an attribute KeyValue conforming to the +// "service.version" semantic conventions. It represents the version string of +// the service API or implementation. The format is not defined by these +// conventions. +func ServiceVersion(val string) attribute.KeyValue { + return ServiceVersionKey.String(val) +} + +// Session is defined as the period of time encompassing all activities +// performed by the application and the actions executed by the end user. +// Consequently, a Session is represented as a collection of Logs, Events, and +// Spans emitted by the Client Application throughout the Session's duration. +// Each Session is assigned a unique identifier, which is included as an +// attribute in the Logs, Events, and Spans generated during the Session's +// lifecycle. +// When a session reaches end of life, typically due to user inactivity or +// session timeout, a new session identifier will be assigned. The previous +// session identifier may be provided by the instrumentation so that telemetry +// backends can link the two sessions. +const ( + // SessionIDKey is the attribute Key conforming to the "session.id" + // semantic conventions. It represents a unique id to identify a session. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '00112233-4455-6677-8899-aabbccddeeff' + SessionIDKey = attribute.Key("session.id") + + // SessionPreviousIDKey is the attribute Key conforming to the + // "session.previous_id" semantic conventions. It represents the previous + // `session.id` for this user, when known. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '00112233-4455-6677-8899-aabbccddeeff' + SessionPreviousIDKey = attribute.Key("session.previous_id") +) + +// SessionID returns an attribute KeyValue conforming to the "session.id" +// semantic conventions. It represents a unique id to identify a session. +func SessionID(val string) attribute.KeyValue { + return SessionIDKey.String(val) +} + +// SessionPreviousID returns an attribute KeyValue conforming to the +// "session.previous_id" semantic conventions. It represents the previous +// `session.id` for this user, when known. +func SessionPreviousID(val string) attribute.KeyValue { + return SessionPreviousIDKey.String(val) +} + +// SignalR attributes +const ( + // SignalrConnectionStatusKey is the attribute Key conforming to the + // "signalr.connection.status" semantic conventions. It represents the + // signalR HTTP connection closure status. + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'app_shutdown', 'timeout' + SignalrConnectionStatusKey = attribute.Key("signalr.connection.status") + + // SignalrTransportKey is the attribute Key conforming to the + // "signalr.transport" semantic conventions. It represents the [SignalR + // transport + // type](https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/docs/specs/TransportProtocols.md) + // + // Type: Enum + // RequirementLevel: Optional + // Stability: stable + // Examples: 'web_sockets', 'long_polling' + SignalrTransportKey = attribute.Key("signalr.transport") +) + +var ( + // The connection was closed normally + SignalrConnectionStatusNormalClosure = SignalrConnectionStatusKey.String("normal_closure") + // The connection was closed due to a timeout + SignalrConnectionStatusTimeout = SignalrConnectionStatusKey.String("timeout") + // The connection was closed because the app is shutting down + SignalrConnectionStatusAppShutdown = SignalrConnectionStatusKey.String("app_shutdown") +) + +var ( + // ServerSentEvents protocol + SignalrTransportServerSentEvents = SignalrTransportKey.String("server_sent_events") + // LongPolling protocol + SignalrTransportLongPolling = SignalrTransportKey.String("long_polling") + // WebSockets protocol + SignalrTransportWebSockets = SignalrTransportKey.String("web_sockets") +) + +// These attributes may be used to describe the sender of a network +// exchange/packet. These should be used when there is no client/server +// relationship between the two sides, or when that relationship is unknown. +// This covers low-level network interactions (e.g. packet tracing) where you +// don't know if there was a connection or which side initiated it. This also +// covers unidirectional UDP flows and peer-to-peer communication where the +// "user-facing" surface of the protocol / API doesn't expose a clear notion of +// client and server. +const ( + // SourceAddressKey is the attribute Key conforming to the "source.address" + // semantic conventions. It represents the source address - domain name if + // available without reverse DNS lookup; otherwise, IP address or Unix + // domain socket name. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'source.example.com', '10.1.2.80', '/tmp/my.sock' + // Note: When observed from the destination side, and when communicating + // through an intermediary, `source.address` SHOULD represent the source + // address behind any intermediaries, for example proxies, if it's + // available. + SourceAddressKey = attribute.Key("source.address") + + // SourcePortKey is the attribute Key conforming to the "source.port" + // semantic conventions. It represents the source port number + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 3389, 2888 + SourcePortKey = attribute.Key("source.port") +) + +// SourceAddress returns an attribute KeyValue conforming to the +// "source.address" semantic conventions. It represents the source address - +// domain name if available without reverse DNS lookup; otherwise, IP address +// or Unix domain socket name. +func SourceAddress(val string) attribute.KeyValue { + return SourceAddressKey.String(val) +} + +// SourcePort returns an attribute KeyValue conforming to the "source.port" +// semantic conventions. It represents the source port number +func SourcePort(val int) attribute.KeyValue { + return SourcePortKey.Int(val) +} + +// Describes System attributes +const ( + // SystemDeviceKey is the attribute Key conforming to the "system.device" + // semantic conventions. It represents the device identifier + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '(identifier)' + SystemDeviceKey = attribute.Key("system.device") +) + +// SystemDevice returns an attribute KeyValue conforming to the +// "system.device" semantic conventions. It represents the device identifier +func SystemDevice(val string) attribute.KeyValue { + return SystemDeviceKey.String(val) +} + +// Describes System CPU attributes +const ( + // SystemCPULogicalNumberKey is the attribute Key conforming to the + // "system.cpu.logical_number" semantic conventions. It represents the + // logical CPU number [0..n-1] + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 1 + SystemCPULogicalNumberKey = attribute.Key("system.cpu.logical_number") + + // SystemCPUStateKey is the attribute Key conforming to the + // "system.cpu.state" semantic conventions. It represents the state of the + // CPU + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'idle', 'interrupt' + SystemCPUStateKey = attribute.Key("system.cpu.state") +) + +var ( + // user + SystemCPUStateUser = SystemCPUStateKey.String("user") + // system + SystemCPUStateSystem = SystemCPUStateKey.String("system") + // nice + SystemCPUStateNice = SystemCPUStateKey.String("nice") + // idle + SystemCPUStateIdle = SystemCPUStateKey.String("idle") + // iowait + SystemCPUStateIowait = SystemCPUStateKey.String("iowait") + // interrupt + SystemCPUStateInterrupt = SystemCPUStateKey.String("interrupt") + // steal + SystemCPUStateSteal = SystemCPUStateKey.String("steal") +) + +// SystemCPULogicalNumber returns an attribute KeyValue conforming to the +// "system.cpu.logical_number" semantic conventions. It represents the logical +// CPU number [0..n-1] +func SystemCPULogicalNumber(val int) attribute.KeyValue { + return SystemCPULogicalNumberKey.Int(val) +} + +// Describes System Memory attributes +const ( + // SystemMemoryStateKey is the attribute Key conforming to the + // "system.memory.state" semantic conventions. It represents the memory + // state + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'free', 'cached' + SystemMemoryStateKey = attribute.Key("system.memory.state") +) + +var ( + // used + SystemMemoryStateUsed = SystemMemoryStateKey.String("used") + // free + SystemMemoryStateFree = SystemMemoryStateKey.String("free") + // shared + SystemMemoryStateShared = SystemMemoryStateKey.String("shared") + // buffers + SystemMemoryStateBuffers = SystemMemoryStateKey.String("buffers") + // cached + SystemMemoryStateCached = SystemMemoryStateKey.String("cached") +) + +// Describes System Memory Paging attributes +const ( + // SystemPagingDirectionKey is the attribute Key conforming to the + // "system.paging.direction" semantic conventions. It represents the paging + // access direction + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'in' + SystemPagingDirectionKey = attribute.Key("system.paging.direction") + + // SystemPagingStateKey is the attribute Key conforming to the + // "system.paging.state" semantic conventions. It represents the memory + // paging state + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'free' + SystemPagingStateKey = attribute.Key("system.paging.state") + + // SystemPagingTypeKey is the attribute Key conforming to the + // "system.paging.type" semantic conventions. It represents the memory + // paging type + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'minor' + SystemPagingTypeKey = attribute.Key("system.paging.type") +) + +var ( + // in + SystemPagingDirectionIn = SystemPagingDirectionKey.String("in") + // out + SystemPagingDirectionOut = SystemPagingDirectionKey.String("out") +) + +var ( + // used + SystemPagingStateUsed = SystemPagingStateKey.String("used") + // free + SystemPagingStateFree = SystemPagingStateKey.String("free") +) + +var ( + // major + SystemPagingTypeMajor = SystemPagingTypeKey.String("major") + // minor + SystemPagingTypeMinor = SystemPagingTypeKey.String("minor") +) + +// Describes Filesystem attributes +const ( + // SystemFilesystemModeKey is the attribute Key conforming to the + // "system.filesystem.mode" semantic conventions. It represents the + // filesystem mode + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'rw, ro' + SystemFilesystemModeKey = attribute.Key("system.filesystem.mode") + + // SystemFilesystemMountpointKey is the attribute Key conforming to the + // "system.filesystem.mountpoint" semantic conventions. It represents the + // filesystem mount path + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/mnt/data' + SystemFilesystemMountpointKey = attribute.Key("system.filesystem.mountpoint") + + // SystemFilesystemStateKey is the attribute Key conforming to the + // "system.filesystem.state" semantic conventions. It represents the + // filesystem state + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'used' + SystemFilesystemStateKey = attribute.Key("system.filesystem.state") + + // SystemFilesystemTypeKey is the attribute Key conforming to the + // "system.filesystem.type" semantic conventions. It represents the + // filesystem type + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'ext4' + SystemFilesystemTypeKey = attribute.Key("system.filesystem.type") +) + +var ( + // used + SystemFilesystemStateUsed = SystemFilesystemStateKey.String("used") + // free + SystemFilesystemStateFree = SystemFilesystemStateKey.String("free") + // reserved + SystemFilesystemStateReserved = SystemFilesystemStateKey.String("reserved") +) + +var ( + // fat32 + SystemFilesystemTypeFat32 = SystemFilesystemTypeKey.String("fat32") + // exfat + SystemFilesystemTypeExfat = SystemFilesystemTypeKey.String("exfat") + // ntfs + SystemFilesystemTypeNtfs = SystemFilesystemTypeKey.String("ntfs") + // refs + SystemFilesystemTypeRefs = SystemFilesystemTypeKey.String("refs") + // hfsplus + SystemFilesystemTypeHfsplus = SystemFilesystemTypeKey.String("hfsplus") + // ext4 + SystemFilesystemTypeExt4 = SystemFilesystemTypeKey.String("ext4") +) + +// SystemFilesystemMode returns an attribute KeyValue conforming to the +// "system.filesystem.mode" semantic conventions. It represents the filesystem +// mode +func SystemFilesystemMode(val string) attribute.KeyValue { + return SystemFilesystemModeKey.String(val) +} + +// SystemFilesystemMountpoint returns an attribute KeyValue conforming to +// the "system.filesystem.mountpoint" semantic conventions. It represents the +// filesystem mount path +func SystemFilesystemMountpoint(val string) attribute.KeyValue { + return SystemFilesystemMountpointKey.String(val) +} + +// Describes Network attributes +const ( + // SystemNetworkStateKey is the attribute Key conforming to the + // "system.network.state" semantic conventions. It represents a stateless + // protocol MUST NOT set this attribute + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'close_wait' + SystemNetworkStateKey = attribute.Key("system.network.state") +) + +var ( + // close + SystemNetworkStateClose = SystemNetworkStateKey.String("close") + // close_wait + SystemNetworkStateCloseWait = SystemNetworkStateKey.String("close_wait") + // closing + SystemNetworkStateClosing = SystemNetworkStateKey.String("closing") + // delete + SystemNetworkStateDelete = SystemNetworkStateKey.String("delete") + // established + SystemNetworkStateEstablished = SystemNetworkStateKey.String("established") + // fin_wait_1 + SystemNetworkStateFinWait1 = SystemNetworkStateKey.String("fin_wait_1") + // fin_wait_2 + SystemNetworkStateFinWait2 = SystemNetworkStateKey.String("fin_wait_2") + // last_ack + SystemNetworkStateLastAck = SystemNetworkStateKey.String("last_ack") + // listen + SystemNetworkStateListen = SystemNetworkStateKey.String("listen") + // syn_recv + SystemNetworkStateSynRecv = SystemNetworkStateKey.String("syn_recv") + // syn_sent + SystemNetworkStateSynSent = SystemNetworkStateKey.String("syn_sent") + // time_wait + SystemNetworkStateTimeWait = SystemNetworkStateKey.String("time_wait") +) + +// Describes System Process attributes +const ( + // SystemProcessStatusKey is the attribute Key conforming to the + // "system.process.status" semantic conventions. It represents the process + // state, e.g., [Linux Process State + // Codes](https://man7.org/linux/man-pages/man1/ps.1.html#PROCESS_STATE_CODES) + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'running' + SystemProcessStatusKey = attribute.Key("system.process.status") +) + +var ( + // running + SystemProcessStatusRunning = SystemProcessStatusKey.String("running") + // sleeping + SystemProcessStatusSleeping = SystemProcessStatusKey.String("sleeping") + // stopped + SystemProcessStatusStopped = SystemProcessStatusKey.String("stopped") + // defunct + SystemProcessStatusDefunct = SystemProcessStatusKey.String("defunct") +) + +// Attributes for telemetry SDK. +const ( + // TelemetrySDKLanguageKey is the attribute Key conforming to the + // "telemetry.sdk.language" semantic conventions. It represents the + // language of the telemetry SDK. + // + // Type: Enum + // RequirementLevel: Required + // Stability: stable + TelemetrySDKLanguageKey = attribute.Key("telemetry.sdk.language") + + // TelemetrySDKNameKey is the attribute Key conforming to the + // "telemetry.sdk.name" semantic conventions. It represents the name of the + // telemetry SDK as defined above. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: 'opentelemetry' + // Note: The OpenTelemetry SDK MUST set the `telemetry.sdk.name` attribute + // to `opentelemetry`. + // If another SDK, like a fork or a vendor-provided implementation, is + // used, this SDK MUST set the + // `telemetry.sdk.name` attribute to the fully-qualified class or module + // name of this SDK's main entry point + // or another suitable identifier depending on the language. + // The identifier `opentelemetry` is reserved and MUST NOT be used in this + // case. + // All custom identifiers SHOULD be stable across different versions of an + // implementation. + TelemetrySDKNameKey = attribute.Key("telemetry.sdk.name") + + // TelemetrySDKVersionKey is the attribute Key conforming to the + // "telemetry.sdk.version" semantic conventions. It represents the version + // string of the telemetry SDK. + // + // Type: string + // RequirementLevel: Required + // Stability: stable + // Examples: '1.2.3' + TelemetrySDKVersionKey = attribute.Key("telemetry.sdk.version") + + // TelemetryDistroNameKey is the attribute Key conforming to the + // "telemetry.distro.name" semantic conventions. It represents the name of + // the auto instrumentation agent or distribution, if used. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'parts-unlimited-java' + // Note: Official auto instrumentation agents and distributions SHOULD set + // the `telemetry.distro.name` attribute to + // a string starting with `opentelemetry-`, e.g. + // `opentelemetry-java-instrumentation`. + TelemetryDistroNameKey = attribute.Key("telemetry.distro.name") + + // TelemetryDistroVersionKey is the attribute Key conforming to the + // "telemetry.distro.version" semantic conventions. It represents the + // version string of the auto instrumentation agent or distribution, if + // used. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '1.2.3' + TelemetryDistroVersionKey = attribute.Key("telemetry.distro.version") +) + +var ( + // cpp + TelemetrySDKLanguageCPP = TelemetrySDKLanguageKey.String("cpp") + // dotnet + TelemetrySDKLanguageDotnet = TelemetrySDKLanguageKey.String("dotnet") + // erlang + TelemetrySDKLanguageErlang = TelemetrySDKLanguageKey.String("erlang") + // go + TelemetrySDKLanguageGo = TelemetrySDKLanguageKey.String("go") + // java + TelemetrySDKLanguageJava = TelemetrySDKLanguageKey.String("java") + // nodejs + TelemetrySDKLanguageNodejs = TelemetrySDKLanguageKey.String("nodejs") + // php + TelemetrySDKLanguagePHP = TelemetrySDKLanguageKey.String("php") + // python + TelemetrySDKLanguagePython = TelemetrySDKLanguageKey.String("python") + // ruby + TelemetrySDKLanguageRuby = TelemetrySDKLanguageKey.String("ruby") + // rust + TelemetrySDKLanguageRust = TelemetrySDKLanguageKey.String("rust") + // swift + TelemetrySDKLanguageSwift = TelemetrySDKLanguageKey.String("swift") + // webjs + TelemetrySDKLanguageWebjs = TelemetrySDKLanguageKey.String("webjs") +) + +// TelemetrySDKName returns an attribute KeyValue conforming to the +// "telemetry.sdk.name" semantic conventions. It represents the name of the +// telemetry SDK as defined above. +func TelemetrySDKName(val string) attribute.KeyValue { + return TelemetrySDKNameKey.String(val) +} + +// TelemetrySDKVersion returns an attribute KeyValue conforming to the +// "telemetry.sdk.version" semantic conventions. It represents the version +// string of the telemetry SDK. +func TelemetrySDKVersion(val string) attribute.KeyValue { + return TelemetrySDKVersionKey.String(val) +} + +// TelemetryDistroName returns an attribute KeyValue conforming to the +// "telemetry.distro.name" semantic conventions. It represents the name of the +// auto instrumentation agent or distribution, if used. +func TelemetryDistroName(val string) attribute.KeyValue { + return TelemetryDistroNameKey.String(val) +} + +// TelemetryDistroVersion returns an attribute KeyValue conforming to the +// "telemetry.distro.version" semantic conventions. It represents the version +// string of the auto instrumentation agent or distribution, if used. +func TelemetryDistroVersion(val string) attribute.KeyValue { + return TelemetryDistroVersionKey.String(val) +} + +// These attributes may be used for any operation to store information about a +// thread that started a span. +const ( + // ThreadIDKey is the attribute Key conforming to the "thread.id" semantic + // conventions. It represents the current "managed" thread ID (as opposed + // to OS thread ID). + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 42 + ThreadIDKey = attribute.Key("thread.id") + + // ThreadNameKey is the attribute Key conforming to the "thread.name" + // semantic conventions. It represents the current thread name. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'main' + ThreadNameKey = attribute.Key("thread.name") +) + +// ThreadID returns an attribute KeyValue conforming to the "thread.id" +// semantic conventions. It represents the current "managed" thread ID (as +// opposed to OS thread ID). +func ThreadID(val int) attribute.KeyValue { + return ThreadIDKey.Int(val) +} + +// ThreadName returns an attribute KeyValue conforming to the "thread.name" +// semantic conventions. It represents the current thread name. +func ThreadName(val string) attribute.KeyValue { + return ThreadNameKey.String(val) +} + +// Semantic convention attributes in the TLS namespace. +const ( + // TLSCipherKey is the attribute Key conforming to the "tls.cipher" + // semantic conventions. It represents the string indicating the + // [cipher](https://datatracker.ietf.org/doc/html/rfc5246#appendix-A.5) + // used during the current connection. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'TLS_RSA_WITH_3DES_EDE_CBC_SHA', + // 'TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256' + // Note: The values allowed for `tls.cipher` MUST be one of the + // `Descriptions` of the [registered TLS Cipher + // Suits](https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#table-tls-parameters-4). + TLSCipherKey = attribute.Key("tls.cipher") + + // TLSClientCertificateKey is the attribute Key conforming to the + // "tls.client.certificate" semantic conventions. It represents the + // pEM-encoded stand-alone certificate offered by the client. This is + // usually mutually-exclusive of `client.certificate_chain` since this + // value also exists in that list. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'MII...' + TLSClientCertificateKey = attribute.Key("tls.client.certificate") + + // TLSClientCertificateChainKey is the attribute Key conforming to the + // "tls.client.certificate_chain" semantic conventions. It represents the + // array of PEM-encoded certificates that make up the certificate chain + // offered by the client. This is usually mutually-exclusive of + // `client.certificate` since that value should be the first certificate in + // the chain. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'MII...', 'MI...' + TLSClientCertificateChainKey = attribute.Key("tls.client.certificate_chain") + + // TLSClientHashMd5Key is the attribute Key conforming to the + // "tls.client.hash.md5" semantic conventions. It represents the + // certificate fingerprint using the MD5 digest of DER-encoded version of + // certificate offered by the client. For consistency with other hash + // values, this value should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '0F76C7F2C55BFD7D8E8B8F4BFBF0C9EC' + TLSClientHashMd5Key = attribute.Key("tls.client.hash.md5") + + // TLSClientHashSha1Key is the attribute Key conforming to the + // "tls.client.hash.sha1" semantic conventions. It represents the + // certificate fingerprint using the SHA1 digest of DER-encoded version of + // certificate offered by the client. For consistency with other hash + // values, this value should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '9E393D93138888D288266C2D915214D1D1CCEB2A' + TLSClientHashSha1Key = attribute.Key("tls.client.hash.sha1") + + // TLSClientHashSha256Key is the attribute Key conforming to the + // "tls.client.hash.sha256" semantic conventions. It represents the + // certificate fingerprint using the SHA256 digest of DER-encoded version + // of certificate offered by the client. For consistency with other hash + // values, this value should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // '0687F666A054EF17A08E2F2162EAB4CBC0D265E1D7875BE74BF3C712CA92DAF0' + TLSClientHashSha256Key = attribute.Key("tls.client.hash.sha256") + + // TLSClientIssuerKey is the attribute Key conforming to the + // "tls.client.issuer" semantic conventions. It represents the + // distinguished name of + // [subject](https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6) + // of the issuer of the x.509 certificate presented by the client. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'CN=Example Root CA, OU=Infrastructure Team, DC=example, + // DC=com' + TLSClientIssuerKey = attribute.Key("tls.client.issuer") + + // TLSClientJa3Key is the attribute Key conforming to the "tls.client.ja3" + // semantic conventions. It represents a hash that identifies clients based + // on how they perform an SSL/TLS handshake. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'd4e5b18d6b55c71272893221c96ba240' + TLSClientJa3Key = attribute.Key("tls.client.ja3") + + // TLSClientNotAfterKey is the attribute Key conforming to the + // "tls.client.not_after" semantic conventions. It represents the date/Time + // indicating when client certificate is no longer considered valid. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2021-01-01T00:00:00.000Z' + TLSClientNotAfterKey = attribute.Key("tls.client.not_after") + + // TLSClientNotBeforeKey is the attribute Key conforming to the + // "tls.client.not_before" semantic conventions. It represents the + // date/Time indicating when client certificate is first considered valid. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '1970-01-01T00:00:00.000Z' + TLSClientNotBeforeKey = attribute.Key("tls.client.not_before") + + // TLSClientServerNameKey is the attribute Key conforming to the + // "tls.client.server_name" semantic conventions. It represents the also + // called an SNI, this tells the server which hostname to which the client + // is attempting to connect to. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'opentelemetry.io' + TLSClientServerNameKey = attribute.Key("tls.client.server_name") + + // TLSClientSubjectKey is the attribute Key conforming to the + // "tls.client.subject" semantic conventions. It represents the + // distinguished name of subject of the x.509 certificate presented by the + // client. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'CN=myclient, OU=Documentation Team, DC=example, DC=com' + TLSClientSubjectKey = attribute.Key("tls.client.subject") + + // TLSClientSupportedCiphersKey is the attribute Key conforming to the + // "tls.client.supported_ciphers" semantic conventions. It represents the + // array of ciphers offered by the client during the client hello. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: '"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", + // "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "..."' + TLSClientSupportedCiphersKey = attribute.Key("tls.client.supported_ciphers") + + // TLSCurveKey is the attribute Key conforming to the "tls.curve" semantic + // conventions. It represents the string indicating the curve used for the + // given cipher, when applicable + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'secp256r1' + TLSCurveKey = attribute.Key("tls.curve") + + // TLSEstablishedKey is the attribute Key conforming to the + // "tls.established" semantic conventions. It represents the boolean flag + // indicating if the TLS negotiation was successful and transitioned to an + // encrypted tunnel. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + // Examples: True + TLSEstablishedKey = attribute.Key("tls.established") + + // TLSNextProtocolKey is the attribute Key conforming to the + // "tls.next_protocol" semantic conventions. It represents the string + // indicating the protocol being tunneled. Per the values in the [IANA + // registry](https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids), + // this string should be lower case. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'http/1.1' + TLSNextProtocolKey = attribute.Key("tls.next_protocol") + + // TLSProtocolNameKey is the attribute Key conforming to the + // "tls.protocol.name" semantic conventions. It represents the normalized + // lowercase protocol name parsed from original string of the negotiated + // [SSL/TLS protocol + // version](https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html#RETURN-VALUES) + // + // Type: Enum + // RequirementLevel: Optional + // Stability: experimental + TLSProtocolNameKey = attribute.Key("tls.protocol.name") + + // TLSProtocolVersionKey is the attribute Key conforming to the + // "tls.protocol.version" semantic conventions. It represents the numeric + // part of the version parsed from the original string of the negotiated + // [SSL/TLS protocol + // version](https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html#RETURN-VALUES) + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '1.2', '3' + TLSProtocolVersionKey = attribute.Key("tls.protocol.version") + + // TLSResumedKey is the attribute Key conforming to the "tls.resumed" + // semantic conventions. It represents the boolean flag indicating if this + // TLS connection was resumed from an existing TLS negotiation. + // + // Type: boolean + // RequirementLevel: Optional + // Stability: experimental + // Examples: True + TLSResumedKey = attribute.Key("tls.resumed") + + // TLSServerCertificateKey is the attribute Key conforming to the + // "tls.server.certificate" semantic conventions. It represents the + // pEM-encoded stand-alone certificate offered by the server. This is + // usually mutually-exclusive of `server.certificate_chain` since this + // value also exists in that list. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'MII...' + TLSServerCertificateKey = attribute.Key("tls.server.certificate") + + // TLSServerCertificateChainKey is the attribute Key conforming to the + // "tls.server.certificate_chain" semantic conventions. It represents the + // array of PEM-encoded certificates that make up the certificate chain + // offered by the server. This is usually mutually-exclusive of + // `server.certificate` since that value should be the first certificate in + // the chain. + // + // Type: string[] + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'MII...', 'MI...' + TLSServerCertificateChainKey = attribute.Key("tls.server.certificate_chain") + + // TLSServerHashMd5Key is the attribute Key conforming to the + // "tls.server.hash.md5" semantic conventions. It represents the + // certificate fingerprint using the MD5 digest of DER-encoded version of + // certificate offered by the server. For consistency with other hash + // values, this value should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '0F76C7F2C55BFD7D8E8B8F4BFBF0C9EC' + TLSServerHashMd5Key = attribute.Key("tls.server.hash.md5") + + // TLSServerHashSha1Key is the attribute Key conforming to the + // "tls.server.hash.sha1" semantic conventions. It represents the + // certificate fingerprint using the SHA1 digest of DER-encoded version of + // certificate offered by the server. For consistency with other hash + // values, this value should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '9E393D93138888D288266C2D915214D1D1CCEB2A' + TLSServerHashSha1Key = attribute.Key("tls.server.hash.sha1") + + // TLSServerHashSha256Key is the attribute Key conforming to the + // "tls.server.hash.sha256" semantic conventions. It represents the + // certificate fingerprint using the SHA256 digest of DER-encoded version + // of certificate offered by the server. For consistency with other hash + // values, this value should be formatted as an uppercase hash. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: + // '0687F666A054EF17A08E2F2162EAB4CBC0D265E1D7875BE74BF3C712CA92DAF0' + TLSServerHashSha256Key = attribute.Key("tls.server.hash.sha256") + + // TLSServerIssuerKey is the attribute Key conforming to the + // "tls.server.issuer" semantic conventions. It represents the + // distinguished name of + // [subject](https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6) + // of the issuer of the x.509 certificate presented by the client. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'CN=Example Root CA, OU=Infrastructure Team, DC=example, + // DC=com' + TLSServerIssuerKey = attribute.Key("tls.server.issuer") + + // TLSServerJa3sKey is the attribute Key conforming to the + // "tls.server.ja3s" semantic conventions. It represents a hash that + // identifies servers based on how they perform an SSL/TLS handshake. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'd4e5b18d6b55c71272893221c96ba240' + TLSServerJa3sKey = attribute.Key("tls.server.ja3s") + + // TLSServerNotAfterKey is the attribute Key conforming to the + // "tls.server.not_after" semantic conventions. It represents the date/Time + // indicating when server certificate is no longer considered valid. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '2021-01-01T00:00:00.000Z' + TLSServerNotAfterKey = attribute.Key("tls.server.not_after") + + // TLSServerNotBeforeKey is the attribute Key conforming to the + // "tls.server.not_before" semantic conventions. It represents the + // date/Time indicating when server certificate is first considered valid. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '1970-01-01T00:00:00.000Z' + TLSServerNotBeforeKey = attribute.Key("tls.server.not_before") + + // TLSServerSubjectKey is the attribute Key conforming to the + // "tls.server.subject" semantic conventions. It represents the + // distinguished name of subject of the x.509 certificate presented by the + // server. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'CN=myserver, OU=Documentation Team, DC=example, DC=com' + TLSServerSubjectKey = attribute.Key("tls.server.subject") +) + +var ( + // ssl + TLSProtocolNameSsl = TLSProtocolNameKey.String("ssl") + // tls + TLSProtocolNameTLS = TLSProtocolNameKey.String("tls") +) + +// TLSCipher returns an attribute KeyValue conforming to the "tls.cipher" +// semantic conventions. It represents the string indicating the +// [cipher](https://datatracker.ietf.org/doc/html/rfc5246#appendix-A.5) used +// during the current connection. +func TLSCipher(val string) attribute.KeyValue { + return TLSCipherKey.String(val) +} + +// TLSClientCertificate returns an attribute KeyValue conforming to the +// "tls.client.certificate" semantic conventions. It represents the pEM-encoded +// stand-alone certificate offered by the client. This is usually +// mutually-exclusive of `client.certificate_chain` since this value also +// exists in that list. +func TLSClientCertificate(val string) attribute.KeyValue { + return TLSClientCertificateKey.String(val) +} + +// TLSClientCertificateChain returns an attribute KeyValue conforming to the +// "tls.client.certificate_chain" semantic conventions. It represents the array +// of PEM-encoded certificates that make up the certificate chain offered by +// the client. This is usually mutually-exclusive of `client.certificate` since +// that value should be the first certificate in the chain. +func TLSClientCertificateChain(val ...string) attribute.KeyValue { + return TLSClientCertificateChainKey.StringSlice(val) +} + +// TLSClientHashMd5 returns an attribute KeyValue conforming to the +// "tls.client.hash.md5" semantic conventions. It represents the certificate +// fingerprint using the MD5 digest of DER-encoded version of certificate +// offered by the client. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSClientHashMd5(val string) attribute.KeyValue { + return TLSClientHashMd5Key.String(val) +} + +// TLSClientHashSha1 returns an attribute KeyValue conforming to the +// "tls.client.hash.sha1" semantic conventions. It represents the certificate +// fingerprint using the SHA1 digest of DER-encoded version of certificate +// offered by the client. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSClientHashSha1(val string) attribute.KeyValue { + return TLSClientHashSha1Key.String(val) +} + +// TLSClientHashSha256 returns an attribute KeyValue conforming to the +// "tls.client.hash.sha256" semantic conventions. It represents the certificate +// fingerprint using the SHA256 digest of DER-encoded version of certificate +// offered by the client. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSClientHashSha256(val string) attribute.KeyValue { + return TLSClientHashSha256Key.String(val) +} + +// TLSClientIssuer returns an attribute KeyValue conforming to the +// "tls.client.issuer" semantic conventions. It represents the distinguished +// name of +// [subject](https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6) of +// the issuer of the x.509 certificate presented by the client. +func TLSClientIssuer(val string) attribute.KeyValue { + return TLSClientIssuerKey.String(val) +} + +// TLSClientJa3 returns an attribute KeyValue conforming to the +// "tls.client.ja3" semantic conventions. It represents a hash that identifies +// clients based on how they perform an SSL/TLS handshake. +func TLSClientJa3(val string) attribute.KeyValue { + return TLSClientJa3Key.String(val) +} + +// TLSClientNotAfter returns an attribute KeyValue conforming to the +// "tls.client.not_after" semantic conventions. It represents the date/Time +// indicating when client certificate is no longer considered valid. +func TLSClientNotAfter(val string) attribute.KeyValue { + return TLSClientNotAfterKey.String(val) +} + +// TLSClientNotBefore returns an attribute KeyValue conforming to the +// "tls.client.not_before" semantic conventions. It represents the date/Time +// indicating when client certificate is first considered valid. +func TLSClientNotBefore(val string) attribute.KeyValue { + return TLSClientNotBeforeKey.String(val) +} + +// TLSClientServerName returns an attribute KeyValue conforming to the +// "tls.client.server_name" semantic conventions. It represents the also called +// an SNI, this tells the server which hostname to which the client is +// attempting to connect to. +func TLSClientServerName(val string) attribute.KeyValue { + return TLSClientServerNameKey.String(val) +} + +// TLSClientSubject returns an attribute KeyValue conforming to the +// "tls.client.subject" semantic conventions. It represents the distinguished +// name of subject of the x.509 certificate presented by the client. +func TLSClientSubject(val string) attribute.KeyValue { + return TLSClientSubjectKey.String(val) +} + +// TLSClientSupportedCiphers returns an attribute KeyValue conforming to the +// "tls.client.supported_ciphers" semantic conventions. It represents the array +// of ciphers offered by the client during the client hello. +func TLSClientSupportedCiphers(val ...string) attribute.KeyValue { + return TLSClientSupportedCiphersKey.StringSlice(val) +} + +// TLSCurve returns an attribute KeyValue conforming to the "tls.curve" +// semantic conventions. It represents the string indicating the curve used for +// the given cipher, when applicable +func TLSCurve(val string) attribute.KeyValue { + return TLSCurveKey.String(val) +} + +// TLSEstablished returns an attribute KeyValue conforming to the +// "tls.established" semantic conventions. It represents the boolean flag +// indicating if the TLS negotiation was successful and transitioned to an +// encrypted tunnel. +func TLSEstablished(val bool) attribute.KeyValue { + return TLSEstablishedKey.Bool(val) +} + +// TLSNextProtocol returns an attribute KeyValue conforming to the +// "tls.next_protocol" semantic conventions. It represents the string +// indicating the protocol being tunneled. Per the values in the [IANA +// registry](https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids), +// this string should be lower case. +func TLSNextProtocol(val string) attribute.KeyValue { + return TLSNextProtocolKey.String(val) +} + +// TLSProtocolVersion returns an attribute KeyValue conforming to the +// "tls.protocol.version" semantic conventions. It represents the numeric part +// of the version parsed from the original string of the negotiated [SSL/TLS +// protocol +// version](https://www.openssl.org/docs/man1.1.1/man3/SSL_get_version.html#RETURN-VALUES) +func TLSProtocolVersion(val string) attribute.KeyValue { + return TLSProtocolVersionKey.String(val) +} + +// TLSResumed returns an attribute KeyValue conforming to the "tls.resumed" +// semantic conventions. It represents the boolean flag indicating if this TLS +// connection was resumed from an existing TLS negotiation. +func TLSResumed(val bool) attribute.KeyValue { + return TLSResumedKey.Bool(val) +} + +// TLSServerCertificate returns an attribute KeyValue conforming to the +// "tls.server.certificate" semantic conventions. It represents the pEM-encoded +// stand-alone certificate offered by the server. This is usually +// mutually-exclusive of `server.certificate_chain` since this value also +// exists in that list. +func TLSServerCertificate(val string) attribute.KeyValue { + return TLSServerCertificateKey.String(val) +} + +// TLSServerCertificateChain returns an attribute KeyValue conforming to the +// "tls.server.certificate_chain" semantic conventions. It represents the array +// of PEM-encoded certificates that make up the certificate chain offered by +// the server. This is usually mutually-exclusive of `server.certificate` since +// that value should be the first certificate in the chain. +func TLSServerCertificateChain(val ...string) attribute.KeyValue { + return TLSServerCertificateChainKey.StringSlice(val) +} + +// TLSServerHashMd5 returns an attribute KeyValue conforming to the +// "tls.server.hash.md5" semantic conventions. It represents the certificate +// fingerprint using the MD5 digest of DER-encoded version of certificate +// offered by the server. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSServerHashMd5(val string) attribute.KeyValue { + return TLSServerHashMd5Key.String(val) +} + +// TLSServerHashSha1 returns an attribute KeyValue conforming to the +// "tls.server.hash.sha1" semantic conventions. It represents the certificate +// fingerprint using the SHA1 digest of DER-encoded version of certificate +// offered by the server. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSServerHashSha1(val string) attribute.KeyValue { + return TLSServerHashSha1Key.String(val) +} + +// TLSServerHashSha256 returns an attribute KeyValue conforming to the +// "tls.server.hash.sha256" semantic conventions. It represents the certificate +// fingerprint using the SHA256 digest of DER-encoded version of certificate +// offered by the server. For consistency with other hash values, this value +// should be formatted as an uppercase hash. +func TLSServerHashSha256(val string) attribute.KeyValue { + return TLSServerHashSha256Key.String(val) +} + +// TLSServerIssuer returns an attribute KeyValue conforming to the +// "tls.server.issuer" semantic conventions. It represents the distinguished +// name of +// [subject](https://datatracker.ietf.org/doc/html/rfc5280#section-4.1.2.6) of +// the issuer of the x.509 certificate presented by the client. +func TLSServerIssuer(val string) attribute.KeyValue { + return TLSServerIssuerKey.String(val) +} + +// TLSServerJa3s returns an attribute KeyValue conforming to the +// "tls.server.ja3s" semantic conventions. It represents a hash that identifies +// servers based on how they perform an SSL/TLS handshake. +func TLSServerJa3s(val string) attribute.KeyValue { + return TLSServerJa3sKey.String(val) +} + +// TLSServerNotAfter returns an attribute KeyValue conforming to the +// "tls.server.not_after" semantic conventions. It represents the date/Time +// indicating when server certificate is no longer considered valid. +func TLSServerNotAfter(val string) attribute.KeyValue { + return TLSServerNotAfterKey.String(val) +} + +// TLSServerNotBefore returns an attribute KeyValue conforming to the +// "tls.server.not_before" semantic conventions. It represents the date/Time +// indicating when server certificate is first considered valid. +func TLSServerNotBefore(val string) attribute.KeyValue { + return TLSServerNotBeforeKey.String(val) +} + +// TLSServerSubject returns an attribute KeyValue conforming to the +// "tls.server.subject" semantic conventions. It represents the distinguished +// name of subject of the x.509 certificate presented by the server. +func TLSServerSubject(val string) attribute.KeyValue { + return TLSServerSubjectKey.String(val) +} + +// Attributes describing URL. +const ( + // URLDomainKey is the attribute Key conforming to the "url.domain" + // semantic conventions. It represents the domain extracted from the + // `url.full`, such as "opentelemetry.io". + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'www.foo.bar', 'opentelemetry.io', '3.12.167.2', + // '[1080:0:0:0:8:800:200C:417A]' + // Note: In some cases a URL may refer to an IP and/or port directly, + // without a domain name. In this case, the IP address would go to the + // domain field. If the URL contains a [literal IPv6 + // address](https://www.rfc-editor.org/rfc/rfc2732#section-2) enclosed by + // `[` and `]`, the `[` and `]` characters should also be captured in the + // domain field. + URLDomainKey = attribute.Key("url.domain") + + // URLExtensionKey is the attribute Key conforming to the "url.extension" + // semantic conventions. It represents the file extension extracted from + // the `url.full`, excluding the leading dot. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'png', 'gz' + // Note: The file extension is only set if it exists, as not every url has + // a file extension. When the file name has multiple extensions + // `example.tar.gz`, only the last one should be captured `gz`, not + // `tar.gz`. + URLExtensionKey = attribute.Key("url.extension") + + // URLFragmentKey is the attribute Key conforming to the "url.fragment" + // semantic conventions. It represents the [URI + // fragment](https://www.rfc-editor.org/rfc/rfc3986#section-3.5) component + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'SemConv' + URLFragmentKey = attribute.Key("url.fragment") + + // URLFullKey is the attribute Key conforming to the "url.full" semantic + // conventions. It represents the absolute URL describing a network + // resource according to [RFC3986](https://www.rfc-editor.org/rfc/rfc3986) + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'https://www.foo.bar/search?q=OpenTelemetry#SemConv', + // '//localhost' + // Note: For network calls, URL usually has + // `scheme://host[:port][path][?query][#fragment]` format, where the + // fragment is not transmitted over HTTP, but if it is known, it SHOULD be + // included nevertheless. + // `url.full` MUST NOT contain credentials passed via URL in form of + // `https://username:password@www.example.com/`. In such case username and + // password SHOULD be redacted and attribute's value SHOULD be + // `https://REDACTED:REDACTED@www.example.com/`. + // `url.full` SHOULD capture the absolute URL when it is available (or can + // be reconstructed). Sensitive content provided in `url.full` SHOULD be + // scrubbed when instrumentations can identify it. + URLFullKey = attribute.Key("url.full") + + // URLOriginalKey is the attribute Key conforming to the "url.original" + // semantic conventions. It represents the unmodified original URL as seen + // in the event source. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'https://www.foo.bar/search?q=OpenTelemetry#SemConv', + // 'search?q=OpenTelemetry' + // Note: In network monitoring, the observed URL may be a full URL, whereas + // in access logs, the URL is often just represented as a path. This field + // is meant to represent the URL as it was observed, complete or not. + // `url.original` might contain credentials passed via URL in form of + // `https://username:password@www.example.com/`. In such case password and + // username SHOULD NOT be redacted and attribute's value SHOULD remain the + // same. + URLOriginalKey = attribute.Key("url.original") + + // URLPathKey is the attribute Key conforming to the "url.path" semantic + // conventions. It represents the [URI + // path](https://www.rfc-editor.org/rfc/rfc3986#section-3.3) component + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: '/search' + // Note: Sensitive content provided in `url.path` SHOULD be scrubbed when + // instrumentations can identify it. + URLPathKey = attribute.Key("url.path") + + // URLPortKey is the attribute Key conforming to the "url.port" semantic + // conventions. It represents the port extracted from the `url.full` + // + // Type: int + // RequirementLevel: Optional + // Stability: experimental + // Examples: 443 + URLPortKey = attribute.Key("url.port") + + // URLQueryKey is the attribute Key conforming to the "url.query" semantic + // conventions. It represents the [URI + // query](https://www.rfc-editor.org/rfc/rfc3986#section-3.4) component + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'q=OpenTelemetry' + // Note: Sensitive content provided in `url.query` SHOULD be scrubbed when + // instrumentations can identify it. + URLQueryKey = attribute.Key("url.query") + + // URLRegisteredDomainKey is the attribute Key conforming to the + // "url.registered_domain" semantic conventions. It represents the highest + // registered url domain, stripped of the subdomain. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'example.com', 'foo.co.uk' + // Note: This value can be determined precisely with the [public suffix + // list](http://publicsuffix.org). For example, the registered domain for + // `foo.example.com` is `example.com`. Trying to approximate this by simply + // taking the last two labels will not work well for TLDs such as `co.uk`. + URLRegisteredDomainKey = attribute.Key("url.registered_domain") + + // URLSchemeKey is the attribute Key conforming to the "url.scheme" + // semantic conventions. It represents the [URI + // scheme](https://www.rfc-editor.org/rfc/rfc3986#section-3.1) component + // identifying the used protocol. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'https', 'ftp', 'telnet' + URLSchemeKey = attribute.Key("url.scheme") + + // URLSubdomainKey is the attribute Key conforming to the "url.subdomain" + // semantic conventions. It represents the subdomain portion of a fully + // qualified domain name includes all of the names except the host name + // under the registered_domain. In a partially qualified domain, or if the + // qualification level of the full name cannot be determined, subdomain + // contains all of the names below the registered domain. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'east', 'sub2.sub1' + // Note: The subdomain portion of `www.east.mydomain.co.uk` is `east`. If + // the domain has multiple levels of subdomain, such as + // `sub2.sub1.example.com`, the subdomain field should contain `sub2.sub1`, + // with no trailing period. + URLSubdomainKey = attribute.Key("url.subdomain") + + // URLTemplateKey is the attribute Key conforming to the "url.template" + // semantic conventions. It represents the low-cardinality template of an + // [absolute path + // reference](https://www.rfc-editor.org/rfc/rfc3986#section-4.2). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '/users/{id}', '/users/:id', '/users?id={id}' + URLTemplateKey = attribute.Key("url.template") + + // URLTopLevelDomainKey is the attribute Key conforming to the + // "url.top_level_domain" semantic conventions. It represents the effective + // top level domain (eTLD), also known as the domain suffix, is the last + // part of the domain name. For example, the top level domain for + // example.com is `com`. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'com', 'co.uk' + // Note: This value can be determined precisely with the [public suffix + // list](http://publicsuffix.org). + URLTopLevelDomainKey = attribute.Key("url.top_level_domain") +) + +// URLDomain returns an attribute KeyValue conforming to the "url.domain" +// semantic conventions. It represents the domain extracted from the +// `url.full`, such as "opentelemetry.io". +func URLDomain(val string) attribute.KeyValue { + return URLDomainKey.String(val) +} + +// URLExtension returns an attribute KeyValue conforming to the +// "url.extension" semantic conventions. It represents the file extension +// extracted from the `url.full`, excluding the leading dot. +func URLExtension(val string) attribute.KeyValue { + return URLExtensionKey.String(val) +} + +// URLFragment returns an attribute KeyValue conforming to the +// "url.fragment" semantic conventions. It represents the [URI +// fragment](https://www.rfc-editor.org/rfc/rfc3986#section-3.5) component +func URLFragment(val string) attribute.KeyValue { + return URLFragmentKey.String(val) +} + +// URLFull returns an attribute KeyValue conforming to the "url.full" +// semantic conventions. It represents the absolute URL describing a network +// resource according to [RFC3986](https://www.rfc-editor.org/rfc/rfc3986) +func URLFull(val string) attribute.KeyValue { + return URLFullKey.String(val) +} + +// URLOriginal returns an attribute KeyValue conforming to the +// "url.original" semantic conventions. It represents the unmodified original +// URL as seen in the event source. +func URLOriginal(val string) attribute.KeyValue { + return URLOriginalKey.String(val) +} + +// URLPath returns an attribute KeyValue conforming to the "url.path" +// semantic conventions. It represents the [URI +// path](https://www.rfc-editor.org/rfc/rfc3986#section-3.3) component +func URLPath(val string) attribute.KeyValue { + return URLPathKey.String(val) +} + +// URLPort returns an attribute KeyValue conforming to the "url.port" +// semantic conventions. It represents the port extracted from the `url.full` +func URLPort(val int) attribute.KeyValue { + return URLPortKey.Int(val) +} + +// URLQuery returns an attribute KeyValue conforming to the "url.query" +// semantic conventions. It represents the [URI +// query](https://www.rfc-editor.org/rfc/rfc3986#section-3.4) component +func URLQuery(val string) attribute.KeyValue { + return URLQueryKey.String(val) +} + +// URLRegisteredDomain returns an attribute KeyValue conforming to the +// "url.registered_domain" semantic conventions. It represents the highest +// registered url domain, stripped of the subdomain. +func URLRegisteredDomain(val string) attribute.KeyValue { + return URLRegisteredDomainKey.String(val) +} + +// URLScheme returns an attribute KeyValue conforming to the "url.scheme" +// semantic conventions. It represents the [URI +// scheme](https://www.rfc-editor.org/rfc/rfc3986#section-3.1) component +// identifying the used protocol. +func URLScheme(val string) attribute.KeyValue { + return URLSchemeKey.String(val) +} + +// URLSubdomain returns an attribute KeyValue conforming to the +// "url.subdomain" semantic conventions. It represents the subdomain portion of +// a fully qualified domain name includes all of the names except the host name +// under the registered_domain. In a partially qualified domain, or if the +// qualification level of the full name cannot be determined, subdomain +// contains all of the names below the registered domain. +func URLSubdomain(val string) attribute.KeyValue { + return URLSubdomainKey.String(val) +} + +// URLTemplate returns an attribute KeyValue conforming to the +// "url.template" semantic conventions. It represents the low-cardinality +// template of an [absolute path +// reference](https://www.rfc-editor.org/rfc/rfc3986#section-4.2). +func URLTemplate(val string) attribute.KeyValue { + return URLTemplateKey.String(val) +} + +// URLTopLevelDomain returns an attribute KeyValue conforming to the +// "url.top_level_domain" semantic conventions. It represents the effective top +// level domain (eTLD), also known as the domain suffix, is the last part of +// the domain name. For example, the top level domain for example.com is `com`. +func URLTopLevelDomain(val string) attribute.KeyValue { + return URLTopLevelDomainKey.String(val) +} + +// Describes user-agent attributes. +const ( + // UserAgentNameKey is the attribute Key conforming to the + // "user_agent.name" semantic conventions. It represents the name of the + // user-agent extracted from original. Usually refers to the browser's + // name. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'Safari', 'YourApp' + // Note: [Example](https://www.whatsmyua.info) of extracting browser's name + // from original string. In the case of using a user-agent for non-browser + // products, such as microservices with multiple names/versions inside the + // `user_agent.original`, the most significant name SHOULD be selected. In + // such a scenario it should align with `user_agent.version` + UserAgentNameKey = attribute.Key("user_agent.name") + + // UserAgentOriginalKey is the attribute Key conforming to the + // "user_agent.original" semantic conventions. It represents the value of + // the [HTTP + // User-Agent](https://www.rfc-editor.org/rfc/rfc9110.html#field.user-agent) + // header sent by the client. + // + // Type: string + // RequirementLevel: Optional + // Stability: stable + // Examples: 'CERN-LineMode/2.15 libwww/2.17b3', 'Mozilla/5.0 (iPhone; CPU + // iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) + // Version/14.1.2 Mobile/15E148 Safari/604.1', 'YourApp/1.0.0 + // grpc-java-okhttp/1.27.2' + UserAgentOriginalKey = attribute.Key("user_agent.original") + + // UserAgentVersionKey is the attribute Key conforming to the + // "user_agent.version" semantic conventions. It represents the version of + // the user-agent extracted from original. Usually refers to the browser's + // version + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '14.1.2', '1.0.0' + // Note: [Example](https://www.whatsmyua.info) of extracting browser's + // version from original string. In the case of using a user-agent for + // non-browser products, such as microservices with multiple names/versions + // inside the `user_agent.original`, the most significant version SHOULD be + // selected. In such a scenario it should align with `user_agent.name` + UserAgentVersionKey = attribute.Key("user_agent.version") +) + +// UserAgentName returns an attribute KeyValue conforming to the +// "user_agent.name" semantic conventions. It represents the name of the +// user-agent extracted from original. Usually refers to the browser's name. +func UserAgentName(val string) attribute.KeyValue { + return UserAgentNameKey.String(val) +} + +// UserAgentOriginal returns an attribute KeyValue conforming to the +// "user_agent.original" semantic conventions. It represents the value of the +// [HTTP +// User-Agent](https://www.rfc-editor.org/rfc/rfc9110.html#field.user-agent) +// header sent by the client. +func UserAgentOriginal(val string) attribute.KeyValue { + return UserAgentOriginalKey.String(val) +} + +// UserAgentVersion returns an attribute KeyValue conforming to the +// "user_agent.version" semantic conventions. It represents the version of the +// user-agent extracted from original. Usually refers to the browser's version +func UserAgentVersion(val string) attribute.KeyValue { + return UserAgentVersionKey.String(val) +} + +// The attributes used to describe the packaged software running the +// application code. +const ( + // WebEngineDescriptionKey is the attribute Key conforming to the + // "webengine.description" semantic conventions. It represents the + // additional description of the web engine (e.g. detailed version and + // edition information). + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'WildFly Full 21.0.0.Final (WildFly Core 13.0.1.Final) - + // 2.2.2.Final' + WebEngineDescriptionKey = attribute.Key("webengine.description") + + // WebEngineNameKey is the attribute Key conforming to the "webengine.name" + // semantic conventions. It represents the name of the web engine. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: 'WildFly' + WebEngineNameKey = attribute.Key("webengine.name") + + // WebEngineVersionKey is the attribute Key conforming to the + // "webengine.version" semantic conventions. It represents the version of + // the web engine. + // + // Type: string + // RequirementLevel: Optional + // Stability: experimental + // Examples: '21.0.0' + WebEngineVersionKey = attribute.Key("webengine.version") +) + +// WebEngineDescription returns an attribute KeyValue conforming to the +// "webengine.description" semantic conventions. It represents the additional +// description of the web engine (e.g. detailed version and edition +// information). +func WebEngineDescription(val string) attribute.KeyValue { + return WebEngineDescriptionKey.String(val) +} + +// WebEngineName returns an attribute KeyValue conforming to the +// "webengine.name" semantic conventions. It represents the name of the web +// engine. +func WebEngineName(val string) attribute.KeyValue { + return WebEngineNameKey.String(val) +} + +// WebEngineVersion returns an attribute KeyValue conforming to the +// "webengine.version" semantic conventions. It represents the version of the +// web engine. +func WebEngineVersion(val string) attribute.KeyValue { + return WebEngineVersionKey.String(val) +} diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/doc.go b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/doc.go new file mode 100644 index 0000000000..d031bbea78 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/doc.go @@ -0,0 +1,9 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package semconv implements OpenTelemetry semantic conventions. +// +// OpenTelemetry semantic conventions are agreed standardized naming +// patterns for OpenTelemetry things. This package represents the v1.26.0 +// version of the OpenTelemetry semantic conventions. +package semconv // import "go.opentelemetry.io/otel/semconv/v1.26.0" diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/exception.go b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/exception.go new file mode 100644 index 0000000000..bfaee0d56e --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/exception.go @@ -0,0 +1,9 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.26.0" + +const ( + // ExceptionEventName is the name of the Span event representing an exception. + ExceptionEventName = "exception" +) diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/metric.go b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/metric.go new file mode 100644 index 0000000000..fcdb9f4859 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/metric.go @@ -0,0 +1,1307 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Code generated from semantic convention specification. DO NOT EDIT. + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.26.0" + +const ( + + // ContainerCPUTime is the metric conforming to the "container.cpu.time" + // semantic conventions. It represents the total CPU time consumed. + // Instrument: counter + // Unit: s + // Stability: Experimental + ContainerCPUTimeName = "container.cpu.time" + ContainerCPUTimeUnit = "s" + ContainerCPUTimeDescription = "Total CPU time consumed" + + // ContainerMemoryUsage is the metric conforming to the + // "container.memory.usage" semantic conventions. It represents the memory + // usage of the container. + // Instrument: counter + // Unit: By + // Stability: Experimental + ContainerMemoryUsageName = "container.memory.usage" + ContainerMemoryUsageUnit = "By" + ContainerMemoryUsageDescription = "Memory usage of the container." + + // ContainerDiskIo is the metric conforming to the "container.disk.io" semantic + // conventions. It represents the disk bytes for the container. + // Instrument: counter + // Unit: By + // Stability: Experimental + ContainerDiskIoName = "container.disk.io" + ContainerDiskIoUnit = "By" + ContainerDiskIoDescription = "Disk bytes for the container." + + // ContainerNetworkIo is the metric conforming to the "container.network.io" + // semantic conventions. It represents the network bytes for the container. + // Instrument: counter + // Unit: By + // Stability: Experimental + ContainerNetworkIoName = "container.network.io" + ContainerNetworkIoUnit = "By" + ContainerNetworkIoDescription = "Network bytes for the container." + + // DBClientOperationDuration is the metric conforming to the + // "db.client.operation.duration" semantic conventions. It represents the + // duration of database client operations. + // Instrument: histogram + // Unit: s + // Stability: Experimental + DBClientOperationDurationName = "db.client.operation.duration" + DBClientOperationDurationUnit = "s" + DBClientOperationDurationDescription = "Duration of database client operations." + + // DBClientConnectionCount is the metric conforming to the + // "db.client.connection.count" semantic conventions. It represents the number + // of connections that are currently in state described by the `state` + // attribute. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + DBClientConnectionCountName = "db.client.connection.count" + DBClientConnectionCountUnit = "{connection}" + DBClientConnectionCountDescription = "The number of connections that are currently in state described by the `state` attribute" + + // DBClientConnectionIdleMax is the metric conforming to the + // "db.client.connection.idle.max" semantic conventions. It represents the + // maximum number of idle open connections allowed. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + DBClientConnectionIdleMaxName = "db.client.connection.idle.max" + DBClientConnectionIdleMaxUnit = "{connection}" + DBClientConnectionIdleMaxDescription = "The maximum number of idle open connections allowed" + + // DBClientConnectionIdleMin is the metric conforming to the + // "db.client.connection.idle.min" semantic conventions. It represents the + // minimum number of idle open connections allowed. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + DBClientConnectionIdleMinName = "db.client.connection.idle.min" + DBClientConnectionIdleMinUnit = "{connection}" + DBClientConnectionIdleMinDescription = "The minimum number of idle open connections allowed" + + // DBClientConnectionMax is the metric conforming to the + // "db.client.connection.max" semantic conventions. It represents the maximum + // number of open connections allowed. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + DBClientConnectionMaxName = "db.client.connection.max" + DBClientConnectionMaxUnit = "{connection}" + DBClientConnectionMaxDescription = "The maximum number of open connections allowed" + + // DBClientConnectionPendingRequests is the metric conforming to the + // "db.client.connection.pending_requests" semantic conventions. It represents + // the number of pending requests for an open connection, cumulative for the + // entire pool. + // Instrument: updowncounter + // Unit: {request} + // Stability: Experimental + DBClientConnectionPendingRequestsName = "db.client.connection.pending_requests" + DBClientConnectionPendingRequestsUnit = "{request}" + DBClientConnectionPendingRequestsDescription = "The number of pending requests for an open connection, cumulative for the entire pool" + + // DBClientConnectionTimeouts is the metric conforming to the + // "db.client.connection.timeouts" semantic conventions. It represents the + // number of connection timeouts that have occurred trying to obtain a + // connection from the pool. + // Instrument: counter + // Unit: {timeout} + // Stability: Experimental + DBClientConnectionTimeoutsName = "db.client.connection.timeouts" + DBClientConnectionTimeoutsUnit = "{timeout}" + DBClientConnectionTimeoutsDescription = "The number of connection timeouts that have occurred trying to obtain a connection from the pool" + + // DBClientConnectionCreateTime is the metric conforming to the + // "db.client.connection.create_time" semantic conventions. It represents the + // time it took to create a new connection. + // Instrument: histogram + // Unit: s + // Stability: Experimental + DBClientConnectionCreateTimeName = "db.client.connection.create_time" + DBClientConnectionCreateTimeUnit = "s" + DBClientConnectionCreateTimeDescription = "The time it took to create a new connection" + + // DBClientConnectionWaitTime is the metric conforming to the + // "db.client.connection.wait_time" semantic conventions. It represents the + // time it took to obtain an open connection from the pool. + // Instrument: histogram + // Unit: s + // Stability: Experimental + DBClientConnectionWaitTimeName = "db.client.connection.wait_time" + DBClientConnectionWaitTimeUnit = "s" + DBClientConnectionWaitTimeDescription = "The time it took to obtain an open connection from the pool" + + // DBClientConnectionUseTime is the metric conforming to the + // "db.client.connection.use_time" semantic conventions. It represents the time + // between borrowing a connection and returning it to the pool. + // Instrument: histogram + // Unit: s + // Stability: Experimental + DBClientConnectionUseTimeName = "db.client.connection.use_time" + DBClientConnectionUseTimeUnit = "s" + DBClientConnectionUseTimeDescription = "The time between borrowing a connection and returning it to the pool" + + // DBClientConnectionsUsage is the metric conforming to the + // "db.client.connections.usage" semantic conventions. It represents the + // deprecated, use `db.client.connection.count` instead. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + DBClientConnectionsUsageName = "db.client.connections.usage" + DBClientConnectionsUsageUnit = "{connection}" + DBClientConnectionsUsageDescription = "Deprecated, use `db.client.connection.count` instead." + + // DBClientConnectionsIdleMax is the metric conforming to the + // "db.client.connections.idle.max" semantic conventions. It represents the + // deprecated, use `db.client.connection.idle.max` instead. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + DBClientConnectionsIdleMaxName = "db.client.connections.idle.max" + DBClientConnectionsIdleMaxUnit = "{connection}" + DBClientConnectionsIdleMaxDescription = "Deprecated, use `db.client.connection.idle.max` instead." + + // DBClientConnectionsIdleMin is the metric conforming to the + // "db.client.connections.idle.min" semantic conventions. It represents the + // deprecated, use `db.client.connection.idle.min` instead. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + DBClientConnectionsIdleMinName = "db.client.connections.idle.min" + DBClientConnectionsIdleMinUnit = "{connection}" + DBClientConnectionsIdleMinDescription = "Deprecated, use `db.client.connection.idle.min` instead." + + // DBClientConnectionsMax is the metric conforming to the + // "db.client.connections.max" semantic conventions. It represents the + // deprecated, use `db.client.connection.max` instead. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + DBClientConnectionsMaxName = "db.client.connections.max" + DBClientConnectionsMaxUnit = "{connection}" + DBClientConnectionsMaxDescription = "Deprecated, use `db.client.connection.max` instead." + + // DBClientConnectionsPendingRequests is the metric conforming to the + // "db.client.connections.pending_requests" semantic conventions. It represents + // the deprecated, use `db.client.connection.pending_requests` instead. + // Instrument: updowncounter + // Unit: {request} + // Stability: Experimental + DBClientConnectionsPendingRequestsName = "db.client.connections.pending_requests" + DBClientConnectionsPendingRequestsUnit = "{request}" + DBClientConnectionsPendingRequestsDescription = "Deprecated, use `db.client.connection.pending_requests` instead." + + // DBClientConnectionsTimeouts is the metric conforming to the + // "db.client.connections.timeouts" semantic conventions. It represents the + // deprecated, use `db.client.connection.timeouts` instead. + // Instrument: counter + // Unit: {timeout} + // Stability: Experimental + DBClientConnectionsTimeoutsName = "db.client.connections.timeouts" + DBClientConnectionsTimeoutsUnit = "{timeout}" + DBClientConnectionsTimeoutsDescription = "Deprecated, use `db.client.connection.timeouts` instead." + + // DBClientConnectionsCreateTime is the metric conforming to the + // "db.client.connections.create_time" semantic conventions. It represents the + // deprecated, use `db.client.connection.create_time` instead. Note: the unit + // also changed from `ms` to `s`. + // Instrument: histogram + // Unit: ms + // Stability: Experimental + DBClientConnectionsCreateTimeName = "db.client.connections.create_time" + DBClientConnectionsCreateTimeUnit = "ms" + DBClientConnectionsCreateTimeDescription = "Deprecated, use `db.client.connection.create_time` instead. Note: the unit also changed from `ms` to `s`." + + // DBClientConnectionsWaitTime is the metric conforming to the + // "db.client.connections.wait_time" semantic conventions. It represents the + // deprecated, use `db.client.connection.wait_time` instead. Note: the unit + // also changed from `ms` to `s`. + // Instrument: histogram + // Unit: ms + // Stability: Experimental + DBClientConnectionsWaitTimeName = "db.client.connections.wait_time" + DBClientConnectionsWaitTimeUnit = "ms" + DBClientConnectionsWaitTimeDescription = "Deprecated, use `db.client.connection.wait_time` instead. Note: the unit also changed from `ms` to `s`." + + // DBClientConnectionsUseTime is the metric conforming to the + // "db.client.connections.use_time" semantic conventions. It represents the + // deprecated, use `db.client.connection.use_time` instead. Note: the unit also + // changed from `ms` to `s`. + // Instrument: histogram + // Unit: ms + // Stability: Experimental + DBClientConnectionsUseTimeName = "db.client.connections.use_time" + DBClientConnectionsUseTimeUnit = "ms" + DBClientConnectionsUseTimeDescription = "Deprecated, use `db.client.connection.use_time` instead. Note: the unit also changed from `ms` to `s`." + + // DNSLookupDuration is the metric conforming to the "dns.lookup.duration" + // semantic conventions. It represents the measures the time taken to perform a + // DNS lookup. + // Instrument: histogram + // Unit: s + // Stability: Experimental + DNSLookupDurationName = "dns.lookup.duration" + DNSLookupDurationUnit = "s" + DNSLookupDurationDescription = "Measures the time taken to perform a DNS lookup." + + // AspnetcoreRoutingMatchAttempts is the metric conforming to the + // "aspnetcore.routing.match_attempts" semantic conventions. It represents the + // number of requests that were attempted to be matched to an endpoint. + // Instrument: counter + // Unit: {match_attempt} + // Stability: Stable + AspnetcoreRoutingMatchAttemptsName = "aspnetcore.routing.match_attempts" + AspnetcoreRoutingMatchAttemptsUnit = "{match_attempt}" + AspnetcoreRoutingMatchAttemptsDescription = "Number of requests that were attempted to be matched to an endpoint." + + // AspnetcoreDiagnosticsExceptions is the metric conforming to the + // "aspnetcore.diagnostics.exceptions" semantic conventions. It represents the + // number of exceptions caught by exception handling middleware. + // Instrument: counter + // Unit: {exception} + // Stability: Stable + AspnetcoreDiagnosticsExceptionsName = "aspnetcore.diagnostics.exceptions" + AspnetcoreDiagnosticsExceptionsUnit = "{exception}" + AspnetcoreDiagnosticsExceptionsDescription = "Number of exceptions caught by exception handling middleware." + + // AspnetcoreRateLimitingActiveRequestLeases is the metric conforming to the + // "aspnetcore.rate_limiting.active_request_leases" semantic conventions. It + // represents the number of requests that are currently active on the server + // that hold a rate limiting lease. + // Instrument: updowncounter + // Unit: {request} + // Stability: Stable + AspnetcoreRateLimitingActiveRequestLeasesName = "aspnetcore.rate_limiting.active_request_leases" + AspnetcoreRateLimitingActiveRequestLeasesUnit = "{request}" + AspnetcoreRateLimitingActiveRequestLeasesDescription = "Number of requests that are currently active on the server that hold a rate limiting lease." + + // AspnetcoreRateLimitingRequestLeaseDuration is the metric conforming to the + // "aspnetcore.rate_limiting.request_lease.duration" semantic conventions. It + // represents the duration of rate limiting lease held by requests on the + // server. + // Instrument: histogram + // Unit: s + // Stability: Stable + AspnetcoreRateLimitingRequestLeaseDurationName = "aspnetcore.rate_limiting.request_lease.duration" + AspnetcoreRateLimitingRequestLeaseDurationUnit = "s" + AspnetcoreRateLimitingRequestLeaseDurationDescription = "The duration of rate limiting lease held by requests on the server." + + // AspnetcoreRateLimitingRequestTimeInQueue is the metric conforming to the + // "aspnetcore.rate_limiting.request.time_in_queue" semantic conventions. It + // represents the time the request spent in a queue waiting to acquire a rate + // limiting lease. + // Instrument: histogram + // Unit: s + // Stability: Stable + AspnetcoreRateLimitingRequestTimeInQueueName = "aspnetcore.rate_limiting.request.time_in_queue" + AspnetcoreRateLimitingRequestTimeInQueueUnit = "s" + AspnetcoreRateLimitingRequestTimeInQueueDescription = "The time the request spent in a queue waiting to acquire a rate limiting lease." + + // AspnetcoreRateLimitingQueuedRequests is the metric conforming to the + // "aspnetcore.rate_limiting.queued_requests" semantic conventions. It + // represents the number of requests that are currently queued, waiting to + // acquire a rate limiting lease. + // Instrument: updowncounter + // Unit: {request} + // Stability: Stable + AspnetcoreRateLimitingQueuedRequestsName = "aspnetcore.rate_limiting.queued_requests" + AspnetcoreRateLimitingQueuedRequestsUnit = "{request}" + AspnetcoreRateLimitingQueuedRequestsDescription = "Number of requests that are currently queued, waiting to acquire a rate limiting lease." + + // AspnetcoreRateLimitingRequests is the metric conforming to the + // "aspnetcore.rate_limiting.requests" semantic conventions. It represents the + // number of requests that tried to acquire a rate limiting lease. + // Instrument: counter + // Unit: {request} + // Stability: Stable + AspnetcoreRateLimitingRequestsName = "aspnetcore.rate_limiting.requests" + AspnetcoreRateLimitingRequestsUnit = "{request}" + AspnetcoreRateLimitingRequestsDescription = "Number of requests that tried to acquire a rate limiting lease." + + // KestrelActiveConnections is the metric conforming to the + // "kestrel.active_connections" semantic conventions. It represents the number + // of connections that are currently active on the server. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Stable + KestrelActiveConnectionsName = "kestrel.active_connections" + KestrelActiveConnectionsUnit = "{connection}" + KestrelActiveConnectionsDescription = "Number of connections that are currently active on the server." + + // KestrelConnectionDuration is the metric conforming to the + // "kestrel.connection.duration" semantic conventions. It represents the + // duration of connections on the server. + // Instrument: histogram + // Unit: s + // Stability: Stable + KestrelConnectionDurationName = "kestrel.connection.duration" + KestrelConnectionDurationUnit = "s" + KestrelConnectionDurationDescription = "The duration of connections on the server." + + // KestrelRejectedConnections is the metric conforming to the + // "kestrel.rejected_connections" semantic conventions. It represents the + // number of connections rejected by the server. + // Instrument: counter + // Unit: {connection} + // Stability: Stable + KestrelRejectedConnectionsName = "kestrel.rejected_connections" + KestrelRejectedConnectionsUnit = "{connection}" + KestrelRejectedConnectionsDescription = "Number of connections rejected by the server." + + // KestrelQueuedConnections is the metric conforming to the + // "kestrel.queued_connections" semantic conventions. It represents the number + // of connections that are currently queued and are waiting to start. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Stable + KestrelQueuedConnectionsName = "kestrel.queued_connections" + KestrelQueuedConnectionsUnit = "{connection}" + KestrelQueuedConnectionsDescription = "Number of connections that are currently queued and are waiting to start." + + // KestrelQueuedRequests is the metric conforming to the + // "kestrel.queued_requests" semantic conventions. It represents the number of + // HTTP requests on multiplexed connections (HTTP/2 and HTTP/3) that are + // currently queued and are waiting to start. + // Instrument: updowncounter + // Unit: {request} + // Stability: Stable + KestrelQueuedRequestsName = "kestrel.queued_requests" + KestrelQueuedRequestsUnit = "{request}" + KestrelQueuedRequestsDescription = "Number of HTTP requests on multiplexed connections (HTTP/2 and HTTP/3) that are currently queued and are waiting to start." + + // KestrelUpgradedConnections is the metric conforming to the + // "kestrel.upgraded_connections" semantic conventions. It represents the + // number of connections that are currently upgraded (WebSockets). . + // Instrument: updowncounter + // Unit: {connection} + // Stability: Stable + KestrelUpgradedConnectionsName = "kestrel.upgraded_connections" + KestrelUpgradedConnectionsUnit = "{connection}" + KestrelUpgradedConnectionsDescription = "Number of connections that are currently upgraded (WebSockets). ." + + // KestrelTLSHandshakeDuration is the metric conforming to the + // "kestrel.tls_handshake.duration" semantic conventions. It represents the + // duration of TLS handshakes on the server. + // Instrument: histogram + // Unit: s + // Stability: Stable + KestrelTLSHandshakeDurationName = "kestrel.tls_handshake.duration" + KestrelTLSHandshakeDurationUnit = "s" + KestrelTLSHandshakeDurationDescription = "The duration of TLS handshakes on the server." + + // KestrelActiveTLSHandshakes is the metric conforming to the + // "kestrel.active_tls_handshakes" semantic conventions. It represents the + // number of TLS handshakes that are currently in progress on the server. + // Instrument: updowncounter + // Unit: {handshake} + // Stability: Stable + KestrelActiveTLSHandshakesName = "kestrel.active_tls_handshakes" + KestrelActiveTLSHandshakesUnit = "{handshake}" + KestrelActiveTLSHandshakesDescription = "Number of TLS handshakes that are currently in progress on the server." + + // SignalrServerConnectionDuration is the metric conforming to the + // "signalr.server.connection.duration" semantic conventions. It represents the + // duration of connections on the server. + // Instrument: histogram + // Unit: s + // Stability: Stable + SignalrServerConnectionDurationName = "signalr.server.connection.duration" + SignalrServerConnectionDurationUnit = "s" + SignalrServerConnectionDurationDescription = "The duration of connections on the server." + + // SignalrServerActiveConnections is the metric conforming to the + // "signalr.server.active_connections" semantic conventions. It represents the + // number of connections that are currently active on the server. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Stable + SignalrServerActiveConnectionsName = "signalr.server.active_connections" + SignalrServerActiveConnectionsUnit = "{connection}" + SignalrServerActiveConnectionsDescription = "Number of connections that are currently active on the server." + + // FaaSInvokeDuration is the metric conforming to the "faas.invoke_duration" + // semantic conventions. It represents the measures the duration of the + // function's logic execution. + // Instrument: histogram + // Unit: s + // Stability: Experimental + FaaSInvokeDurationName = "faas.invoke_duration" + FaaSInvokeDurationUnit = "s" + FaaSInvokeDurationDescription = "Measures the duration of the function's logic execution" + + // FaaSInitDuration is the metric conforming to the "faas.init_duration" + // semantic conventions. It represents the measures the duration of the + // function's initialization, such as a cold start. + // Instrument: histogram + // Unit: s + // Stability: Experimental + FaaSInitDurationName = "faas.init_duration" + FaaSInitDurationUnit = "s" + FaaSInitDurationDescription = "Measures the duration of the function's initialization, such as a cold start" + + // FaaSColdstarts is the metric conforming to the "faas.coldstarts" semantic + // conventions. It represents the number of invocation cold starts. + // Instrument: counter + // Unit: {coldstart} + // Stability: Experimental + FaaSColdstartsName = "faas.coldstarts" + FaaSColdstartsUnit = "{coldstart}" + FaaSColdstartsDescription = "Number of invocation cold starts" + + // FaaSErrors is the metric conforming to the "faas.errors" semantic + // conventions. It represents the number of invocation errors. + // Instrument: counter + // Unit: {error} + // Stability: Experimental + FaaSErrorsName = "faas.errors" + FaaSErrorsUnit = "{error}" + FaaSErrorsDescription = "Number of invocation errors" + + // FaaSInvocations is the metric conforming to the "faas.invocations" semantic + // conventions. It represents the number of successful invocations. + // Instrument: counter + // Unit: {invocation} + // Stability: Experimental + FaaSInvocationsName = "faas.invocations" + FaaSInvocationsUnit = "{invocation}" + FaaSInvocationsDescription = "Number of successful invocations" + + // FaaSTimeouts is the metric conforming to the "faas.timeouts" semantic + // conventions. It represents the number of invocation timeouts. + // Instrument: counter + // Unit: {timeout} + // Stability: Experimental + FaaSTimeoutsName = "faas.timeouts" + FaaSTimeoutsUnit = "{timeout}" + FaaSTimeoutsDescription = "Number of invocation timeouts" + + // FaaSMemUsage is the metric conforming to the "faas.mem_usage" semantic + // conventions. It represents the distribution of max memory usage per + // invocation. + // Instrument: histogram + // Unit: By + // Stability: Experimental + FaaSMemUsageName = "faas.mem_usage" + FaaSMemUsageUnit = "By" + FaaSMemUsageDescription = "Distribution of max memory usage per invocation" + + // FaaSCPUUsage is the metric conforming to the "faas.cpu_usage" semantic + // conventions. It represents the distribution of CPU usage per invocation. + // Instrument: histogram + // Unit: s + // Stability: Experimental + FaaSCPUUsageName = "faas.cpu_usage" + FaaSCPUUsageUnit = "s" + FaaSCPUUsageDescription = "Distribution of CPU usage per invocation" + + // FaaSNetIo is the metric conforming to the "faas.net_io" semantic + // conventions. It represents the distribution of net I/O usage per invocation. + // Instrument: histogram + // Unit: By + // Stability: Experimental + FaaSNetIoName = "faas.net_io" + FaaSNetIoUnit = "By" + FaaSNetIoDescription = "Distribution of net I/O usage per invocation" + + // HTTPServerRequestDuration is the metric conforming to the + // "http.server.request.duration" semantic conventions. It represents the + // duration of HTTP server requests. + // Instrument: histogram + // Unit: s + // Stability: Stable + HTTPServerRequestDurationName = "http.server.request.duration" + HTTPServerRequestDurationUnit = "s" + HTTPServerRequestDurationDescription = "Duration of HTTP server requests." + + // HTTPServerActiveRequests is the metric conforming to the + // "http.server.active_requests" semantic conventions. It represents the number + // of active HTTP server requests. + // Instrument: updowncounter + // Unit: {request} + // Stability: Experimental + HTTPServerActiveRequestsName = "http.server.active_requests" + HTTPServerActiveRequestsUnit = "{request}" + HTTPServerActiveRequestsDescription = "Number of active HTTP server requests." + + // HTTPServerRequestBodySize is the metric conforming to the + // "http.server.request.body.size" semantic conventions. It represents the size + // of HTTP server request bodies. + // Instrument: histogram + // Unit: By + // Stability: Experimental + HTTPServerRequestBodySizeName = "http.server.request.body.size" + HTTPServerRequestBodySizeUnit = "By" + HTTPServerRequestBodySizeDescription = "Size of HTTP server request bodies." + + // HTTPServerResponseBodySize is the metric conforming to the + // "http.server.response.body.size" semantic conventions. It represents the + // size of HTTP server response bodies. + // Instrument: histogram + // Unit: By + // Stability: Experimental + HTTPServerResponseBodySizeName = "http.server.response.body.size" + HTTPServerResponseBodySizeUnit = "By" + HTTPServerResponseBodySizeDescription = "Size of HTTP server response bodies." + + // HTTPClientRequestDuration is the metric conforming to the + // "http.client.request.duration" semantic conventions. It represents the + // duration of HTTP client requests. + // Instrument: histogram + // Unit: s + // Stability: Stable + HTTPClientRequestDurationName = "http.client.request.duration" + HTTPClientRequestDurationUnit = "s" + HTTPClientRequestDurationDescription = "Duration of HTTP client requests." + + // HTTPClientRequestBodySize is the metric conforming to the + // "http.client.request.body.size" semantic conventions. It represents the size + // of HTTP client request bodies. + // Instrument: histogram + // Unit: By + // Stability: Experimental + HTTPClientRequestBodySizeName = "http.client.request.body.size" + HTTPClientRequestBodySizeUnit = "By" + HTTPClientRequestBodySizeDescription = "Size of HTTP client request bodies." + + // HTTPClientResponseBodySize is the metric conforming to the + // "http.client.response.body.size" semantic conventions. It represents the + // size of HTTP client response bodies. + // Instrument: histogram + // Unit: By + // Stability: Experimental + HTTPClientResponseBodySizeName = "http.client.response.body.size" + HTTPClientResponseBodySizeUnit = "By" + HTTPClientResponseBodySizeDescription = "Size of HTTP client response bodies." + + // HTTPClientOpenConnections is the metric conforming to the + // "http.client.open_connections" semantic conventions. It represents the + // number of outbound HTTP connections that are currently active or idle on the + // client. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + HTTPClientOpenConnectionsName = "http.client.open_connections" + HTTPClientOpenConnectionsUnit = "{connection}" + HTTPClientOpenConnectionsDescription = "Number of outbound HTTP connections that are currently active or idle on the client." + + // HTTPClientConnectionDuration is the metric conforming to the + // "http.client.connection.duration" semantic conventions. It represents the + // duration of the successfully established outbound HTTP connections. + // Instrument: histogram + // Unit: s + // Stability: Experimental + HTTPClientConnectionDurationName = "http.client.connection.duration" + HTTPClientConnectionDurationUnit = "s" + HTTPClientConnectionDurationDescription = "The duration of the successfully established outbound HTTP connections." + + // HTTPClientActiveRequests is the metric conforming to the + // "http.client.active_requests" semantic conventions. It represents the number + // of active HTTP requests. + // Instrument: updowncounter + // Unit: {request} + // Stability: Experimental + HTTPClientActiveRequestsName = "http.client.active_requests" + HTTPClientActiveRequestsUnit = "{request}" + HTTPClientActiveRequestsDescription = "Number of active HTTP requests." + + // JvmMemoryInit is the metric conforming to the "jvm.memory.init" semantic + // conventions. It represents the measure of initial memory requested. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + JvmMemoryInitName = "jvm.memory.init" + JvmMemoryInitUnit = "By" + JvmMemoryInitDescription = "Measure of initial memory requested." + + // JvmSystemCPUUtilization is the metric conforming to the + // "jvm.system.cpu.utilization" semantic conventions. It represents the recent + // CPU utilization for the whole system as reported by the JVM. + // Instrument: gauge + // Unit: 1 + // Stability: Experimental + JvmSystemCPUUtilizationName = "jvm.system.cpu.utilization" + JvmSystemCPUUtilizationUnit = "1" + JvmSystemCPUUtilizationDescription = "Recent CPU utilization for the whole system as reported by the JVM." + + // JvmSystemCPULoad1m is the metric conforming to the "jvm.system.cpu.load_1m" + // semantic conventions. It represents the average CPU load of the whole system + // for the last minute as reported by the JVM. + // Instrument: gauge + // Unit: {run_queue_item} + // Stability: Experimental + JvmSystemCPULoad1mName = "jvm.system.cpu.load_1m" + JvmSystemCPULoad1mUnit = "{run_queue_item}" + JvmSystemCPULoad1mDescription = "Average CPU load of the whole system for the last minute as reported by the JVM." + + // JvmBufferMemoryUsage is the metric conforming to the + // "jvm.buffer.memory.usage" semantic conventions. It represents the measure of + // memory used by buffers. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + JvmBufferMemoryUsageName = "jvm.buffer.memory.usage" + JvmBufferMemoryUsageUnit = "By" + JvmBufferMemoryUsageDescription = "Measure of memory used by buffers." + + // JvmBufferMemoryLimit is the metric conforming to the + // "jvm.buffer.memory.limit" semantic conventions. It represents the measure of + // total memory capacity of buffers. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + JvmBufferMemoryLimitName = "jvm.buffer.memory.limit" + JvmBufferMemoryLimitUnit = "By" + JvmBufferMemoryLimitDescription = "Measure of total memory capacity of buffers." + + // JvmBufferCount is the metric conforming to the "jvm.buffer.count" semantic + // conventions. It represents the number of buffers in the pool. + // Instrument: updowncounter + // Unit: {buffer} + // Stability: Experimental + JvmBufferCountName = "jvm.buffer.count" + JvmBufferCountUnit = "{buffer}" + JvmBufferCountDescription = "Number of buffers in the pool." + + // JvmMemoryUsed is the metric conforming to the "jvm.memory.used" semantic + // conventions. It represents the measure of memory used. + // Instrument: updowncounter + // Unit: By + // Stability: Stable + JvmMemoryUsedName = "jvm.memory.used" + JvmMemoryUsedUnit = "By" + JvmMemoryUsedDescription = "Measure of memory used." + + // JvmMemoryCommitted is the metric conforming to the "jvm.memory.committed" + // semantic conventions. It represents the measure of memory committed. + // Instrument: updowncounter + // Unit: By + // Stability: Stable + JvmMemoryCommittedName = "jvm.memory.committed" + JvmMemoryCommittedUnit = "By" + JvmMemoryCommittedDescription = "Measure of memory committed." + + // JvmMemoryLimit is the metric conforming to the "jvm.memory.limit" semantic + // conventions. It represents the measure of max obtainable memory. + // Instrument: updowncounter + // Unit: By + // Stability: Stable + JvmMemoryLimitName = "jvm.memory.limit" + JvmMemoryLimitUnit = "By" + JvmMemoryLimitDescription = "Measure of max obtainable memory." + + // JvmMemoryUsedAfterLastGc is the metric conforming to the + // "jvm.memory.used_after_last_gc" semantic conventions. It represents the + // measure of memory used, as measured after the most recent garbage collection + // event on this pool. + // Instrument: updowncounter + // Unit: By + // Stability: Stable + JvmMemoryUsedAfterLastGcName = "jvm.memory.used_after_last_gc" + JvmMemoryUsedAfterLastGcUnit = "By" + JvmMemoryUsedAfterLastGcDescription = "Measure of memory used, as measured after the most recent garbage collection event on this pool." + + // JvmGcDuration is the metric conforming to the "jvm.gc.duration" semantic + // conventions. It represents the duration of JVM garbage collection actions. + // Instrument: histogram + // Unit: s + // Stability: Stable + JvmGcDurationName = "jvm.gc.duration" + JvmGcDurationUnit = "s" + JvmGcDurationDescription = "Duration of JVM garbage collection actions." + + // JvmThreadCount is the metric conforming to the "jvm.thread.count" semantic + // conventions. It represents the number of executing platform threads. + // Instrument: updowncounter + // Unit: {thread} + // Stability: Stable + JvmThreadCountName = "jvm.thread.count" + JvmThreadCountUnit = "{thread}" + JvmThreadCountDescription = "Number of executing platform threads." + + // JvmClassLoaded is the metric conforming to the "jvm.class.loaded" semantic + // conventions. It represents the number of classes loaded since JVM start. + // Instrument: counter + // Unit: {class} + // Stability: Stable + JvmClassLoadedName = "jvm.class.loaded" + JvmClassLoadedUnit = "{class}" + JvmClassLoadedDescription = "Number of classes loaded since JVM start." + + // JvmClassUnloaded is the metric conforming to the "jvm.class.unloaded" + // semantic conventions. It represents the number of classes unloaded since JVM + // start. + // Instrument: counter + // Unit: {class} + // Stability: Stable + JvmClassUnloadedName = "jvm.class.unloaded" + JvmClassUnloadedUnit = "{class}" + JvmClassUnloadedDescription = "Number of classes unloaded since JVM start." + + // JvmClassCount is the metric conforming to the "jvm.class.count" semantic + // conventions. It represents the number of classes currently loaded. + // Instrument: updowncounter + // Unit: {class} + // Stability: Stable + JvmClassCountName = "jvm.class.count" + JvmClassCountUnit = "{class}" + JvmClassCountDescription = "Number of classes currently loaded." + + // JvmCPUCount is the metric conforming to the "jvm.cpu.count" semantic + // conventions. It represents the number of processors available to the Java + // virtual machine. + // Instrument: updowncounter + // Unit: {cpu} + // Stability: Stable + JvmCPUCountName = "jvm.cpu.count" + JvmCPUCountUnit = "{cpu}" + JvmCPUCountDescription = "Number of processors available to the Java virtual machine." + + // JvmCPUTime is the metric conforming to the "jvm.cpu.time" semantic + // conventions. It represents the cPU time used by the process as reported by + // the JVM. + // Instrument: counter + // Unit: s + // Stability: Stable + JvmCPUTimeName = "jvm.cpu.time" + JvmCPUTimeUnit = "s" + JvmCPUTimeDescription = "CPU time used by the process as reported by the JVM." + + // JvmCPURecentUtilization is the metric conforming to the + // "jvm.cpu.recent_utilization" semantic conventions. It represents the recent + // CPU utilization for the process as reported by the JVM. + // Instrument: gauge + // Unit: 1 + // Stability: Stable + JvmCPURecentUtilizationName = "jvm.cpu.recent_utilization" + JvmCPURecentUtilizationUnit = "1" + JvmCPURecentUtilizationDescription = "Recent CPU utilization for the process as reported by the JVM." + + // MessagingPublishDuration is the metric conforming to the + // "messaging.publish.duration" semantic conventions. It represents the + // measures the duration of publish operation. + // Instrument: histogram + // Unit: s + // Stability: Experimental + MessagingPublishDurationName = "messaging.publish.duration" + MessagingPublishDurationUnit = "s" + MessagingPublishDurationDescription = "Measures the duration of publish operation." + + // MessagingReceiveDuration is the metric conforming to the + // "messaging.receive.duration" semantic conventions. It represents the + // measures the duration of receive operation. + // Instrument: histogram + // Unit: s + // Stability: Experimental + MessagingReceiveDurationName = "messaging.receive.duration" + MessagingReceiveDurationUnit = "s" + MessagingReceiveDurationDescription = "Measures the duration of receive operation." + + // MessagingProcessDuration is the metric conforming to the + // "messaging.process.duration" semantic conventions. It represents the + // measures the duration of process operation. + // Instrument: histogram + // Unit: s + // Stability: Experimental + MessagingProcessDurationName = "messaging.process.duration" + MessagingProcessDurationUnit = "s" + MessagingProcessDurationDescription = "Measures the duration of process operation." + + // MessagingPublishMessages is the metric conforming to the + // "messaging.publish.messages" semantic conventions. It represents the + // measures the number of published messages. + // Instrument: counter + // Unit: {message} + // Stability: Experimental + MessagingPublishMessagesName = "messaging.publish.messages" + MessagingPublishMessagesUnit = "{message}" + MessagingPublishMessagesDescription = "Measures the number of published messages." + + // MessagingReceiveMessages is the metric conforming to the + // "messaging.receive.messages" semantic conventions. It represents the + // measures the number of received messages. + // Instrument: counter + // Unit: {message} + // Stability: Experimental + MessagingReceiveMessagesName = "messaging.receive.messages" + MessagingReceiveMessagesUnit = "{message}" + MessagingReceiveMessagesDescription = "Measures the number of received messages." + + // MessagingProcessMessages is the metric conforming to the + // "messaging.process.messages" semantic conventions. It represents the + // measures the number of processed messages. + // Instrument: counter + // Unit: {message} + // Stability: Experimental + MessagingProcessMessagesName = "messaging.process.messages" + MessagingProcessMessagesUnit = "{message}" + MessagingProcessMessagesDescription = "Measures the number of processed messages." + + // ProcessCPUTime is the metric conforming to the "process.cpu.time" semantic + // conventions. It represents the total CPU seconds broken down by different + // states. + // Instrument: counter + // Unit: s + // Stability: Experimental + ProcessCPUTimeName = "process.cpu.time" + ProcessCPUTimeUnit = "s" + ProcessCPUTimeDescription = "Total CPU seconds broken down by different states." + + // ProcessCPUUtilization is the metric conforming to the + // "process.cpu.utilization" semantic conventions. It represents the difference + // in process.cpu.time since the last measurement, divided by the elapsed time + // and number of CPUs available to the process. + // Instrument: gauge + // Unit: 1 + // Stability: Experimental + ProcessCPUUtilizationName = "process.cpu.utilization" + ProcessCPUUtilizationUnit = "1" + ProcessCPUUtilizationDescription = "Difference in process.cpu.time since the last measurement, divided by the elapsed time and number of CPUs available to the process." + + // ProcessMemoryUsage is the metric conforming to the "process.memory.usage" + // semantic conventions. It represents the amount of physical memory in use. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + ProcessMemoryUsageName = "process.memory.usage" + ProcessMemoryUsageUnit = "By" + ProcessMemoryUsageDescription = "The amount of physical memory in use." + + // ProcessMemoryVirtual is the metric conforming to the + // "process.memory.virtual" semantic conventions. It represents the amount of + // committed virtual memory. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + ProcessMemoryVirtualName = "process.memory.virtual" + ProcessMemoryVirtualUnit = "By" + ProcessMemoryVirtualDescription = "The amount of committed virtual memory." + + // ProcessDiskIo is the metric conforming to the "process.disk.io" semantic + // conventions. It represents the disk bytes transferred. + // Instrument: counter + // Unit: By + // Stability: Experimental + ProcessDiskIoName = "process.disk.io" + ProcessDiskIoUnit = "By" + ProcessDiskIoDescription = "Disk bytes transferred." + + // ProcessNetworkIo is the metric conforming to the "process.network.io" + // semantic conventions. It represents the network bytes transferred. + // Instrument: counter + // Unit: By + // Stability: Experimental + ProcessNetworkIoName = "process.network.io" + ProcessNetworkIoUnit = "By" + ProcessNetworkIoDescription = "Network bytes transferred." + + // ProcessThreadCount is the metric conforming to the "process.thread.count" + // semantic conventions. It represents the process threads count. + // Instrument: updowncounter + // Unit: {thread} + // Stability: Experimental + ProcessThreadCountName = "process.thread.count" + ProcessThreadCountUnit = "{thread}" + ProcessThreadCountDescription = "Process threads count." + + // ProcessOpenFileDescriptorCount is the metric conforming to the + // "process.open_file_descriptor.count" semantic conventions. It represents the + // number of file descriptors in use by the process. + // Instrument: updowncounter + // Unit: {count} + // Stability: Experimental + ProcessOpenFileDescriptorCountName = "process.open_file_descriptor.count" + ProcessOpenFileDescriptorCountUnit = "{count}" + ProcessOpenFileDescriptorCountDescription = "Number of file descriptors in use by the process." + + // ProcessContextSwitches is the metric conforming to the + // "process.context_switches" semantic conventions. It represents the number of + // times the process has been context switched. + // Instrument: counter + // Unit: {count} + // Stability: Experimental + ProcessContextSwitchesName = "process.context_switches" + ProcessContextSwitchesUnit = "{count}" + ProcessContextSwitchesDescription = "Number of times the process has been context switched." + + // ProcessPagingFaults is the metric conforming to the "process.paging.faults" + // semantic conventions. It represents the number of page faults the process + // has made. + // Instrument: counter + // Unit: {fault} + // Stability: Experimental + ProcessPagingFaultsName = "process.paging.faults" + ProcessPagingFaultsUnit = "{fault}" + ProcessPagingFaultsDescription = "Number of page faults the process has made." + + // RPCServerDuration is the metric conforming to the "rpc.server.duration" + // semantic conventions. It represents the measures the duration of inbound + // RPC. + // Instrument: histogram + // Unit: ms + // Stability: Experimental + RPCServerDurationName = "rpc.server.duration" + RPCServerDurationUnit = "ms" + RPCServerDurationDescription = "Measures the duration of inbound RPC." + + // RPCServerRequestSize is the metric conforming to the + // "rpc.server.request.size" semantic conventions. It represents the measures + // the size of RPC request messages (uncompressed). + // Instrument: histogram + // Unit: By + // Stability: Experimental + RPCServerRequestSizeName = "rpc.server.request.size" + RPCServerRequestSizeUnit = "By" + RPCServerRequestSizeDescription = "Measures the size of RPC request messages (uncompressed)." + + // RPCServerResponseSize is the metric conforming to the + // "rpc.server.response.size" semantic conventions. It represents the measures + // the size of RPC response messages (uncompressed). + // Instrument: histogram + // Unit: By + // Stability: Experimental + RPCServerResponseSizeName = "rpc.server.response.size" + RPCServerResponseSizeUnit = "By" + RPCServerResponseSizeDescription = "Measures the size of RPC response messages (uncompressed)." + + // RPCServerRequestsPerRPC is the metric conforming to the + // "rpc.server.requests_per_rpc" semantic conventions. It represents the + // measures the number of messages received per RPC. + // Instrument: histogram + // Unit: {count} + // Stability: Experimental + RPCServerRequestsPerRPCName = "rpc.server.requests_per_rpc" + RPCServerRequestsPerRPCUnit = "{count}" + RPCServerRequestsPerRPCDescription = "Measures the number of messages received per RPC." + + // RPCServerResponsesPerRPC is the metric conforming to the + // "rpc.server.responses_per_rpc" semantic conventions. It represents the + // measures the number of messages sent per RPC. + // Instrument: histogram + // Unit: {count} + // Stability: Experimental + RPCServerResponsesPerRPCName = "rpc.server.responses_per_rpc" + RPCServerResponsesPerRPCUnit = "{count}" + RPCServerResponsesPerRPCDescription = "Measures the number of messages sent per RPC." + + // RPCClientDuration is the metric conforming to the "rpc.client.duration" + // semantic conventions. It represents the measures the duration of outbound + // RPC. + // Instrument: histogram + // Unit: ms + // Stability: Experimental + RPCClientDurationName = "rpc.client.duration" + RPCClientDurationUnit = "ms" + RPCClientDurationDescription = "Measures the duration of outbound RPC." + + // RPCClientRequestSize is the metric conforming to the + // "rpc.client.request.size" semantic conventions. It represents the measures + // the size of RPC request messages (uncompressed). + // Instrument: histogram + // Unit: By + // Stability: Experimental + RPCClientRequestSizeName = "rpc.client.request.size" + RPCClientRequestSizeUnit = "By" + RPCClientRequestSizeDescription = "Measures the size of RPC request messages (uncompressed)." + + // RPCClientResponseSize is the metric conforming to the + // "rpc.client.response.size" semantic conventions. It represents the measures + // the size of RPC response messages (uncompressed). + // Instrument: histogram + // Unit: By + // Stability: Experimental + RPCClientResponseSizeName = "rpc.client.response.size" + RPCClientResponseSizeUnit = "By" + RPCClientResponseSizeDescription = "Measures the size of RPC response messages (uncompressed)." + + // RPCClientRequestsPerRPC is the metric conforming to the + // "rpc.client.requests_per_rpc" semantic conventions. It represents the + // measures the number of messages received per RPC. + // Instrument: histogram + // Unit: {count} + // Stability: Experimental + RPCClientRequestsPerRPCName = "rpc.client.requests_per_rpc" + RPCClientRequestsPerRPCUnit = "{count}" + RPCClientRequestsPerRPCDescription = "Measures the number of messages received per RPC." + + // RPCClientResponsesPerRPC is the metric conforming to the + // "rpc.client.responses_per_rpc" semantic conventions. It represents the + // measures the number of messages sent per RPC. + // Instrument: histogram + // Unit: {count} + // Stability: Experimental + RPCClientResponsesPerRPCName = "rpc.client.responses_per_rpc" + RPCClientResponsesPerRPCUnit = "{count}" + RPCClientResponsesPerRPCDescription = "Measures the number of messages sent per RPC." + + // SystemCPUTime is the metric conforming to the "system.cpu.time" semantic + // conventions. It represents the seconds each logical CPU spent on each mode. + // Instrument: counter + // Unit: s + // Stability: Experimental + SystemCPUTimeName = "system.cpu.time" + SystemCPUTimeUnit = "s" + SystemCPUTimeDescription = "Seconds each logical CPU spent on each mode" + + // SystemCPUUtilization is the metric conforming to the + // "system.cpu.utilization" semantic conventions. It represents the difference + // in system.cpu.time since the last measurement, divided by the elapsed time + // and number of logical CPUs. + // Instrument: gauge + // Unit: 1 + // Stability: Experimental + SystemCPUUtilizationName = "system.cpu.utilization" + SystemCPUUtilizationUnit = "1" + SystemCPUUtilizationDescription = "Difference in system.cpu.time since the last measurement, divided by the elapsed time and number of logical CPUs" + + // SystemCPUFrequency is the metric conforming to the "system.cpu.frequency" + // semantic conventions. It represents the reports the current frequency of the + // CPU in Hz. + // Instrument: gauge + // Unit: {Hz} + // Stability: Experimental + SystemCPUFrequencyName = "system.cpu.frequency" + SystemCPUFrequencyUnit = "{Hz}" + SystemCPUFrequencyDescription = "Reports the current frequency of the CPU in Hz" + + // SystemCPUPhysicalCount is the metric conforming to the + // "system.cpu.physical.count" semantic conventions. It represents the reports + // the number of actual physical processor cores on the hardware. + // Instrument: updowncounter + // Unit: {cpu} + // Stability: Experimental + SystemCPUPhysicalCountName = "system.cpu.physical.count" + SystemCPUPhysicalCountUnit = "{cpu}" + SystemCPUPhysicalCountDescription = "Reports the number of actual physical processor cores on the hardware" + + // SystemCPULogicalCount is the metric conforming to the + // "system.cpu.logical.count" semantic conventions. It represents the reports + // the number of logical (virtual) processor cores created by the operating + // system to manage multitasking. + // Instrument: updowncounter + // Unit: {cpu} + // Stability: Experimental + SystemCPULogicalCountName = "system.cpu.logical.count" + SystemCPULogicalCountUnit = "{cpu}" + SystemCPULogicalCountDescription = "Reports the number of logical (virtual) processor cores created by the operating system to manage multitasking" + + // SystemMemoryUsage is the metric conforming to the "system.memory.usage" + // semantic conventions. It represents the reports memory in use by state. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + SystemMemoryUsageName = "system.memory.usage" + SystemMemoryUsageUnit = "By" + SystemMemoryUsageDescription = "Reports memory in use by state." + + // SystemMemoryLimit is the metric conforming to the "system.memory.limit" + // semantic conventions. It represents the total memory available in the + // system. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + SystemMemoryLimitName = "system.memory.limit" + SystemMemoryLimitUnit = "By" + SystemMemoryLimitDescription = "Total memory available in the system." + + // SystemMemoryShared is the metric conforming to the "system.memory.shared" + // semantic conventions. It represents the shared memory used (mostly by + // tmpfs). + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + SystemMemorySharedName = "system.memory.shared" + SystemMemorySharedUnit = "By" + SystemMemorySharedDescription = "Shared memory used (mostly by tmpfs)." + + // SystemMemoryUtilization is the metric conforming to the + // "system.memory.utilization" semantic conventions. + // Instrument: gauge + // Unit: 1 + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemMemoryUtilizationName = "system.memory.utilization" + SystemMemoryUtilizationUnit = "1" + + // SystemPagingUsage is the metric conforming to the "system.paging.usage" + // semantic conventions. It represents the unix swap or windows pagefile usage. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + SystemPagingUsageName = "system.paging.usage" + SystemPagingUsageUnit = "By" + SystemPagingUsageDescription = "Unix swap or windows pagefile usage" + + // SystemPagingUtilization is the metric conforming to the + // "system.paging.utilization" semantic conventions. + // Instrument: gauge + // Unit: 1 + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemPagingUtilizationName = "system.paging.utilization" + SystemPagingUtilizationUnit = "1" + + // SystemPagingFaults is the metric conforming to the "system.paging.faults" + // semantic conventions. + // Instrument: counter + // Unit: {fault} + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemPagingFaultsName = "system.paging.faults" + SystemPagingFaultsUnit = "{fault}" + + // SystemPagingOperations is the metric conforming to the + // "system.paging.operations" semantic conventions. + // Instrument: counter + // Unit: {operation} + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemPagingOperationsName = "system.paging.operations" + SystemPagingOperationsUnit = "{operation}" + + // SystemDiskIo is the metric conforming to the "system.disk.io" semantic + // conventions. + // Instrument: counter + // Unit: By + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemDiskIoName = "system.disk.io" + SystemDiskIoUnit = "By" + + // SystemDiskOperations is the metric conforming to the + // "system.disk.operations" semantic conventions. + // Instrument: counter + // Unit: {operation} + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemDiskOperationsName = "system.disk.operations" + SystemDiskOperationsUnit = "{operation}" + + // SystemDiskIoTime is the metric conforming to the "system.disk.io_time" + // semantic conventions. It represents the time disk spent activated. + // Instrument: counter + // Unit: s + // Stability: Experimental + SystemDiskIoTimeName = "system.disk.io_time" + SystemDiskIoTimeUnit = "s" + SystemDiskIoTimeDescription = "Time disk spent activated" + + // SystemDiskOperationTime is the metric conforming to the + // "system.disk.operation_time" semantic conventions. It represents the sum of + // the time each operation took to complete. + // Instrument: counter + // Unit: s + // Stability: Experimental + SystemDiskOperationTimeName = "system.disk.operation_time" + SystemDiskOperationTimeUnit = "s" + SystemDiskOperationTimeDescription = "Sum of the time each operation took to complete" + + // SystemDiskMerged is the metric conforming to the "system.disk.merged" + // semantic conventions. + // Instrument: counter + // Unit: {operation} + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemDiskMergedName = "system.disk.merged" + SystemDiskMergedUnit = "{operation}" + + // SystemFilesystemUsage is the metric conforming to the + // "system.filesystem.usage" semantic conventions. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemFilesystemUsageName = "system.filesystem.usage" + SystemFilesystemUsageUnit = "By" + + // SystemFilesystemUtilization is the metric conforming to the + // "system.filesystem.utilization" semantic conventions. + // Instrument: gauge + // Unit: 1 + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemFilesystemUtilizationName = "system.filesystem.utilization" + SystemFilesystemUtilizationUnit = "1" + + // SystemNetworkDropped is the metric conforming to the + // "system.network.dropped" semantic conventions. It represents the count of + // packets that are dropped or discarded even though there was no error. + // Instrument: counter + // Unit: {packet} + // Stability: Experimental + SystemNetworkDroppedName = "system.network.dropped" + SystemNetworkDroppedUnit = "{packet}" + SystemNetworkDroppedDescription = "Count of packets that are dropped or discarded even though there was no error" + + // SystemNetworkPackets is the metric conforming to the + // "system.network.packets" semantic conventions. + // Instrument: counter + // Unit: {packet} + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemNetworkPacketsName = "system.network.packets" + SystemNetworkPacketsUnit = "{packet}" + + // SystemNetworkErrors is the metric conforming to the "system.network.errors" + // semantic conventions. It represents the count of network errors detected. + // Instrument: counter + // Unit: {error} + // Stability: Experimental + SystemNetworkErrorsName = "system.network.errors" + SystemNetworkErrorsUnit = "{error}" + SystemNetworkErrorsDescription = "Count of network errors detected" + + // SystemNetworkIo is the metric conforming to the "system.network.io" semantic + // conventions. + // Instrument: counter + // Unit: By + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemNetworkIoName = "system.network.io" + SystemNetworkIoUnit = "By" + + // SystemNetworkConnections is the metric conforming to the + // "system.network.connections" semantic conventions. + // Instrument: updowncounter + // Unit: {connection} + // Stability: Experimental + // NOTE: The description (brief) for this metric is not defined in the semantic-conventions repository. + SystemNetworkConnectionsName = "system.network.connections" + SystemNetworkConnectionsUnit = "{connection}" + + // SystemProcessCount is the metric conforming to the "system.process.count" + // semantic conventions. It represents the total number of processes in each + // state. + // Instrument: updowncounter + // Unit: {process} + // Stability: Experimental + SystemProcessCountName = "system.process.count" + SystemProcessCountUnit = "{process}" + SystemProcessCountDescription = "Total number of processes in each state" + + // SystemProcessCreated is the metric conforming to the + // "system.process.created" semantic conventions. It represents the total + // number of processes created over uptime of the host. + // Instrument: counter + // Unit: {process} + // Stability: Experimental + SystemProcessCreatedName = "system.process.created" + SystemProcessCreatedUnit = "{process}" + SystemProcessCreatedDescription = "Total number of processes created over uptime of the host" + + // SystemLinuxMemoryAvailable is the metric conforming to the + // "system.linux.memory.available" semantic conventions. It represents an + // estimate of how much memory is available for starting new applications, + // without causing swapping. + // Instrument: updowncounter + // Unit: By + // Stability: Experimental + SystemLinuxMemoryAvailableName = "system.linux.memory.available" + SystemLinuxMemoryAvailableUnit = "By" + SystemLinuxMemoryAvailableDescription = "An estimate of how much memory is available for starting new applications, without causing swapping" +) diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/schema.go b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/schema.go new file mode 100644 index 0000000000..4c87c7adcc --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.26.0/schema.go @@ -0,0 +1,9 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package semconv // import "go.opentelemetry.io/otel/semconv/v1.26.0" + +// SchemaURL is the schema URL that matches the version of the semantic conventions +// that this package defines. Semconv packages starting from v1.4.0 must declare +// non-empty schema URL in the form https://opentelemetry.io/schemas/ +const SchemaURL = "https://opentelemetry.io/schemas/1.26.0" diff --git a/vendor/go.opentelemetry.io/otel/trace/config.go b/vendor/go.opentelemetry.io/otel/trace/config.go index 273d58e001..9c0b720a4d 100644 --- a/vendor/go.opentelemetry.io/otel/trace/config.go +++ b/vendor/go.opentelemetry.io/otel/trace/config.go @@ -213,7 +213,7 @@ var _ SpanStartEventOption = attributeOption{} // WithAttributes adds the attributes related to a span life-cycle event. // These attributes are used to describe the work a Span represents when this -// option is provided to a Span's start or end events. Otherwise, these +// option is provided to a Span's start event. Otherwise, these // attributes provide additional information about the event being recorded // (e.g. error, state change, processing progress, system event). // diff --git a/vendor/go.opentelemetry.io/otel/trace/noop/README.md b/vendor/go.opentelemetry.io/otel/trace/noop/README.md new file mode 100644 index 0000000000..cd382c82a1 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/trace/noop/README.md @@ -0,0 +1,3 @@ +# Trace Noop + +[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/trace/noop)](https://pkg.go.dev/go.opentelemetry.io/otel/trace/noop) diff --git a/vendor/go.opentelemetry.io/otel/trace/noop/noop.go b/vendor/go.opentelemetry.io/otel/trace/noop/noop.go new file mode 100644 index 0000000000..64a4f1b362 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/trace/noop/noop.go @@ -0,0 +1,112 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package noop provides an implementation of the OpenTelemetry trace API that +// produces no telemetry and minimizes used computation resources. +// +// Using this package to implement the OpenTelemetry trace API will effectively +// disable OpenTelemetry. +// +// This implementation can be embedded in other implementations of the +// OpenTelemetry trace API. Doing so will mean the implementation defaults to +// no operation for methods it does not implement. +package noop // import "go.opentelemetry.io/otel/trace/noop" + +import ( + "context" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/embedded" +) + +var ( + // Compile-time check this implements the OpenTelemetry API. + + _ trace.TracerProvider = TracerProvider{} + _ trace.Tracer = Tracer{} + _ trace.Span = Span{} +) + +// TracerProvider is an OpenTelemetry No-Op TracerProvider. +type TracerProvider struct{ embedded.TracerProvider } + +// NewTracerProvider returns a TracerProvider that does not record any telemetry. +func NewTracerProvider() TracerProvider { + return TracerProvider{} +} + +// Tracer returns an OpenTelemetry Tracer that does not record any telemetry. +func (TracerProvider) Tracer(string, ...trace.TracerOption) trace.Tracer { + return Tracer{} +} + +// Tracer is an OpenTelemetry No-Op Tracer. +type Tracer struct{ embedded.Tracer } + +// Start creates a span. The created span will be set in a child context of ctx +// and returned with the span. +// +// If ctx contains a span context, the returned span will also contain that +// span context. If the span context in ctx is for a non-recording span, that +// span instance will be returned directly. +func (t Tracer) Start(ctx context.Context, _ string, _ ...trace.SpanStartOption) (context.Context, trace.Span) { + span := trace.SpanFromContext(ctx) + + // If the parent context contains a non-zero span context, that span + // context needs to be returned as a non-recording span + // (https://github.com/open-telemetry/opentelemetry-specification/blob/3a1dde966a4ce87cce5adf464359fe369741bbea/specification/trace/api.md#behavior-of-the-api-in-the-absence-of-an-installed-sdk). + var zeroSC trace.SpanContext + if sc := span.SpanContext(); !sc.Equal(zeroSC) { + if !span.IsRecording() { + // If the span is not recording return it directly. + return ctx, span + } + // Otherwise, return the span context needs in a non-recording span. + span = Span{sc: sc} + } else { + // No parent, return a No-Op span with an empty span context. + span = noopSpanInstance + } + return trace.ContextWithSpan(ctx, span), span +} + +var noopSpanInstance trace.Span = Span{} + +// Span is an OpenTelemetry No-Op Span. +type Span struct { + embedded.Span + + sc trace.SpanContext +} + +// SpanContext returns an empty span context. +func (s Span) SpanContext() trace.SpanContext { return s.sc } + +// IsRecording always returns false. +func (Span) IsRecording() bool { return false } + +// SetStatus does nothing. +func (Span) SetStatus(codes.Code, string) {} + +// SetAttributes does nothing. +func (Span) SetAttributes(...attribute.KeyValue) {} + +// End does nothing. +func (Span) End(...trace.SpanEndOption) {} + +// RecordError does nothing. +func (Span) RecordError(error, ...trace.EventOption) {} + +// AddEvent does nothing. +func (Span) AddEvent(string, ...trace.EventOption) {} + +// AddLink does nothing. +func (Span) AddLink(trace.Link) {} + +// SetName does nothing. +func (Span) SetName(string) {} + +// TracerProvider returns a No-Op TracerProvider. +func (Span) TracerProvider() trace.TracerProvider { return TracerProvider{} } diff --git a/vendor/go.opentelemetry.io/otel/version.go b/vendor/go.opentelemetry.io/otel/version.go index 59e2481613..fb7d12673e 100644 --- a/vendor/go.opentelemetry.io/otel/version.go +++ b/vendor/go.opentelemetry.io/otel/version.go @@ -5,5 +5,5 @@ package otel // import "go.opentelemetry.io/otel" // Version is the current release version of OpenTelemetry in use. func Version() string { - return "1.32.0" + return "1.33.0" } diff --git a/vendor/go.opentelemetry.io/otel/versions.yaml b/vendor/go.opentelemetry.io/otel/versions.yaml index c04b12f6b7..9f878cd1fe 100644 --- a/vendor/go.opentelemetry.io/otel/versions.yaml +++ b/vendor/go.opentelemetry.io/otel/versions.yaml @@ -3,7 +3,7 @@ module-sets: stable-v1: - version: v1.32.0 + version: v1.33.0 modules: - go.opentelemetry.io/otel - go.opentelemetry.io/otel/bridge/opencensus @@ -23,11 +23,11 @@ module-sets: - go.opentelemetry.io/otel/sdk/metric - go.opentelemetry.io/otel/trace experimental-metrics: - version: v0.54.0 + version: v0.55.0 modules: - go.opentelemetry.io/otel/exporters/prometheus experimental-logs: - version: v0.8.0 + version: v0.9.0 modules: - go.opentelemetry.io/otel/log - go.opentelemetry.io/otel/sdk/log @@ -35,7 +35,7 @@ module-sets: - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp - go.opentelemetry.io/otel/exporters/stdout/stdoutlog experimental-schema: - version: v0.0.11 + version: v0.0.12 modules: - go.opentelemetry.io/otel/schema excluded-modules: diff --git a/vendor/golang.org/x/crypto/pkcs12/crypto.go b/vendor/golang.org/x/crypto/pkcs12/crypto.go index 96f4a1a56e..212538cb5a 100644 --- a/vendor/golang.org/x/crypto/pkcs12/crypto.go +++ b/vendor/golang.org/x/crypto/pkcs12/crypto.go @@ -26,7 +26,7 @@ type pbeCipher interface { create(key []byte) (cipher.Block, error) // deriveKey returns a key derived from the given password and salt. deriveKey(salt, password []byte, iterations int) []byte - // deriveKey returns an IV derived from the given password and salt. + // deriveIV returns an IV derived from the given password and salt. deriveIV(salt, password []byte, iterations int) []byte } diff --git a/vendor/golang.org/x/net/http2/config.go b/vendor/golang.org/x/net/http2/config.go index de58dfb8dc..ca645d9a1a 100644 --- a/vendor/golang.org/x/net/http2/config.go +++ b/vendor/golang.org/x/net/http2/config.go @@ -60,7 +60,7 @@ func configFromServer(h1 *http.Server, h2 *Server) http2Config { return conf } -// configFromServer merges configuration settings from h2 and h2.t1.HTTP2 +// configFromTransport merges configuration settings from h2 and h2.t1.HTTP2 // (the net/http Transport). func configFromTransport(h2 *Transport) http2Config { conf := http2Config{ diff --git a/vendor/golang.org/x/net/http2/config_go124.go b/vendor/golang.org/x/net/http2/config_go124.go index e3784123c8..5b516c55ff 100644 --- a/vendor/golang.org/x/net/http2/config_go124.go +++ b/vendor/golang.org/x/net/http2/config_go124.go @@ -13,7 +13,7 @@ func fillNetHTTPServerConfig(conf *http2Config, srv *http.Server) { fillNetHTTPConfig(conf, srv.HTTP2) } -// fillNetHTTPServerConfig sets fields in conf from tr.HTTP2. +// fillNetHTTPTransportConfig sets fields in conf from tr.HTTP2. func fillNetHTTPTransportConfig(conf *http2Config, tr *http.Transport) { fillNetHTTPConfig(conf, tr.HTTP2) } diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 090d0e1bdb..b2e2ed3373 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -375,6 +375,7 @@ type ClientConn struct { doNotReuse bool // whether conn is marked to not be reused for any future requests closing bool closed bool + closedOnIdle bool // true if conn was closed for idleness seenSettings bool // true if we've seen a settings frame, false otherwise seenSettingsChan chan struct{} // closed when seenSettings is true or frame reading fails wantSettingsAck bool // we sent a SETTINGS frame and haven't heard back @@ -1089,10 +1090,12 @@ func (cc *ClientConn) idleStateLocked() (st clientConnIdleState) { // If this connection has never been used for a request and is closed, // then let it take a request (which will fail). + // If the conn was closed for idleness, we're racing the idle timer; + // don't try to use the conn. (Issue #70515.) // // This avoids a situation where an error early in a connection's lifetime // goes unreported. - if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed { + if cc.nextStreamID == 1 && cc.streamsReserved == 0 && cc.closed && !cc.closedOnIdle { st.canTakeNewRequest = true } @@ -1155,6 +1158,7 @@ func (cc *ClientConn) closeIfIdle() { return } cc.closed = true + cc.closedOnIdle = true nextID := cc.nextStreamID // TODO: do clients send GOAWAY too? maybe? Just Close: cc.mu.Unlock() @@ -2434,9 +2438,12 @@ func (rl *clientConnReadLoop) cleanup() { // This avoids a situation where new connections are constantly created, // added to the pool, fail, and are removed from the pool, without any error // being surfaced to the user. - const unusedWaitTime = 5 * time.Second + unusedWaitTime := 5 * time.Second + if cc.idleTimeout > 0 && unusedWaitTime > cc.idleTimeout { + unusedWaitTime = cc.idleTimeout + } idleTime := cc.t.now().Sub(cc.lastActive) - if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime { + if atomic.LoadUint32(&cc.atomicReused) == 0 && idleTime < unusedWaitTime && !cc.closedOnIdle { cc.idleTimer = cc.t.afterFunc(unusedWaitTime-idleTime, func() { cc.t.connPool().MarkDead(cc) }) diff --git a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go index 97cb916f2c..be8c002070 100644 --- a/vendor/golang.org/x/sys/unix/syscall_dragonfly.go +++ b/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -246,6 +246,18 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e return sendfile(outfd, infd, offset, count) } +func Dup3(oldfd, newfd, flags int) error { + if oldfd == newfd || flags&^O_CLOEXEC != 0 { + return EINVAL + } + how := F_DUP2FD + if flags&O_CLOEXEC != 0 { + how = F_DUP2FD_CLOEXEC + } + _, err := fcntl(oldfd, how, newfd) + return err +} + /* * Exposed directly */ diff --git a/vendor/golang.org/x/sys/windows/dll_windows.go b/vendor/golang.org/x/sys/windows/dll_windows.go index 4e613cf633..3ca814f54d 100644 --- a/vendor/golang.org/x/sys/windows/dll_windows.go +++ b/vendor/golang.org/x/sys/windows/dll_windows.go @@ -43,8 +43,8 @@ type DLL struct { // LoadDLL loads DLL file into memory. // // Warning: using LoadDLL without an absolute path name is subject to -// DLL preloading attacks. To safely load a system DLL, use LazyDLL -// with System set to true, or use LoadLibraryEx directly. +// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL], +// or use [LoadLibraryEx] directly. func LoadDLL(name string) (dll *DLL, err error) { namep, err := UTF16PtrFromString(name) if err != nil { @@ -271,6 +271,9 @@ func (d *LazyDLL) NewProc(name string) *LazyProc { } // NewLazyDLL creates new LazyDLL associated with DLL file. +// +// Warning: using NewLazyDLL without an absolute path name is subject to +// DLL preloading attacks. To safely load a system DLL, use [NewLazySystemDLL]. func NewLazyDLL(name string) *LazyDLL { return &LazyDLL{Name: name} } @@ -410,7 +413,3 @@ func loadLibraryEx(name string, system bool) (*DLL, error) { } return &DLL{Name: name, Handle: h}, nil } - -type errString string - -func (s errString) Error() string { return string(s) } diff --git a/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go b/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go index aa69fb4d50..4a9fce53c4 100644 --- a/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go +++ b/vendor/google.golang.org/genproto/googleapis/api/annotations/client.pb.go @@ -180,6 +180,8 @@ type CommonLanguageSettings struct { ReferenceDocsUri string `protobuf:"bytes,1,opt,name=reference_docs_uri,json=referenceDocsUri,proto3" json:"reference_docs_uri,omitempty"` // The destination where API teams want this client library to be published. Destinations []ClientLibraryDestination `protobuf:"varint,2,rep,packed,name=destinations,proto3,enum=google.api.ClientLibraryDestination" json:"destinations,omitempty"` + // Configuration for which RPCs should be generated in the GAPIC client. + SelectiveGapicGeneration *SelectiveGapicGeneration `protobuf:"bytes,3,opt,name=selective_gapic_generation,json=selectiveGapicGeneration,proto3" json:"selective_gapic_generation,omitempty"` } func (x *CommonLanguageSettings) Reset() { @@ -229,6 +231,13 @@ func (x *CommonLanguageSettings) GetDestinations() []ClientLibraryDestination { return nil } +func (x *CommonLanguageSettings) GetSelectiveGapicGeneration() *SelectiveGapicGeneration { + if x != nil { + return x.SelectiveGapicGeneration + } + return nil +} + // Details about how and where to publish client libraries. type ClientLibrarySettings struct { state protoimpl.MessageState @@ -984,6 +993,16 @@ type GoSettings struct { // Some settings. Common *CommonLanguageSettings `protobuf:"bytes,1,opt,name=common,proto3" json:"common,omitempty"` + // Map of service names to renamed services. Keys are the package relative + // service names and values are the name to be used for the service client + // and call options. + // + // publishing: + // + // go_settings: + // renamed_services: + // Publisher: TopicAdmin + RenamedServices map[string]string `protobuf:"bytes,2,rep,name=renamed_services,json=renamedServices,proto3" json:"renamed_services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *GoSettings) Reset() { @@ -1025,6 +1044,13 @@ func (x *GoSettings) GetCommon() *CommonLanguageSettings { return nil } +func (x *GoSettings) GetRenamedServices() map[string]string { + if x != nil { + return x.RenamedServices + } + return nil +} + // Describes the generator configuration for a method. type MethodSettings struct { state protoimpl.MessageState @@ -1123,6 +1149,57 @@ func (x *MethodSettings) GetAutoPopulatedFields() []string { return nil } +// This message is used to configure the generation of a subset of the RPCs in +// a service for client libraries. +type SelectiveGapicGeneration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // An allowlist of the fully qualified names of RPCs that should be included + // on public client surfaces. + Methods []string `protobuf:"bytes,1,rep,name=methods,proto3" json:"methods,omitempty"` +} + +func (x *SelectiveGapicGeneration) Reset() { + *x = SelectiveGapicGeneration{} + if protoimpl.UnsafeEnabled { + mi := &file_google_api_client_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SelectiveGapicGeneration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SelectiveGapicGeneration) ProtoMessage() {} + +func (x *SelectiveGapicGeneration) ProtoReflect() protoreflect.Message { + mi := &file_google_api_client_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SelectiveGapicGeneration.ProtoReflect.Descriptor instead. +func (*SelectiveGapicGeneration) Descriptor() ([]byte, []int) { + return file_google_api_client_proto_rawDescGZIP(), []int{12} +} + +func (x *SelectiveGapicGeneration) GetMethods() []string { + if x != nil { + return x.Methods + } + return nil +} + // Experimental features to be included during client library generation. // These fields will be deprecated once the feature graduates and is enabled // by default. @@ -1136,12 +1213,17 @@ type PythonSettings_ExperimentalFeatures struct { // This feature will be enabled by default 1 month after launching the // feature in preview packages. RestAsyncIoEnabled bool `protobuf:"varint,1,opt,name=rest_async_io_enabled,json=restAsyncIoEnabled,proto3" json:"rest_async_io_enabled,omitempty"` + // Enables generation of protobuf code using new types that are more + // Pythonic which are included in `protobuf>=5.29.x`. This feature will be + // enabled by default 1 month after launching the feature in preview + // packages. + ProtobufPythonicTypesEnabled bool `protobuf:"varint,2,opt,name=protobuf_pythonic_types_enabled,json=protobufPythonicTypesEnabled,proto3" json:"protobuf_pythonic_types_enabled,omitempty"` } func (x *PythonSettings_ExperimentalFeatures) Reset() { *x = PythonSettings_ExperimentalFeatures{} if protoimpl.UnsafeEnabled { - mi := &file_google_api_client_proto_msgTypes[13] + mi := &file_google_api_client_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1154,7 +1236,7 @@ func (x *PythonSettings_ExperimentalFeatures) String() string { func (*PythonSettings_ExperimentalFeatures) ProtoMessage() {} func (x *PythonSettings_ExperimentalFeatures) ProtoReflect() protoreflect.Message { - mi := &file_google_api_client_proto_msgTypes[13] + mi := &file_google_api_client_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1177,6 +1259,13 @@ func (x *PythonSettings_ExperimentalFeatures) GetRestAsyncIoEnabled() bool { return false } +func (x *PythonSettings_ExperimentalFeatures) GetProtobufPythonicTypesEnabled() bool { + if x != nil { + return x.ProtobufPythonicTypesEnabled + } + return false +} + // Describes settings to use when generating API methods that use the // long-running operation pattern. // All default values below are from those used in the client library @@ -1205,7 +1294,7 @@ type MethodSettings_LongRunning struct { func (x *MethodSettings_LongRunning) Reset() { *x = MethodSettings_LongRunning{} if protoimpl.UnsafeEnabled { - mi := &file_google_api_client_proto_msgTypes[16] + mi := &file_google_api_client_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1218,7 +1307,7 @@ func (x *MethodSettings_LongRunning) String() string { func (*MethodSettings_LongRunning) ProtoMessage() {} func (x *MethodSettings_LongRunning) ProtoReflect() protoreflect.Message { - mi := &file_google_api_client_proto_msgTypes[16] + mi := &file_google_api_client_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1406,7 +1495,7 @@ var file_google_api_client_proto_rawDesc = []byte{ 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf8, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x12, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, @@ -1415,251 +1504,275 @@ var file_google_api_client_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x05, - 0x0a, 0x15, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x3a, 0x0a, 0x0c, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x52, 0x0b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, - 0x12, 0x72, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x65, 0x6e, - 0x75, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, 0x65, 0x73, 0x74, 0x4e, - 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x6a, - 0x61, 0x76, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x15, 0x20, 0x01, + 0x0c, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x62, 0x0a, + 0x1a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x61, 0x70, 0x69, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x61, 0x70, 0x69, 0x63, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x47, 0x61, 0x70, 0x69, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x93, 0x05, 0x0a, 0x15, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x72, + 0x61, 0x72, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x0c, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x5f, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x52, 0x0b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x53, 0x74, 0x61, 0x67, + 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, + 0x63, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x72, + 0x65, 0x73, 0x74, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x12, + 0x3d, 0x0a, 0x0d, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x61, 0x76, 0x61, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, + 0x0a, 0x0c, 0x63, 0x70, 0x70, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x70, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x63, + 0x70, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x70, 0x68, + 0x70, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x68, + 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x70, 0x68, 0x70, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0f, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, + 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x79, 0x74, + 0x68, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0e, 0x70, 0x79, 0x74, + 0x68, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4a, 0x61, 0x76, 0x61, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6a, 0x61, - 0x76, 0x61, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x63, 0x70, - 0x70, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x70, - 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x63, 0x70, 0x70, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x70, 0x68, 0x70, 0x5f, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x68, 0x70, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x70, 0x68, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0f, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0e, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0f, 0x64, 0x6f, 0x74, 0x6e, 0x65, 0x74, - 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x74, - 0x6e, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0e, 0x64, 0x6f, 0x74, - 0x6e, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3d, 0x0a, 0x0d, 0x72, - 0x75, 0x62, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1b, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x52, 0x75, 0x62, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x72, 0x75, - 0x62, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x67, 0x6f, - 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x6f, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0a, 0x67, 0x6f, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x22, 0xf4, 0x04, 0x0a, 0x0a, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x69, - 0x6e, 0x67, 0x12, 0x43, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x69, - 0x73, 0x73, 0x75, 0x65, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x6e, 0x65, 0x77, 0x49, 0x73, 0x73, 0x75, 0x65, 0x55, 0x72, 0x69, 0x12, 0x2b, 0x0a, 0x11, 0x64, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x69, - 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x69, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x70, 0x69, 0x5f, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x61, 0x70, 0x69, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x68, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x64, 0x65, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x5f, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x69, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x14, 0x63, 0x6f, 0x64, 0x65, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x47, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x64, 0x6f, 0x63, 0x5f, 0x74, - 0x61, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x64, 0x6f, 0x63, 0x54, 0x61, 0x67, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x49, 0x0a, - 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x6b, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x10, 0x6c, 0x69, 0x62, 0x72, - 0x61, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x6d, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x49, 0x0a, 0x21, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x5f, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x6e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, - 0x69, 0x12, 0x47, 0x0a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x72, 0x65, 0x73, - 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x69, 0x22, 0x9a, 0x02, 0x0a, 0x0c, 0x4a, - 0x61, 0x76, 0x61, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6c, - 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x12, 0x5f, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, - 0x61, 0x76, 0x61, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6e, 0x6f, + 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0f, 0x64, 0x6f, + 0x74, 0x6e, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x44, 0x6f, 0x74, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x0e, 0x64, 0x6f, 0x74, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x3d, 0x0a, 0x0d, 0x72, 0x75, 0x62, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x62, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x0c, 0x72, 0x75, 0x62, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x37, + 0x0a, 0x0b, 0x67, 0x6f, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x1c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x6f, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0a, 0x67, 0x6f, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xf4, 0x04, 0x0a, 0x0a, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x12, 0x43, 0x0a, 0x0f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0e, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6e, + 0x65, 0x77, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x65, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x49, 0x73, 0x73, 0x75, 0x65, 0x55, 0x72, 0x69, 0x12, + 0x2b, 0x0a, 0x11, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x75, 0x72, 0x69, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x69, 0x12, 0x24, 0x0a, 0x0e, + 0x61, 0x70, 0x69, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x67, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x70, 0x69, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x18, 0x68, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x6f, 0x64, 0x65, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, + 0x69, 0x20, 0x03, 0x28, 0x09, 0x52, 0x14, 0x63, 0x6f, 0x64, 0x65, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x47, 0x69, 0x74, 0x68, 0x75, 0x62, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x64, + 0x6f, 0x63, 0x5f, 0x74, 0x61, 0x67, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x6a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x6f, 0x63, 0x54, 0x61, 0x67, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x12, 0x49, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x72, 0x61, + 0x72, 0x79, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x10, + 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x6d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0f, 0x6c, 0x69, 0x62, 0x72, 0x61, + 0x72, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x49, 0x0a, 0x21, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x69, 0x18, + 0x6e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x72, 0x69, 0x12, 0x47, 0x0a, 0x20, 0x72, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x1d, 0x72, 0x65, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x69, 0x22, 0x9a, + 0x02, 0x0a, 0x0c, 0x4a, 0x61, 0x76, 0x61, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x27, 0x0a, 0x0f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x5f, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x4a, 0x61, 0x76, 0x61, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, + 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x44, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x49, 0x0a, 0x0b, 0x43, + 0x70, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x49, 0x0a, 0x0b, 0x50, 0x68, 0x70, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x1a, 0x44, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x70, 0x70, 0x53, 0x65, + 0x6e, 0x22, 0xc5, 0x02, 0x0a, 0x0e, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x12, 0x64, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, + 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x79, 0x74, + 0x68, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x45, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x1a, 0x90, 0x01, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x31, 0x0a, 0x15, 0x72, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x6f, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, + 0x72, 0x65, 0x73, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x49, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x45, 0x0a, 0x1f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x5f, 0x70, + 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x69, 0x63, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5f, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1c, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x69, 0x63, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x4a, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, + 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x44, 0x6f, 0x74, 0x6e, 0x65, 0x74, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, 0x67, + 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x10, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x74, 0x6e, + 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x12, 0x5d, 0x0a, 0x11, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x74, 0x6e, 0x65, 0x74, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x72, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, + 0x2b, 0x0a, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x69, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x41, + 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x68, 0x61, 0x6e, 0x64, 0x77, 0x72, + 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, 0x77, 0x72, 0x69, 0x74, + 0x74, 0x65, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x1a, 0x42, 0x0a, + 0x14, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x0c, 0x52, 0x75, 0x62, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x22, 0x49, 0x0a, 0x0b, 0x50, 0x68, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x6f, 0x6e, 0x22, 0xe4, 0x01, 0x0a, 0x0a, 0x47, 0x6f, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0xfd, 0x01, - 0x0a, 0x0e, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x15, - 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x14, 0x65, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x1a, 0x49, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x72, 0x65, - 0x73, 0x74, 0x5f, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x6f, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x72, 0x65, 0x73, 0x74, 0x41, - 0x73, 0x79, 0x6e, 0x63, 0x49, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x4a, 0x0a, - 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, - 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x44, 0x6f, - 0x74, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x10, 0x72, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x44, 0x6f, 0x74, 0x6e, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x5d, 0x0a, 0x11, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x74, - 0x6e, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x10, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x5f, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, - 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x12, 0x38, 0x0a, 0x18, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x16, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x68, 0x61, - 0x6e, 0x64, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x68, 0x61, 0x6e, 0x64, - 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x43, 0x0a, 0x15, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x0c, 0x52, 0x75, - 0x62, 0x79, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, - 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x48, 0x0a, 0x0a, 0x47, 0x6f, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x22, 0xc2, 0x03, 0x0a, 0x0e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x49, 0x0a, 0x0c, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x2e, 0x4c, 0x6f, 0x6e, 0x67, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x6c, - 0x6f, 0x6e, 0x67, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x75, - 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x61, 0x75, 0x74, 0x6f, 0x50, - 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x94, - 0x02, 0x0a, 0x0b, 0x4c, 0x6f, 0x6e, 0x67, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x47, - 0x0a, 0x12, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x6c, 0x6c, 0x5f, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x50, 0x6f, - 0x6c, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x6f, 0x6c, 0x6c, 0x5f, - 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x70, 0x6f, 0x6c, 0x6c, 0x44, 0x65, 0x6c, 0x61, - 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x6d, - 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x56, 0x0a, + 0x10, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x6f, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc2, 0x03, 0x0a, 0x0e, 0x4d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x49, 0x0a, 0x0c, 0x6c, 0x6f, 0x6e, 0x67, + 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x4c, 0x6f, 0x6e, 0x67, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x6c, 0x6f, 0x6e, 0x67, 0x52, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x70, 0x6f, 0x70, 0x75, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x13, 0x61, 0x75, 0x74, 0x6f, 0x50, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x94, 0x02, 0x0a, 0x0b, 0x4c, 0x6f, 0x6e, 0x67, + 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x47, 0x0a, 0x12, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, - 0x6d, 0x61, 0x78, 0x50, 0x6f, 0x6c, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x47, 0x0a, 0x12, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x2a, 0xa3, 0x01, 0x0a, 0x19, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, - 0x44, 0x53, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x48, 0x4f, 0x54, 0x4f, 0x53, 0x10, 0x03, - 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x52, 0x45, 0x45, 0x54, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x10, - 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x48, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, - 0x07, 0x0a, 0x03, 0x47, 0x45, 0x4f, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x45, 0x4e, 0x45, - 0x52, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x41, 0x49, 0x10, 0x07, 0x2a, 0x67, 0x0a, 0x18, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x44, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x4c, 0x49, 0x45, 0x4e, - 0x54, 0x5f, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x5f, 0x44, 0x45, 0x53, 0x54, 0x49, 0x4e, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x10, 0x0a, 0x12, - 0x13, 0x0a, 0x0f, 0x50, 0x41, 0x43, 0x4b, 0x41, 0x47, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, - 0x45, 0x52, 0x10, 0x14, 0x3a, 0x4a, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x3a, 0x43, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, - 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x99, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x43, 0x0a, 0x0c, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, - 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9a, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, - 0x61, 0x75, 0x74, 0x68, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, - 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xc1, 0xba, 0xab, 0xfa, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x42, 0x69, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x42, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x41, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, - 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0xa2, 0x02, 0x04, 0x47, 0x41, 0x50, 0x49, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, + 0x12, 0x32, 0x0a, 0x15, 0x70, 0x6f, 0x6c, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x13, 0x70, 0x6f, 0x6c, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x6f, 0x6c, 0x6c, + 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x50, 0x6f, 0x6c, 0x6c, + 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x47, 0x0a, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, + 0x6f, 0x6c, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x34, + 0x0a, 0x18, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x61, 0x70, 0x69, 0x63, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x73, 0x2a, 0xa3, 0x01, 0x0a, 0x19, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, + 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x27, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x52, 0x59, 0x5f, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, + 0x53, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x48, 0x4f, 0x54, 0x4f, 0x53, 0x10, 0x03, 0x12, + 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x52, 0x45, 0x45, 0x54, 0x5f, 0x56, 0x49, 0x45, 0x57, 0x10, 0x04, + 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x48, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x07, + 0x0a, 0x03, 0x47, 0x45, 0x4f, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x47, 0x45, 0x4e, 0x45, 0x52, + 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x41, 0x49, 0x10, 0x07, 0x2a, 0x67, 0x0a, 0x18, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x44, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, + 0x5f, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59, 0x5f, 0x44, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x10, 0x0a, 0x12, 0x13, + 0x0a, 0x0f, 0x50, 0x41, 0x43, 0x4b, 0x41, 0x47, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, + 0x52, 0x10, 0x14, 0x3a, 0x4a, 0x0a, 0x10, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9b, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3a, + 0x43, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x12, + 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x99, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x43, 0x0a, 0x0c, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9a, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x61, + 0x75, 0x74, 0x68, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x3a, 0x44, 0x0a, 0x0b, 0x61, 0x70, 0x69, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xc1, 0xba, 0xab, 0xfa, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, + 0x69, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x42, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x41, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0xa2, 0x02, 0x04, 0x47, 0x41, 0x50, 0x49, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1675,7 +1788,7 @@ func file_google_api_client_proto_rawDescGZIP() []byte { } var file_google_api_client_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_google_api_client_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_google_api_client_proto_msgTypes = make([]protoimpl.MessageInfo, 19) var file_google_api_client_proto_goTypes = []interface{}{ (ClientLibraryOrganization)(0), // 0: google.api.ClientLibraryOrganization (ClientLibraryDestination)(0), // 1: google.api.ClientLibraryDestination @@ -1691,55 +1804,59 @@ var file_google_api_client_proto_goTypes = []interface{}{ (*RubySettings)(nil), // 11: google.api.RubySettings (*GoSettings)(nil), // 12: google.api.GoSettings (*MethodSettings)(nil), // 13: google.api.MethodSettings - nil, // 14: google.api.JavaSettings.ServiceClassNamesEntry - (*PythonSettings_ExperimentalFeatures)(nil), // 15: google.api.PythonSettings.ExperimentalFeatures - nil, // 16: google.api.DotnetSettings.RenamedServicesEntry - nil, // 17: google.api.DotnetSettings.RenamedResourcesEntry - (*MethodSettings_LongRunning)(nil), // 18: google.api.MethodSettings.LongRunning - (api.LaunchStage)(0), // 19: google.api.LaunchStage - (*durationpb.Duration)(nil), // 20: google.protobuf.Duration - (*descriptorpb.MethodOptions)(nil), // 21: google.protobuf.MethodOptions - (*descriptorpb.ServiceOptions)(nil), // 22: google.protobuf.ServiceOptions + (*SelectiveGapicGeneration)(nil), // 14: google.api.SelectiveGapicGeneration + nil, // 15: google.api.JavaSettings.ServiceClassNamesEntry + (*PythonSettings_ExperimentalFeatures)(nil), // 16: google.api.PythonSettings.ExperimentalFeatures + nil, // 17: google.api.DotnetSettings.RenamedServicesEntry + nil, // 18: google.api.DotnetSettings.RenamedResourcesEntry + nil, // 19: google.api.GoSettings.RenamedServicesEntry + (*MethodSettings_LongRunning)(nil), // 20: google.api.MethodSettings.LongRunning + (api.LaunchStage)(0), // 21: google.api.LaunchStage + (*durationpb.Duration)(nil), // 22: google.protobuf.Duration + (*descriptorpb.MethodOptions)(nil), // 23: google.protobuf.MethodOptions + (*descriptorpb.ServiceOptions)(nil), // 24: google.protobuf.ServiceOptions } var file_google_api_client_proto_depIdxs = []int32{ 1, // 0: google.api.CommonLanguageSettings.destinations:type_name -> google.api.ClientLibraryDestination - 19, // 1: google.api.ClientLibrarySettings.launch_stage:type_name -> google.api.LaunchStage - 5, // 2: google.api.ClientLibrarySettings.java_settings:type_name -> google.api.JavaSettings - 6, // 3: google.api.ClientLibrarySettings.cpp_settings:type_name -> google.api.CppSettings - 7, // 4: google.api.ClientLibrarySettings.php_settings:type_name -> google.api.PhpSettings - 8, // 5: google.api.ClientLibrarySettings.python_settings:type_name -> google.api.PythonSettings - 9, // 6: google.api.ClientLibrarySettings.node_settings:type_name -> google.api.NodeSettings - 10, // 7: google.api.ClientLibrarySettings.dotnet_settings:type_name -> google.api.DotnetSettings - 11, // 8: google.api.ClientLibrarySettings.ruby_settings:type_name -> google.api.RubySettings - 12, // 9: google.api.ClientLibrarySettings.go_settings:type_name -> google.api.GoSettings - 13, // 10: google.api.Publishing.method_settings:type_name -> google.api.MethodSettings - 0, // 11: google.api.Publishing.organization:type_name -> google.api.ClientLibraryOrganization - 3, // 12: google.api.Publishing.library_settings:type_name -> google.api.ClientLibrarySettings - 14, // 13: google.api.JavaSettings.service_class_names:type_name -> google.api.JavaSettings.ServiceClassNamesEntry - 2, // 14: google.api.JavaSettings.common:type_name -> google.api.CommonLanguageSettings - 2, // 15: google.api.CppSettings.common:type_name -> google.api.CommonLanguageSettings - 2, // 16: google.api.PhpSettings.common:type_name -> google.api.CommonLanguageSettings - 2, // 17: google.api.PythonSettings.common:type_name -> google.api.CommonLanguageSettings - 15, // 18: google.api.PythonSettings.experimental_features:type_name -> google.api.PythonSettings.ExperimentalFeatures - 2, // 19: google.api.NodeSettings.common:type_name -> google.api.CommonLanguageSettings - 2, // 20: google.api.DotnetSettings.common:type_name -> google.api.CommonLanguageSettings - 16, // 21: google.api.DotnetSettings.renamed_services:type_name -> google.api.DotnetSettings.RenamedServicesEntry - 17, // 22: google.api.DotnetSettings.renamed_resources:type_name -> google.api.DotnetSettings.RenamedResourcesEntry - 2, // 23: google.api.RubySettings.common:type_name -> google.api.CommonLanguageSettings - 2, // 24: google.api.GoSettings.common:type_name -> google.api.CommonLanguageSettings - 18, // 25: google.api.MethodSettings.long_running:type_name -> google.api.MethodSettings.LongRunning - 20, // 26: google.api.MethodSettings.LongRunning.initial_poll_delay:type_name -> google.protobuf.Duration - 20, // 27: google.api.MethodSettings.LongRunning.max_poll_delay:type_name -> google.protobuf.Duration - 20, // 28: google.api.MethodSettings.LongRunning.total_poll_timeout:type_name -> google.protobuf.Duration - 21, // 29: google.api.method_signature:extendee -> google.protobuf.MethodOptions - 22, // 30: google.api.default_host:extendee -> google.protobuf.ServiceOptions - 22, // 31: google.api.oauth_scopes:extendee -> google.protobuf.ServiceOptions - 22, // 32: google.api.api_version:extendee -> google.protobuf.ServiceOptions - 33, // [33:33] is the sub-list for method output_type - 33, // [33:33] is the sub-list for method input_type - 33, // [33:33] is the sub-list for extension type_name - 29, // [29:33] is the sub-list for extension extendee - 0, // [0:29] is the sub-list for field type_name + 14, // 1: google.api.CommonLanguageSettings.selective_gapic_generation:type_name -> google.api.SelectiveGapicGeneration + 21, // 2: google.api.ClientLibrarySettings.launch_stage:type_name -> google.api.LaunchStage + 5, // 3: google.api.ClientLibrarySettings.java_settings:type_name -> google.api.JavaSettings + 6, // 4: google.api.ClientLibrarySettings.cpp_settings:type_name -> google.api.CppSettings + 7, // 5: google.api.ClientLibrarySettings.php_settings:type_name -> google.api.PhpSettings + 8, // 6: google.api.ClientLibrarySettings.python_settings:type_name -> google.api.PythonSettings + 9, // 7: google.api.ClientLibrarySettings.node_settings:type_name -> google.api.NodeSettings + 10, // 8: google.api.ClientLibrarySettings.dotnet_settings:type_name -> google.api.DotnetSettings + 11, // 9: google.api.ClientLibrarySettings.ruby_settings:type_name -> google.api.RubySettings + 12, // 10: google.api.ClientLibrarySettings.go_settings:type_name -> google.api.GoSettings + 13, // 11: google.api.Publishing.method_settings:type_name -> google.api.MethodSettings + 0, // 12: google.api.Publishing.organization:type_name -> google.api.ClientLibraryOrganization + 3, // 13: google.api.Publishing.library_settings:type_name -> google.api.ClientLibrarySettings + 15, // 14: google.api.JavaSettings.service_class_names:type_name -> google.api.JavaSettings.ServiceClassNamesEntry + 2, // 15: google.api.JavaSettings.common:type_name -> google.api.CommonLanguageSettings + 2, // 16: google.api.CppSettings.common:type_name -> google.api.CommonLanguageSettings + 2, // 17: google.api.PhpSettings.common:type_name -> google.api.CommonLanguageSettings + 2, // 18: google.api.PythonSettings.common:type_name -> google.api.CommonLanguageSettings + 16, // 19: google.api.PythonSettings.experimental_features:type_name -> google.api.PythonSettings.ExperimentalFeatures + 2, // 20: google.api.NodeSettings.common:type_name -> google.api.CommonLanguageSettings + 2, // 21: google.api.DotnetSettings.common:type_name -> google.api.CommonLanguageSettings + 17, // 22: google.api.DotnetSettings.renamed_services:type_name -> google.api.DotnetSettings.RenamedServicesEntry + 18, // 23: google.api.DotnetSettings.renamed_resources:type_name -> google.api.DotnetSettings.RenamedResourcesEntry + 2, // 24: google.api.RubySettings.common:type_name -> google.api.CommonLanguageSettings + 2, // 25: google.api.GoSettings.common:type_name -> google.api.CommonLanguageSettings + 19, // 26: google.api.GoSettings.renamed_services:type_name -> google.api.GoSettings.RenamedServicesEntry + 20, // 27: google.api.MethodSettings.long_running:type_name -> google.api.MethodSettings.LongRunning + 22, // 28: google.api.MethodSettings.LongRunning.initial_poll_delay:type_name -> google.protobuf.Duration + 22, // 29: google.api.MethodSettings.LongRunning.max_poll_delay:type_name -> google.protobuf.Duration + 22, // 30: google.api.MethodSettings.LongRunning.total_poll_timeout:type_name -> google.protobuf.Duration + 23, // 31: google.api.method_signature:extendee -> google.protobuf.MethodOptions + 24, // 32: google.api.default_host:extendee -> google.protobuf.ServiceOptions + 24, // 33: google.api.oauth_scopes:extendee -> google.protobuf.ServiceOptions + 24, // 34: google.api.api_version:extendee -> google.protobuf.ServiceOptions + 35, // [35:35] is the sub-list for method output_type + 35, // [35:35] is the sub-list for method input_type + 35, // [35:35] is the sub-list for extension type_name + 31, // [31:35] is the sub-list for extension extendee + 0, // [0:31] is the sub-list for field type_name } func init() { file_google_api_client_proto_init() } @@ -1892,7 +2009,19 @@ func file_google_api_client_proto_init() { return nil } } - file_google_api_client_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_google_api_client_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SelectiveGapicGeneration); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_google_api_client_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PythonSettings_ExperimentalFeatures); i { case 0: return &v.state @@ -1904,7 +2033,7 @@ func file_google_api_client_proto_init() { return nil } } - file_google_api_client_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_google_api_client_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MethodSettings_LongRunning); i { case 0: return &v.state @@ -1923,7 +2052,7 @@ func file_google_api_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_api_client_proto_rawDesc, NumEnums: 2, - NumMessages: 17, + NumMessages: 19, NumExtensions: 4, NumServices: 0, }, diff --git a/vendor/google.golang.org/grpc/balancer/balancer.go b/vendor/google.golang.org/grpc/balancer/balancer.go index 3a2092f105..382ad69411 100644 --- a/vendor/google.golang.org/grpc/balancer/balancer.go +++ b/vendor/google.golang.org/grpc/balancer/balancer.go @@ -73,17 +73,6 @@ func unregisterForTesting(name string) { delete(m, name) } -// connectedAddress returns the connected address for a SubConnState. The -// address is only valid if the state is READY. -func connectedAddress(scs SubConnState) resolver.Address { - return scs.connectedAddress -} - -// setConnectedAddress sets the connected address for a SubConnState. -func setConnectedAddress(scs *SubConnState, addr resolver.Address) { - scs.connectedAddress = addr -} - func init() { internal.BalancerUnregister = unregisterForTesting internal.ConnectedAddress = connectedAddress @@ -106,57 +95,6 @@ func Get(name string) Builder { return nil } -// A SubConn represents a single connection to a gRPC backend service. -// -// Each SubConn contains a list of addresses. -// -// All SubConns start in IDLE, and will not try to connect. To trigger the -// connecting, Balancers must call Connect. If a connection re-enters IDLE, -// Balancers must call Connect again to trigger a new connection attempt. -// -// gRPC will try to connect to the addresses in sequence, and stop trying the -// remainder once the first connection is successful. If an attempt to connect -// to all addresses encounters an error, the SubConn will enter -// TRANSIENT_FAILURE for a backoff period, and then transition to IDLE. -// -// Once established, if a connection is lost, the SubConn will transition -// directly to IDLE. -// -// This interface is to be implemented by gRPC. Users should not need their own -// implementation of this interface. For situations like testing, any -// implementations should embed this interface. This allows gRPC to add new -// methods to this interface. -type SubConn interface { - // UpdateAddresses updates the addresses used in this SubConn. - // gRPC checks if currently-connected address is still in the new list. - // If it's in the list, the connection will be kept. - // If it's not in the list, the connection will gracefully close, and - // a new connection will be created. - // - // This will trigger a state transition for the SubConn. - // - // Deprecated: this method will be removed. Create new SubConns for new - // addresses instead. - UpdateAddresses([]resolver.Address) - // Connect starts the connecting for this SubConn. - Connect() - // GetOrBuildProducer returns a reference to the existing Producer for this - // ProducerBuilder in this SubConn, or, if one does not currently exist, - // creates a new one and returns it. Returns a close function which may be - // called when the Producer is no longer needed. Otherwise the producer - // will automatically be closed upon connection loss or subchannel close. - // Should only be called on a SubConn in state Ready. Otherwise the - // producer will be unable to create streams. - GetOrBuildProducer(ProducerBuilder) (p Producer, close func()) - // Shutdown shuts down the SubConn gracefully. Any started RPCs will be - // allowed to complete. No future calls should be made on the SubConn. - // One final state update will be delivered to the StateListener (or - // UpdateSubConnState; deprecated) with ConnectivityState of Shutdown to - // indicate the shutdown operation. This may be delivered before - // in-progress RPCs are complete and the actual connection is closed. - Shutdown() -} - // NewSubConnOptions contains options to create new SubConn. type NewSubConnOptions struct { // CredsBundle is the credentials bundle that will be used in the created @@ -424,18 +362,6 @@ type ExitIdler interface { ExitIdle() } -// SubConnState describes the state of a SubConn. -type SubConnState struct { - // ConnectivityState is the connectivity state of the SubConn. - ConnectivityState connectivity.State - // ConnectionError is set if the ConnectivityState is TransientFailure, - // describing the reason the SubConn failed. Otherwise, it is nil. - ConnectionError error - // connectedAddr contains the connected address when ConnectivityState is - // Ready. Otherwise, it is indeterminate. - connectedAddress resolver.Address -} - // ClientConnState describes the state of a ClientConn relevant to the // balancer. type ClientConnState struct { @@ -448,22 +374,3 @@ type ClientConnState struct { // ErrBadResolverState may be returned by UpdateClientConnState to indicate a // problem with the provided name resolver data. var ErrBadResolverState = errors.New("bad resolver state") - -// A ProducerBuilder is a simple constructor for a Producer. It is used by the -// SubConn to create producers when needed. -type ProducerBuilder interface { - // Build creates a Producer. The first parameter is always a - // grpc.ClientConnInterface (a type to allow creating RPCs/streams on the - // associated SubConn), but is declared as `any` to avoid a dependency - // cycle. Build also returns a close function that will be called when all - // references to the Producer have been given up for a SubConn, or when a - // connectivity state change occurs on the SubConn. The close function - // should always block until all asynchronous cleanup work is completed. - Build(grpcClientConnInterface any) (p Producer, close func()) -} - -// A Producer is a type shared among potentially many consumers. It is -// associated with a SubConn, and an implementation will typically contain -// other methods to provide additional functionality, e.g. configuration or -// subscription registration. -type Producer any diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go b/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go index c519789458..7d66cb491c 100644 --- a/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/internal/internal.go @@ -18,7 +18,18 @@ // Package internal contains code internal to the pickfirst package. package internal -import "math/rand" +import ( + rand "math/rand/v2" + "time" +) -// RandShuffle pseudo-randomizes the order of addresses. -var RandShuffle = rand.Shuffle +var ( + // RandShuffle pseudo-randomizes the order of addresses. + RandShuffle = rand.Shuffle + // TimeAfterFunc allows mocking the timer for testing connection delay + // related functionality. + TimeAfterFunc = func(d time.Duration, f func()) func() { + timer := time.AfterFunc(d, f) + return func() { timer.Stop() } + } +) diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go index e069346a75..ea8899818c 100644 --- a/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirst.go @@ -23,7 +23,7 @@ import ( "encoding/json" "errors" "fmt" - "math/rand" + rand "math/rand/v2" "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/pickfirst/internal" diff --git a/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go index 985b6edc7f..2fc0a71f94 100644 --- a/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go +++ b/vendor/google.golang.org/grpc/balancer/pickfirst/pickfirstleaf/pickfirstleaf.go @@ -29,11 +29,15 @@ import ( "encoding/json" "errors" "fmt" + "net" + "net/netip" "sync" + "time" "google.golang.org/grpc/balancer" "google.golang.org/grpc/balancer/pickfirst/internal" "google.golang.org/grpc/connectivity" + expstats "google.golang.org/grpc/experimental/stats" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal/envconfig" internalgrpclog "google.golang.org/grpc/internal/grpclog" @@ -50,26 +54,68 @@ func init() { balancer.Register(pickfirstBuilder{}) } +// enableHealthListenerKeyType is a unique key type used in resolver attributes +// to indicate whether the health listener usage is enabled. +type enableHealthListenerKeyType struct{} + var ( logger = grpclog.Component("pick-first-leaf-lb") // Name is the name of the pick_first_leaf balancer. // It is changed to "pick_first" in init() if this balancer is to be // registered as the default pickfirst. - Name = "pick_first_leaf" + Name = "pick_first_leaf" + disconnectionsMetric = expstats.RegisterInt64Count(expstats.MetricDescriptor{ + Name: "grpc.lb.pick_first.disconnections", + Description: "EXPERIMENTAL. Number of times the selected subchannel becomes disconnected.", + Unit: "disconnection", + Labels: []string{"grpc.target"}, + Default: false, + }) + connectionAttemptsSucceededMetric = expstats.RegisterInt64Count(expstats.MetricDescriptor{ + Name: "grpc.lb.pick_first.connection_attempts_succeeded", + Description: "EXPERIMENTAL. Number of successful connection attempts.", + Unit: "attempt", + Labels: []string{"grpc.target"}, + Default: false, + }) + connectionAttemptsFailedMetric = expstats.RegisterInt64Count(expstats.MetricDescriptor{ + Name: "grpc.lb.pick_first.connection_attempts_failed", + Description: "EXPERIMENTAL. Number of failed connection attempts.", + Unit: "attempt", + Labels: []string{"grpc.target"}, + Default: false, + }) ) -// TODO: change to pick-first when this becomes the default pick_first policy. -const logPrefix = "[pick-first-leaf-lb %p] " +const ( + // TODO: change to pick-first when this becomes the default pick_first policy. + logPrefix = "[pick-first-leaf-lb %p] " + // connectionDelayInterval is the time to wait for during the happy eyeballs + // pass before starting the next connection attempt. + connectionDelayInterval = 250 * time.Millisecond +) + +type ipAddrFamily int + +const ( + // ipAddrFamilyUnknown represents strings that can't be parsed as an IP + // address. + ipAddrFamilyUnknown ipAddrFamily = iota + ipAddrFamilyV4 + ipAddrFamilyV6 +) type pickfirstBuilder struct{} -func (pickfirstBuilder) Build(cc balancer.ClientConn, _ balancer.BuildOptions) balancer.Balancer { +func (pickfirstBuilder) Build(cc balancer.ClientConn, bo balancer.BuildOptions) balancer.Balancer { b := &pickfirstBalancer{ - cc: cc, - addressList: addressList{}, - subConns: resolver.NewAddressMap(), - state: connectivity.Connecting, - mu: sync.Mutex{}, + cc: cc, + target: bo.Target.String(), + metricsRecorder: bo.MetricsRecorder, // ClientConn will always create a Metrics Recorder. + + subConns: resolver.NewAddressMap(), + state: connectivity.Connecting, + cancelConnectionTimer: func() {}, } b.logger = internalgrpclog.NewPrefixLogger(logger, fmt.Sprintf(logPrefix, b)) return b @@ -87,6 +133,13 @@ func (pickfirstBuilder) ParseConfig(js json.RawMessage) (serviceconfig.LoadBalan return cfg, nil } +// EnableHealthListener updates the state to configure pickfirst for using a +// generic health listener. +func EnableHealthListener(state resolver.State) resolver.State { + state.Attributes = state.Attributes.WithValue(enableHealthListenerKeyType{}, true) + return state +} + type pfConfig struct { serviceconfig.LoadBalancingConfig `json:"-"` @@ -104,14 +157,19 @@ type scData struct { subConn balancer.SubConn addr resolver.Address - state connectivity.State - lastErr error + rawConnectivityState connectivity.State + // The effective connectivity state based on raw connectivity, health state + // and after following sticky TransientFailure behaviour defined in A62. + effectiveState connectivity.State + lastErr error + connectionFailedInFirstPass bool } func (b *pickfirstBalancer) newSCData(addr resolver.Address) (*scData, error) { sd := &scData{ - state: connectivity.Idle, - addr: addr, + rawConnectivityState: connectivity.Idle, + effectiveState: connectivity.Idle, + addr: addr, } sc, err := b.cc.NewSubConn([]resolver.Address{addr}, balancer.NewSubConnOptions{ StateListener: func(state balancer.SubConnState) { @@ -128,19 +186,25 @@ func (b *pickfirstBalancer) newSCData(addr resolver.Address) (*scData, error) { type pickfirstBalancer struct { // The following fields are initialized at build time and read-only after // that and therefore do not need to be guarded by a mutex. - logger *internalgrpclog.PrefixLogger - cc balancer.ClientConn + logger *internalgrpclog.PrefixLogger + cc balancer.ClientConn + target string + metricsRecorder expstats.MetricsRecorder // guaranteed to be non nil // The mutex is used to ensure synchronization of updates triggered // from the idle picker and the already serialized resolver, // SubConn state updates. - mu sync.Mutex + mu sync.Mutex + // State reported to the channel based on SubConn states and resolver + // updates. state connectivity.State // scData for active subonns mapped by address. - subConns *resolver.AddressMap - addressList addressList - firstPass bool - numTF int + subConns *resolver.AddressMap + addressList addressList + firstPass bool + numTF int + cancelConnectionTimer func() + healthCheckingEnabled bool } // ResolverError is called by the ClientConn when the name resolver produces @@ -166,7 +230,7 @@ func (b *pickfirstBalancer) resolverErrorLocked(err error) { return } - b.cc.UpdateState(balancer.State{ + b.updateBalancerState(balancer.State{ ConnectivityState: connectivity.TransientFailure, Picker: &picker{err: fmt.Errorf("name resolver error: %v", err)}, }) @@ -175,15 +239,16 @@ func (b *pickfirstBalancer) resolverErrorLocked(err error) { func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState) error { b.mu.Lock() defer b.mu.Unlock() + b.cancelConnectionTimer() if len(state.ResolverState.Addresses) == 0 && len(state.ResolverState.Endpoints) == 0 { // Cleanup state pertaining to the previous resolver state. // Treat an empty address list like an error by calling b.ResolverError. - b.state = connectivity.TransientFailure b.closeSubConnsLocked() b.addressList.updateAddrs(nil) b.resolverErrorLocked(errors.New("produced zero addresses")) return balancer.ErrBadResolverState } + b.healthCheckingEnabled = state.ResolverState.Attributes.Value(enableHealthListenerKeyType{}) != nil cfg, ok := state.BalancerConfig.(pfConfig) if state.BalancerConfig != nil && !ok { return fmt.Errorf("pickfirst: received illegal BalancerConfig (type %T): %v: %w", state.BalancerConfig, state.BalancerConfig, balancer.ErrBadResolverState) @@ -206,9 +271,6 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState // "Flatten the list by concatenating the ordered list of addresses for // each of the endpoints, in order." - A61 for _, endpoint := range endpoints { - // "In the flattened list, interleave addresses from the two address - // families, as per RFC-8305 section 4." - A61 - // TODO: support the above language. newAddrs = append(newAddrs, endpoint.Addresses...) } } else { @@ -231,16 +293,17 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState // Not de-duplicating would result in attempting to connect to the same // SubConn multiple times in the same pass. We don't want this. newAddrs = deDupAddresses(newAddrs) + newAddrs = interleaveAddresses(newAddrs) - // Since we have a new set of addresses, we are again at first pass. - b.firstPass = true - - // If the previous ready SubConn exists in new address list, - // keep this connection and don't create new SubConns. prevAddr := b.addressList.currentAddress() + prevSCData, found := b.subConns.Get(prevAddr) prevAddrsCount := b.addressList.size() + isPrevRawConnectivityStateReady := found && prevSCData.(*scData).rawConnectivityState == connectivity.Ready b.addressList.updateAddrs(newAddrs) - if b.state == connectivity.Ready && b.addressList.seekTo(prevAddr) { + + // If the previous ready SubConn exists in new address list, + // keep this connection and don't create new SubConns. + if isPrevRawConnectivityStateReady && b.addressList.seekTo(prevAddr) { return nil } @@ -252,18 +315,17 @@ func (b *pickfirstBalancer) UpdateClientConnState(state balancer.ClientConnState // we should still enter CONNECTING because the sticky TF behaviour // mentioned in A62 applies only when the TRANSIENT_FAILURE is reported // due to connectivity failures. - if b.state == connectivity.Ready || b.state == connectivity.Connecting || prevAddrsCount == 0 { + if isPrevRawConnectivityStateReady || b.state == connectivity.Connecting || prevAddrsCount == 0 { // Start connection attempt at first address. - b.state = connectivity.Connecting - b.cc.UpdateState(balancer.State{ + b.forceUpdateConcludedStateLocked(balancer.State{ ConnectivityState: connectivity.Connecting, Picker: &picker{err: balancer.ErrNoSubConnAvailable}, }) - b.requestConnectionLocked() + b.startFirstPassLocked() } else if b.state == connectivity.TransientFailure { // If we're in TRANSIENT_FAILURE, we stay in TRANSIENT_FAILURE until // we're READY. See A62. - b.requestConnectionLocked() + b.startFirstPassLocked() } return nil } @@ -278,6 +340,7 @@ func (b *pickfirstBalancer) Close() { b.mu.Lock() defer b.mu.Unlock() b.closeSubConnsLocked() + b.cancelConnectionTimer() b.state = connectivity.Shutdown } @@ -287,10 +350,19 @@ func (b *pickfirstBalancer) Close() { func (b *pickfirstBalancer) ExitIdle() { b.mu.Lock() defer b.mu.Unlock() - if b.state == connectivity.Idle && b.addressList.currentAddress() == b.addressList.first() { - b.firstPass = true - b.requestConnectionLocked() + if b.state == connectivity.Idle { + b.startFirstPassLocked() + } +} + +func (b *pickfirstBalancer) startFirstPassLocked() { + b.firstPass = true + b.numTF = 0 + // Reset the connection attempt record for existing SubConns. + for _, sd := range b.subConns.Values() { + sd.(*scData).connectionFailedInFirstPass = false } + b.requestConnectionLocked() } func (b *pickfirstBalancer) closeSubConnsLocked() { @@ -314,6 +386,70 @@ func deDupAddresses(addrs []resolver.Address) []resolver.Address { return retAddrs } +// interleaveAddresses interleaves addresses of both families (IPv4 and IPv6) +// as per RFC-8305 section 4. +// Whichever address family is first in the list is followed by an address of +// the other address family; that is, if the first address in the list is IPv6, +// then the first IPv4 address should be moved up in the list to be second in +// the list. It doesn't support configuring "First Address Family Count", i.e. +// there will always be a single member of the first address family at the +// beginning of the interleaved list. +// Addresses that are neither IPv4 nor IPv6 are treated as part of a third +// "unknown" family for interleaving. +// See: https://datatracker.ietf.org/doc/html/rfc8305#autoid-6 +func interleaveAddresses(addrs []resolver.Address) []resolver.Address { + familyAddrsMap := map[ipAddrFamily][]resolver.Address{} + interleavingOrder := []ipAddrFamily{} + for _, addr := range addrs { + family := addressFamily(addr.Addr) + if _, found := familyAddrsMap[family]; !found { + interleavingOrder = append(interleavingOrder, family) + } + familyAddrsMap[family] = append(familyAddrsMap[family], addr) + } + + interleavedAddrs := make([]resolver.Address, 0, len(addrs)) + + for curFamilyIdx := 0; len(interleavedAddrs) < len(addrs); curFamilyIdx = (curFamilyIdx + 1) % len(interleavingOrder) { + // Some IP types may have fewer addresses than others, so we look for + // the next type that has a remaining member to add to the interleaved + // list. + family := interleavingOrder[curFamilyIdx] + remainingMembers := familyAddrsMap[family] + if len(remainingMembers) > 0 { + interleavedAddrs = append(interleavedAddrs, remainingMembers[0]) + familyAddrsMap[family] = remainingMembers[1:] + } + } + + return interleavedAddrs +} + +// addressFamily returns the ipAddrFamily after parsing the address string. +// If the address isn't of the format "ip-address:port", it returns +// ipAddrFamilyUnknown. The address may be valid even if it's not an IP when +// using a resolver like passthrough where the address may be a hostname in +// some format that the dialer can resolve. +func addressFamily(address string) ipAddrFamily { + // Parse the IP after removing the port. + host, _, err := net.SplitHostPort(address) + if err != nil { + return ipAddrFamilyUnknown + } + ip, err := netip.ParseAddr(host) + if err != nil { + return ipAddrFamilyUnknown + } + switch { + case ip.Is4() || ip.Is4In6(): + return ipAddrFamilyV4 + case ip.Is6(): + return ipAddrFamilyV6 + default: + return ipAddrFamilyUnknown + } +} + // reconcileSubConnsLocked updates the active subchannels based on a new address // list from the resolver. It does this by: // - closing subchannels: any existing subchannels associated with addresses @@ -342,6 +478,7 @@ func (b *pickfirstBalancer) reconcileSubConnsLocked(newAddrs []resolver.Address) // shutdownRemainingLocked shuts down remaining subConns. Called when a subConn // becomes ready, which means that all other subConn must be shutdown. func (b *pickfirstBalancer) shutdownRemainingLocked(selected *scData) { + b.cancelConnectionTimer() for _, v := range b.subConns.Values() { sd := v.(*scData) if sd.subConn != selected.subConn { @@ -382,46 +519,89 @@ func (b *pickfirstBalancer) requestConnectionLocked() { } scd := sd.(*scData) - switch scd.state { + switch scd.rawConnectivityState { case connectivity.Idle: scd.subConn.Connect() + b.scheduleNextConnectionLocked() + return case connectivity.TransientFailure: - // Try the next address. + // The SubConn is being re-used and failed during a previous pass + // over the addressList. It has not completed backoff yet. + // Mark it as having failed and try the next address. + scd.connectionFailedInFirstPass = true lastErr = scd.lastErr continue - case connectivity.Ready: - // Should never happen. - b.logger.Errorf("Requesting a connection even though we have a READY SubConn") - case connectivity.Shutdown: - // Should never happen. - b.logger.Errorf("SubConn with state SHUTDOWN present in SubConns map") case connectivity.Connecting: - // Wait for the SubConn to report success or failure. + // Wait for the connection attempt to complete or the timer to fire + // before attempting the next address. + b.scheduleNextConnectionLocked() + return + default: + b.logger.Errorf("SubConn with unexpected state %v present in SubConns map.", scd.rawConnectivityState) + return + } - return } + // All the remaining addresses in the list are in TRANSIENT_FAILURE, end the - // first pass. - b.endFirstPassLocked(lastErr) + // first pass if possible. + b.endFirstPassIfPossibleLocked(lastErr) +} + +func (b *pickfirstBalancer) scheduleNextConnectionLocked() { + b.cancelConnectionTimer() + if !b.addressList.hasNext() { + return + } + curAddr := b.addressList.currentAddress() + cancelled := false // Access to this is protected by the balancer's mutex. + closeFn := internal.TimeAfterFunc(connectionDelayInterval, func() { + b.mu.Lock() + defer b.mu.Unlock() + // If the scheduled task is cancelled while acquiring the mutex, return. + if cancelled { + return + } + if b.logger.V(2) { + b.logger.Infof("Happy Eyeballs timer expired while waiting for connection to %q.", curAddr.Addr) + } + if b.addressList.increment() { + b.requestConnectionLocked() + } + }) + // Access to the cancellation callback held by the balancer is guarded by + // the balancer's mutex, so it's safe to set the boolean from the callback. + b.cancelConnectionTimer = sync.OnceFunc(func() { + cancelled = true + closeFn() + }) } func (b *pickfirstBalancer) updateSubConnState(sd *scData, newState balancer.SubConnState) { b.mu.Lock() defer b.mu.Unlock() - oldState := sd.state - sd.state = newState.ConnectivityState + oldState := sd.rawConnectivityState + sd.rawConnectivityState = newState.ConnectivityState // Previously relevant SubConns can still callback with state updates. // To prevent pickers from returning these obsolete SubConns, this logic // is included to check if the current list of active SubConns includes this // SubConn. - if activeSD, found := b.subConns.Get(sd.addr); !found || activeSD != sd { + if !b.isActiveSCData(sd) { return } if newState.ConnectivityState == connectivity.Shutdown { + sd.effectiveState = connectivity.Shutdown return } + // Record a connection attempt when exiting CONNECTING. + if newState.ConnectivityState == connectivity.TransientFailure { + sd.connectionFailedInFirstPass = true + connectionAttemptsFailedMetric.Record(b.metricsRecorder, 1, b.target) + } + if newState.ConnectivityState == connectivity.Ready { + connectionAttemptsSucceededMetric.Record(b.metricsRecorder, 1, b.target) b.shutdownRemainingLocked(sd) if !b.addressList.seekTo(sd.addr) { // This should not fail as we should have only one SubConn after @@ -429,10 +609,30 @@ func (b *pickfirstBalancer) updateSubConnState(sd *scData, newState balancer.Sub b.logger.Errorf("Address %q not found address list in %v", sd.addr, b.addressList.addresses) return } - b.state = connectivity.Ready - b.cc.UpdateState(balancer.State{ - ConnectivityState: connectivity.Ready, - Picker: &picker{result: balancer.PickResult{SubConn: sd.subConn}}, + if !b.healthCheckingEnabled { + if b.logger.V(2) { + b.logger.Infof("SubConn %p reported connectivity state READY and the health listener is disabled. Transitioning SubConn to READY.", sd.subConn) + } + + sd.effectiveState = connectivity.Ready + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Ready, + Picker: &picker{result: balancer.PickResult{SubConn: sd.subConn}}, + }) + return + } + if b.logger.V(2) { + b.logger.Infof("SubConn %p reported connectivity state READY. Registering health listener.", sd.subConn) + } + // Send a CONNECTING update to take the SubConn out of sticky-TF if + // required. + sd.effectiveState = connectivity.Connecting + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + sd.subConn.RegisterHealthListener(func(scs balancer.SubConnState) { + b.updateSubConnHealthState(sd, scs) }) return } @@ -443,13 +643,24 @@ func (b *pickfirstBalancer) updateSubConnState(sd *scData, newState balancer.Sub // a transport is successfully created, but the connection fails // before the SubConn can send the notification for READY. We treat // this as a successful connection and transition to IDLE. - if (b.state == connectivity.Ready && newState.ConnectivityState != connectivity.Ready) || (oldState == connectivity.Connecting && newState.ConnectivityState == connectivity.Idle) { + // TODO: https://github.com/grpc/grpc-go/issues/7862 - Remove the second + // part of the if condition below once the issue is fixed. + if oldState == connectivity.Ready || (oldState == connectivity.Connecting && newState.ConnectivityState == connectivity.Idle) { // Once a transport fails, the balancer enters IDLE and starts from // the first address when the picker is used. b.shutdownRemainingLocked(sd) - b.state = connectivity.Idle + sd.effectiveState = newState.ConnectivityState + // READY SubConn interspliced in between CONNECTING and IDLE, need to + // account for that. + if oldState == connectivity.Connecting { + // A known issue (https://github.com/grpc/grpc-go/issues/7862) + // causes a race that prevents the READY state change notification. + // This works around it. + connectionAttemptsSucceededMetric.Record(b.metricsRecorder, 1, b.target) + } + disconnectionsMetric.Record(b.metricsRecorder, 1, b.target) b.addressList.reset() - b.cc.UpdateState(balancer.State{ + b.updateBalancerState(balancer.State{ ConnectivityState: connectivity.Idle, Picker: &idlePicker{exitIdle: sync.OnceFunc(b.ExitIdle)}, }) @@ -459,32 +670,35 @@ func (b *pickfirstBalancer) updateSubConnState(sd *scData, newState balancer.Sub if b.firstPass { switch newState.ConnectivityState { case connectivity.Connecting: - // The balancer can be in either IDLE, CONNECTING or - // TRANSIENT_FAILURE. If it's in TRANSIENT_FAILURE, stay in + // The effective state can be in either IDLE, CONNECTING or + // TRANSIENT_FAILURE. If it's TRANSIENT_FAILURE, stay in // TRANSIENT_FAILURE until it's READY. See A62. - // If the balancer is already in CONNECTING, no update is needed. - if b.state == connectivity.Idle { - b.state = connectivity.Connecting - b.cc.UpdateState(balancer.State{ + if sd.effectiveState != connectivity.TransientFailure { + sd.effectiveState = connectivity.Connecting + b.updateBalancerState(balancer.State{ ConnectivityState: connectivity.Connecting, Picker: &picker{err: balancer.ErrNoSubConnAvailable}, }) } case connectivity.TransientFailure: sd.lastErr = newState.ConnectionError + sd.effectiveState = connectivity.TransientFailure // Since we're re-using common SubConns while handling resolver // updates, we could receive an out of turn TRANSIENT_FAILURE from - // a pass over the previous address list. We ignore such updates. - - if curAddr := b.addressList.currentAddress(); !equalAddressIgnoringBalAttributes(&curAddr, &sd.addr) { - return - } - if b.addressList.increment() { - b.requestConnectionLocked() - return + // a pass over the previous address list. Happy Eyeballs will also + // cause out of order updates to arrive. + + if curAddr := b.addressList.currentAddress(); equalAddressIgnoringBalAttributes(&curAddr, &sd.addr) { + b.cancelConnectionTimer() + if b.addressList.increment() { + b.requestConnectionLocked() + return + } } - // End of the first pass. - b.endFirstPassLocked(newState.ConnectionError) + + // End the first pass if we've seen a TRANSIENT_FAILURE from all + // SubConns once. + b.endFirstPassIfPossibleLocked(newState.ConnectionError) } return } @@ -495,7 +709,7 @@ func (b *pickfirstBalancer) updateSubConnState(sd *scData, newState balancer.Sub b.numTF = (b.numTF + 1) % b.subConns.Len() sd.lastErr = newState.ConnectionError if b.numTF%b.subConns.Len() == 0 { - b.cc.UpdateState(balancer.State{ + b.updateBalancerState(balancer.State{ ConnectivityState: connectivity.TransientFailure, Picker: &picker{err: newState.ConnectionError}, }) @@ -509,24 +723,95 @@ func (b *pickfirstBalancer) updateSubConnState(sd *scData, newState balancer.Sub } } -func (b *pickfirstBalancer) endFirstPassLocked(lastErr error) { +// endFirstPassIfPossibleLocked ends the first happy-eyeballs pass if all the +// addresses are tried and their SubConns have reported a failure. +func (b *pickfirstBalancer) endFirstPassIfPossibleLocked(lastErr error) { + // An optimization to avoid iterating over the entire SubConn map. + if b.addressList.isValid() { + return + } + // Connect() has been called on all the SubConns. The first pass can be + // ended if all the SubConns have reported a failure. + for _, v := range b.subConns.Values() { + sd := v.(*scData) + if !sd.connectionFailedInFirstPass { + return + } + } b.firstPass = false - b.numTF = 0 - b.state = connectivity.TransientFailure - - b.cc.UpdateState(balancer.State{ + b.updateBalancerState(balancer.State{ ConnectivityState: connectivity.TransientFailure, Picker: &picker{err: lastErr}, }) // Start re-connecting all the SubConns that are already in IDLE. for _, v := range b.subConns.Values() { sd := v.(*scData) - if sd.state == connectivity.Idle { + if sd.rawConnectivityState == connectivity.Idle { sd.subConn.Connect() } } } +func (b *pickfirstBalancer) isActiveSCData(sd *scData) bool { + activeSD, found := b.subConns.Get(sd.addr) + return found && activeSD == sd +} + +func (b *pickfirstBalancer) updateSubConnHealthState(sd *scData, state balancer.SubConnState) { + b.mu.Lock() + defer b.mu.Unlock() + // Previously relevant SubConns can still callback with state updates. + // To prevent pickers from returning these obsolete SubConns, this logic + // is included to check if the current list of active SubConns includes + // this SubConn. + if !b.isActiveSCData(sd) { + return + } + sd.effectiveState = state.ConnectivityState + switch state.ConnectivityState { + case connectivity.Ready: + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Ready, + Picker: &picker{result: balancer.PickResult{SubConn: sd.subConn}}, + }) + case connectivity.TransientFailure: + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.TransientFailure, + Picker: &picker{err: fmt.Errorf("pickfirst: health check failure: %v", state.ConnectionError)}, + }) + case connectivity.Connecting: + b.updateBalancerState(balancer.State{ + ConnectivityState: connectivity.Connecting, + Picker: &picker{err: balancer.ErrNoSubConnAvailable}, + }) + default: + b.logger.Errorf("Got unexpected health update for SubConn %p: %v", state) + } +} + +// updateBalancerState stores the state reported to the channel and calls +// ClientConn.UpdateState(). As an optimization, it avoids sending duplicate +// updates to the channel. +func (b *pickfirstBalancer) updateBalancerState(newState balancer.State) { + // In case of TransientFailures allow the picker to be updated to update + // the connectivity error, in all other cases don't send duplicate state + // updates. + if newState.ConnectivityState == b.state && b.state != connectivity.TransientFailure { + return + } + b.forceUpdateConcludedStateLocked(newState) +} + +// forceUpdateConcludedStateLocked stores the state reported to the channel and +// calls ClientConn.UpdateState(). +// A separate function is defined to force update the ClientConn state since the +// channel doesn't correctly assume that LB policies start in CONNECTING and +// relies on LB policy to send an initial CONNECTING update. +func (b *pickfirstBalancer) forceUpdateConcludedStateLocked(newState balancer.State) { + b.state = newState.ConnectivityState + b.cc.UpdateState(newState) +} + type picker struct { result balancer.PickResult err error @@ -583,15 +868,6 @@ func (al *addressList) currentAddress() resolver.Address { return al.addresses[al.idx] } -// first returns the first address in the list. If the list is empty, it returns -// an empty address instead. -func (al *addressList) first() resolver.Address { - if len(al.addresses) == 0 { - return resolver.Address{} - } - return al.addresses[0] -} - func (al *addressList) reset() { al.idx = 0 } @@ -614,6 +890,16 @@ func (al *addressList) seekTo(needle resolver.Address) bool { return false } +// hasNext returns whether incrementing the addressList will result in moving +// past the end of the list. If the list has already moved past the end, it +// returns false. +func (al *addressList) hasNext() bool { + if !al.isValid() { + return false + } + return al.idx+1 < len(al.addresses) +} + // equalAddressIgnoringBalAttributes returns true is a and b are considered // equal. This is different from the Equal method on the resolver.Address type // which considers all fields to determine equality. Here, we only consider diff --git a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go index 260255d31b..80a42d2251 100644 --- a/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go +++ b/vendor/google.golang.org/grpc/balancer/roundrobin/roundrobin.go @@ -22,7 +22,7 @@ package roundrobin import ( - "math/rand" + rand "math/rand/v2" "sync/atomic" "google.golang.org/grpc/balancer" @@ -60,7 +60,7 @@ func (*rrPickerBuilder) Build(info base.PickerBuildInfo) balancer.Picker { // Start at a random index, as the same RR balancer rebuilds a new // picker when SubConn states change, and we don't want to apply excess // load to the first server in the list. - next: uint32(rand.Intn(len(scs))), + next: uint32(rand.IntN(len(scs))), } } diff --git a/vendor/google.golang.org/grpc/balancer/subconn.go b/vendor/google.golang.org/grpc/balancer/subconn.go new file mode 100644 index 0000000000..ea27c4fa76 --- /dev/null +++ b/vendor/google.golang.org/grpc/balancer/subconn.go @@ -0,0 +1,134 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package balancer + +import ( + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/internal" + "google.golang.org/grpc/resolver" +) + +// A SubConn represents a single connection to a gRPC backend service. +// +// All SubConns start in IDLE, and will not try to connect. To trigger a +// connection attempt, Balancers must call Connect. +// +// If the connection attempt fails, the SubConn will transition to +// TRANSIENT_FAILURE for a backoff period, and then return to IDLE. If the +// connection attempt succeeds, it will transition to READY. +// +// If a READY SubConn becomes disconnected, the SubConn will transition to IDLE. +// +// If a connection re-enters IDLE, Balancers must call Connect again to trigger +// a new connection attempt. +// +// Each SubConn contains a list of addresses. gRPC will try to connect to the +// addresses in sequence, and stop trying the remainder once the first +// connection is successful. However, this behavior is deprecated. SubConns +// should only use a single address. +// +// NOTICE: This interface is intended to be implemented by gRPC, or intercepted +// by custom load balancing poilices. Users should not need their own complete +// implementation of this interface -- they should always delegate to a SubConn +// returned by ClientConn.NewSubConn() by embedding it in their implementations. +// An embedded SubConn must never be nil, or runtime panics will occur. +type SubConn interface { + // UpdateAddresses updates the addresses used in this SubConn. + // gRPC checks if currently-connected address is still in the new list. + // If it's in the list, the connection will be kept. + // If it's not in the list, the connection will gracefully close, and + // a new connection will be created. + // + // This will trigger a state transition for the SubConn. + // + // Deprecated: this method will be removed. Create new SubConns for new + // addresses instead. + UpdateAddresses([]resolver.Address) + // Connect starts the connecting for this SubConn. + Connect() + // GetOrBuildProducer returns a reference to the existing Producer for this + // ProducerBuilder in this SubConn, or, if one does not currently exist, + // creates a new one and returns it. Returns a close function which may be + // called when the Producer is no longer needed. Otherwise the producer + // will automatically be closed upon connection loss or subchannel close. + // Should only be called on a SubConn in state Ready. Otherwise the + // producer will be unable to create streams. + GetOrBuildProducer(ProducerBuilder) (p Producer, close func()) + // Shutdown shuts down the SubConn gracefully. Any started RPCs will be + // allowed to complete. No future calls should be made on the SubConn. + // One final state update will be delivered to the StateListener (or + // UpdateSubConnState; deprecated) with ConnectivityState of Shutdown to + // indicate the shutdown operation. This may be delivered before + // in-progress RPCs are complete and the actual connection is closed. + Shutdown() + // RegisterHealthListener registers a health listener that receives health + // updates for a Ready SubConn. Only one health listener can be registered + // at a time. A health listener should be registered each time the SubConn's + // connectivity state changes to READY. Registering a health listener when + // the connectivity state is not READY may result in undefined behaviour. + // This method must not be called synchronously while handling an update + // from a previously registered health listener. + RegisterHealthListener(func(SubConnState)) + // EnforceSubConnEmbedding is included to force implementers to embed + // another implementation of this interface, allowing gRPC to add methods + // without breaking users. + internal.EnforceSubConnEmbedding +} + +// A ProducerBuilder is a simple constructor for a Producer. It is used by the +// SubConn to create producers when needed. +type ProducerBuilder interface { + // Build creates a Producer. The first parameter is always a + // grpc.ClientConnInterface (a type to allow creating RPCs/streams on the + // associated SubConn), but is declared as `any` to avoid a dependency + // cycle. Build also returns a close function that will be called when all + // references to the Producer have been given up for a SubConn, or when a + // connectivity state change occurs on the SubConn. The close function + // should always block until all asynchronous cleanup work is completed. + Build(grpcClientConnInterface any) (p Producer, close func()) +} + +// SubConnState describes the state of a SubConn. +type SubConnState struct { + // ConnectivityState is the connectivity state of the SubConn. + ConnectivityState connectivity.State + // ConnectionError is set if the ConnectivityState is TransientFailure, + // describing the reason the SubConn failed. Otherwise, it is nil. + ConnectionError error + // connectedAddr contains the connected address when ConnectivityState is + // Ready. Otherwise, it is indeterminate. + connectedAddress resolver.Address +} + +// connectedAddress returns the connected address for a SubConnState. The +// address is only valid if the state is READY. +func connectedAddress(scs SubConnState) resolver.Address { + return scs.connectedAddress +} + +// setConnectedAddress sets the connected address for a SubConnState. +func setConnectedAddress(scs *SubConnState, addr resolver.Address) { + scs.connectedAddress = addr +} + +// A Producer is a type shared among potentially many consumers. It is +// associated with a SubConn, and an implementation will typically contain +// other methods to provide additional functionality, e.g. configuration or +// subscription registration. +type Producer any diff --git a/vendor/google.golang.org/grpc/balancer_wrapper.go b/vendor/google.golang.org/grpc/balancer_wrapper.go index 2a4f2878ae..905817b5fc 100644 --- a/vendor/google.golang.org/grpc/balancer_wrapper.go +++ b/vendor/google.golang.org/grpc/balancer_wrapper.go @@ -189,6 +189,7 @@ func (ccb *ccBalancerWrapper) NewSubConn(addrs []resolver.Address, opts balancer ac: ac, producers: make(map[balancer.ProducerBuilder]*refCountedProducer), stateListener: opts.StateListener, + healthData: newHealthData(connectivity.Idle), } ac.acbw = acbw return acbw, nil @@ -254,12 +255,32 @@ func (ccb *ccBalancerWrapper) Target() string { // acBalancerWrapper is a wrapper on top of ac for balancers. // It implements balancer.SubConn interface. type acBalancerWrapper struct { + internal.EnforceSubConnEmbedding ac *addrConn // read-only ccb *ccBalancerWrapper // read-only stateListener func(balancer.SubConnState) producersMu sync.Mutex producers map[balancer.ProducerBuilder]*refCountedProducer + + // Access to healthData is protected by healthMu. + healthMu sync.Mutex + // healthData is stored as a pointer to detect when the health listener is + // dropped or updated. This is required as closures can't be compared for + // equality. + healthData *healthData +} + +// healthData holds data related to health state reporting. +type healthData struct { + // connectivityState stores the most recent connectivity state delivered + // to the LB policy. This is stored to avoid sending updates when the + // SubConn has already exited connectivity state READY. + connectivityState connectivity.State +} + +func newHealthData(s connectivity.State) *healthData { + return &healthData{connectivityState: s} } // updateState is invoked by grpc to push a subConn state update to the @@ -279,6 +300,24 @@ func (acbw *acBalancerWrapper) updateState(s connectivity.State, curAddr resolve if s == connectivity.Ready { setConnectedAddress(&scs, curAddr) } + // Invalidate the health listener by updating the healthData. + acbw.healthMu.Lock() + // A race may occur if a health listener is registered soon after the + // connectivity state is set but before the stateListener is called. + // Two cases may arise: + // 1. The new state is not READY: RegisterHealthListener has checks to + // ensure no updates are sent when the connectivity state is not + // READY. + // 2. The new state is READY: This means that the old state wasn't Ready. + // The RegisterHealthListener API mentions that a health listener + // must not be registered when a SubConn is not ready to avoid such + // races. When this happens, the LB policy would get health updates + // on the old listener. When the LB policy registers a new listener + // on receiving the connectivity update, the health updates will be + // sent to the new health listener. + acbw.healthData = newHealthData(scs.ConnectivityState) + acbw.healthMu.Unlock() + acbw.stateListener(scs) }) } @@ -373,3 +412,41 @@ func (acbw *acBalancerWrapper) closeProducers() { delete(acbw.producers, pb) } } + +// RegisterHealthListener accepts a health listener from the LB policy. It sends +// updates to the health listener as long as the SubConn's connectivity state +// doesn't change and a new health listener is not registered. To invalidate +// the currently registered health listener, acbw updates the healthData. If a +// nil listener is registered, the active health listener is dropped. +func (acbw *acBalancerWrapper) RegisterHealthListener(listener func(balancer.SubConnState)) { + acbw.healthMu.Lock() + defer acbw.healthMu.Unlock() + // listeners should not be registered when the connectivity state + // isn't Ready. This may happen when the balancer registers a listener + // after the connectivityState is updated, but before it is notified + // of the update. + if acbw.healthData.connectivityState != connectivity.Ready { + return + } + // Replace the health data to stop sending updates to any previously + // registered health listeners. + hd := newHealthData(connectivity.Ready) + acbw.healthData = hd + if listener == nil { + return + } + + acbw.ccb.serializer.TrySchedule(func(ctx context.Context) { + if ctx.Err() != nil || acbw.ccb.balancer == nil { + return + } + // Don't send updates if a new listener is registered. + acbw.healthMu.Lock() + defer acbw.healthMu.Unlock() + curHD := acbw.healthData + if curHD != hd { + return + } + listener(balancer.SubConnState{ConnectivityState: connectivity.Ready}) + }) +} diff --git a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go index 55bffaa77e..9e9d080699 100644 --- a/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go +++ b/vendor/google.golang.org/grpc/binarylog/grpc_binarylog_v1/binarylog.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.2 +// protoc-gen-go v1.35.1 // protoc v5.27.1 // source: grpc/binlog/v1/binarylog.proto @@ -274,11 +274,9 @@ type GrpcLogEntry struct { func (x *GrpcLogEntry) Reset() { *x = GrpcLogEntry{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GrpcLogEntry) String() string { @@ -289,7 +287,7 @@ func (*GrpcLogEntry) ProtoMessage() {} func (x *GrpcLogEntry) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -440,11 +438,9 @@ type ClientHeader struct { func (x *ClientHeader) Reset() { *x = ClientHeader{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ClientHeader) String() string { @@ -455,7 +451,7 @@ func (*ClientHeader) ProtoMessage() {} func (x *ClientHeader) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -509,11 +505,9 @@ type ServerHeader struct { func (x *ServerHeader) Reset() { *x = ServerHeader{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ServerHeader) String() string { @@ -524,7 +518,7 @@ func (*ServerHeader) ProtoMessage() {} func (x *ServerHeader) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -565,11 +559,9 @@ type Trailer struct { func (x *Trailer) Reset() { *x = Trailer{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Trailer) String() string { @@ -580,7 +572,7 @@ func (*Trailer) ProtoMessage() {} func (x *Trailer) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -638,11 +630,9 @@ type Message struct { func (x *Message) Reset() { *x = Message{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Message) String() string { @@ -653,7 +643,7 @@ func (*Message) ProtoMessage() {} func (x *Message) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -713,11 +703,9 @@ type Metadata struct { func (x *Metadata) Reset() { *x = Metadata{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Metadata) String() string { @@ -728,7 +716,7 @@ func (*Metadata) ProtoMessage() {} func (x *Metadata) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -762,11 +750,9 @@ type MetadataEntry struct { func (x *MetadataEntry) Reset() { *x = MetadataEntry{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MetadataEntry) String() string { @@ -777,7 +763,7 @@ func (*MetadataEntry) ProtoMessage() {} func (x *MetadataEntry) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -820,11 +806,9 @@ type Address struct { func (x *Address) Reset() { *x = Address{} - if protoimpl.UnsafeEnabled { - mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Address) String() string { @@ -835,7 +819,7 @@ func (*Address) ProtoMessage() {} func (x *Address) ProtoReflect() protoreflect.Message { mi := &file_grpc_binlog_v1_binarylog_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1057,104 +1041,6 @@ func file_grpc_binlog_v1_binarylog_proto_init() { if File_grpc_binlog_v1_binarylog_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_grpc_binlog_v1_binarylog_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*GrpcLogEntry); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*ClientHeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*ServerHeader); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*Trailer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*Message); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*Metadata); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[6].Exporter = func(v any, i int) any { - switch v := v.(*MetadataEntry); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_grpc_binlog_v1_binarylog_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*Address); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } file_grpc_binlog_v1_binarylog_proto_msgTypes[0].OneofWrappers = []any{ (*GrpcLogEntry_ClientHeader)(nil), (*GrpcLogEntry_ServerHeader)(nil), diff --git a/vendor/google.golang.org/grpc/clientconn.go b/vendor/google.golang.org/grpc/clientconn.go index 19763f8edd..4f57b55434 100644 --- a/vendor/google.golang.org/grpc/clientconn.go +++ b/vendor/google.golang.org/grpc/clientconn.go @@ -775,10 +775,7 @@ func (cc *ClientConn) updateResolverStateAndUnlock(s resolver.State, err error) } } - var balCfg serviceconfig.LoadBalancingConfig - if cc.sc != nil && cc.sc.lbConfig != nil { - balCfg = cc.sc.lbConfig - } + balCfg := cc.sc.lbConfig bw := cc.balancerWrapper cc.mu.Unlock() @@ -1374,7 +1371,7 @@ func (ac *addrConn) createTransport(ctx context.Context, addr resolver.Address, defer cancel() copts.ChannelzParent = ac.channelz - newTr, err := transport.NewClientTransport(connectCtx, ac.cc.ctx, addr, copts, onClose) + newTr, err := transport.NewHTTP2Client(connectCtx, ac.cc.ctx, addr, copts, onClose) if err != nil { if logger.V(2) { logger.Infof("Creating new client transport to %q: %v", addr, err) @@ -1448,7 +1445,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) { if !ac.scopts.HealthCheckEnabled { return } - healthCheckFunc := ac.cc.dopts.healthCheckFunc + healthCheckFunc := internal.HealthCheckFunc if healthCheckFunc == nil { // The health package is not imported to set health check function. // @@ -1480,7 +1477,7 @@ func (ac *addrConn) startHealthCheck(ctx context.Context) { } // Start the health checking stream. go func() { - err := ac.cc.dopts.healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName) + err := healthCheckFunc(ctx, newStream, setConnectivityState, healthCheckConfig.ServiceName) if err != nil { if status.Code(err) == codes.Unimplemented { channelz.Error(logger, ac.channelz, "Subchannel health check is unimplemented at server side, thus health check is disabled") diff --git a/vendor/google.golang.org/grpc/codec.go b/vendor/google.golang.org/grpc/codec.go index e840858b77..959c2f99d4 100644 --- a/vendor/google.golang.org/grpc/codec.go +++ b/vendor/google.golang.org/grpc/codec.go @@ -71,7 +71,7 @@ func (c codecV0Bridge) Marshal(v any) (mem.BufferSlice, error) { if err != nil { return nil, err } - return mem.BufferSlice{mem.NewBuffer(&data, nil)}, nil + return mem.BufferSlice{mem.SliceBuffer(data)}, nil } func (c codecV0Bridge) Unmarshal(data mem.BufferSlice, v any) (err error) { diff --git a/vendor/google.golang.org/grpc/dialoptions.go b/vendor/google.golang.org/grpc/dialoptions.go index 518692c3af..7494ae591f 100644 --- a/vendor/google.golang.org/grpc/dialoptions.go +++ b/vendor/google.golang.org/grpc/dialoptions.go @@ -87,7 +87,6 @@ type dialOptions struct { disableServiceConfig bool disableRetry bool disableHealthCheck bool - healthCheckFunc internal.HealthChecker minConnectTimeout func() time.Duration defaultServiceConfig *ServiceConfig // defaultServiceConfig is parsed from defaultServiceConfigRawJSON. defaultServiceConfigRawJSON *string @@ -445,10 +444,6 @@ func WithContextDialer(f func(context.Context, string) (net.Conn, error)) DialOp }) } -func init() { - internal.WithHealthCheckFunc = withHealthCheckFunc -} - // WithDialer returns a DialOption that specifies a function to use for dialing // network addresses. If FailOnNonTempDialError() is set to true, and an error // is returned by f, gRPC checks the error's Temporary() method to decide if it @@ -662,16 +657,6 @@ func WithDisableHealthCheck() DialOption { }) } -// withHealthCheckFunc replaces the default health check function with the -// provided one. It makes tests easier to change the health check function. -// -// For testing purpose only. -func withHealthCheckFunc(f internal.HealthChecker) DialOption { - return newFuncDialOption(func(o *dialOptions) { - o.healthCheckFunc = f - }) -} - func defaultDialOptions() dialOptions { return dialOptions{ copts: transport.ConnectOptions{ @@ -682,7 +667,6 @@ func defaultDialOptions() dialOptions { BufferPool: mem.DefaultBufferPool(), }, bs: internalbackoff.DefaultExponential, - healthCheckFunc: internal.HealthCheckFunc, idleTimeout: 30 * time.Minute, defaultScheme: "dns", maxCallAttempts: defaultMaxCallAttempts, diff --git a/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go b/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go index 1d827dd5d9..ad75313a18 100644 --- a/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go +++ b/vendor/google.golang.org/grpc/experimental/stats/metricregistry.go @@ -23,6 +23,7 @@ import ( "google.golang.org/grpc/grpclog" "google.golang.org/grpc/internal" + "google.golang.org/grpc/stats" ) func init() { @@ -34,7 +35,7 @@ var logger = grpclog.Component("metrics-registry") // DefaultMetrics are the default metrics registered through global metrics // registry. This is written to at initialization time only, and is read only // after initialization. -var DefaultMetrics = NewMetrics() +var DefaultMetrics = stats.NewMetricSet() // MetricDescriptor is the data for a registered metric. type MetricDescriptor struct { @@ -42,7 +43,7 @@ type MetricDescriptor struct { // (including any per call metrics). See // https://github.com/grpc/proposal/blob/master/A79-non-per-call-metrics-architecture.md#metric-instrument-naming-conventions // for metric naming conventions. - Name Metric + Name string // The description of this metric. Description string // The unit (e.g. entries, seconds) of this metric. @@ -154,27 +155,27 @@ func (h *Int64GaugeHandle) Record(recorder MetricsRecorder, incr int64, labels . } // registeredMetrics are the registered metric descriptor names. -var registeredMetrics = make(map[Metric]bool) +var registeredMetrics = make(map[string]bool) // metricsRegistry contains all of the registered metrics. // // This is written to only at init time, and read only after that. -var metricsRegistry = make(map[Metric]*MetricDescriptor) +var metricsRegistry = make(map[string]*MetricDescriptor) // DescriptorForMetric returns the MetricDescriptor from the global registry. // // Returns nil if MetricDescriptor not present. -func DescriptorForMetric(metric Metric) *MetricDescriptor { - return metricsRegistry[metric] +func DescriptorForMetric(metricName string) *MetricDescriptor { + return metricsRegistry[metricName] } -func registerMetric(name Metric, def bool) { - if registeredMetrics[name] { - logger.Fatalf("metric %v already registered", name) +func registerMetric(metricName string, def bool) { + if registeredMetrics[metricName] { + logger.Fatalf("metric %v already registered", metricName) } - registeredMetrics[name] = true + registeredMetrics[metricName] = true if def { - DefaultMetrics = DefaultMetrics.Add(name) + DefaultMetrics = DefaultMetrics.Add(metricName) } } @@ -256,8 +257,8 @@ func snapshotMetricsRegistryForTesting() func() { oldRegisteredMetrics := registeredMetrics oldMetricsRegistry := metricsRegistry - registeredMetrics = make(map[Metric]bool) - metricsRegistry = make(map[Metric]*MetricDescriptor) + registeredMetrics = make(map[string]bool) + metricsRegistry = make(map[string]*MetricDescriptor) maps.Copy(registeredMetrics, registeredMetrics) maps.Copy(metricsRegistry, metricsRegistry) diff --git a/vendor/google.golang.org/grpc/experimental/stats/metrics.go b/vendor/google.golang.org/grpc/experimental/stats/metrics.go index 3221f7a633..ee1423605a 100644 --- a/vendor/google.golang.org/grpc/experimental/stats/metrics.go +++ b/vendor/google.golang.org/grpc/experimental/stats/metrics.go @@ -19,7 +19,7 @@ // Package stats contains experimental metrics/stats API's. package stats -import "maps" +import "google.golang.org/grpc/stats" // MetricsRecorder records on metrics derived from metric registry. type MetricsRecorder interface { @@ -40,75 +40,15 @@ type MetricsRecorder interface { RecordInt64Gauge(handle *Int64GaugeHandle, incr int64, labels ...string) } -// Metric is an identifier for a metric. -type Metric string +// Metrics is an experimental legacy alias of the now-stable stats.MetricSet. +// Metrics will be deleted in a future release. +type Metrics = stats.MetricSet -// Metrics is a set of metrics to record. Once created, Metrics is immutable, -// however Add and Remove can make copies with specific metrics added or -// removed, respectively. -// -// Do not construct directly; use NewMetrics instead. -type Metrics struct { - // metrics are the set of metrics to initialize. - metrics map[Metric]bool -} +// Metric was replaced by direct usage of strings. +type Metric = string -// NewMetrics returns a Metrics containing Metrics. +// NewMetrics is an experimental legacy alias of the now-stable +// stats.NewMetricSet. NewMetrics will be deleted in a future release. func NewMetrics(metrics ...Metric) *Metrics { - newMetrics := make(map[Metric]bool) - for _, metric := range metrics { - newMetrics[metric] = true - } - return &Metrics{ - metrics: newMetrics, - } -} - -// Metrics returns the metrics set. The returned map is read-only and must not -// be modified. -func (m *Metrics) Metrics() map[Metric]bool { - return m.metrics -} - -// Add adds the metrics to the metrics set and returns a new copy with the -// additional metrics. -func (m *Metrics) Add(metrics ...Metric) *Metrics { - newMetrics := make(map[Metric]bool) - for metric := range m.metrics { - newMetrics[metric] = true - } - - for _, metric := range metrics { - newMetrics[metric] = true - } - return &Metrics{ - metrics: newMetrics, - } -} - -// Join joins the metrics passed in with the metrics set, and returns a new copy -// with the merged metrics. -func (m *Metrics) Join(metrics *Metrics) *Metrics { - newMetrics := make(map[Metric]bool) - maps.Copy(newMetrics, m.metrics) - maps.Copy(newMetrics, metrics.metrics) - return &Metrics{ - metrics: newMetrics, - } -} - -// Remove removes the metrics from the metrics set and returns a new copy with -// the metrics removed. -func (m *Metrics) Remove(metrics ...Metric) *Metrics { - newMetrics := make(map[Metric]bool) - for metric := range m.metrics { - newMetrics[metric] = true - } - - for _, metric := range metrics { - delete(newMetrics, metric) - } - return &Metrics{ - metrics: newMetrics, - } + return stats.NewMetricSet(metrics...) } diff --git a/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go b/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go index 07df71e98a..ed90060c3c 100644 --- a/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go +++ b/vendor/google.golang.org/grpc/grpclog/internal/loggerv2.go @@ -101,6 +101,22 @@ var severityName = []string{ fatalLog: "FATAL", } +// sprintf is fmt.Sprintf. +// These vars exist to make it possible to test that expensive format calls aren't made unnecessarily. +var sprintf = fmt.Sprintf + +// sprint is fmt.Sprint. +// These vars exist to make it possible to test that expensive format calls aren't made unnecessarily. +var sprint = fmt.Sprint + +// sprintln is fmt.Sprintln. +// These vars exist to make it possible to test that expensive format calls aren't made unnecessarily. +var sprintln = fmt.Sprintln + +// exit is os.Exit. +// This var exists to make it possible to test functions calling os.Exit. +var exit = os.Exit + // loggerT is the default logger used by grpclog. type loggerT struct { m []*log.Logger @@ -111,7 +127,7 @@ type loggerT struct { func (g *loggerT) output(severity int, s string) { sevStr := severityName[severity] if !g.jsonFormat { - g.m[severity].Output(2, fmt.Sprintf("%v: %v", sevStr, s)) + g.m[severity].Output(2, sevStr+": "+s) return } // TODO: we can also include the logging component, but that needs more @@ -123,55 +139,79 @@ func (g *loggerT) output(severity int, s string) { g.m[severity].Output(2, string(b)) } +func (g *loggerT) printf(severity int, format string, args ...any) { + // Note the discard check is duplicated in each print func, rather than in + // output, to avoid the expensive Sprint calls. + // De-duplicating this by moving to output would be a significant performance regression! + if lg := g.m[severity]; lg.Writer() == io.Discard { + return + } + g.output(severity, sprintf(format, args...)) +} + +func (g *loggerT) print(severity int, v ...any) { + if lg := g.m[severity]; lg.Writer() == io.Discard { + return + } + g.output(severity, sprint(v...)) +} + +func (g *loggerT) println(severity int, v ...any) { + if lg := g.m[severity]; lg.Writer() == io.Discard { + return + } + g.output(severity, sprintln(v...)) +} + func (g *loggerT) Info(args ...any) { - g.output(infoLog, fmt.Sprint(args...)) + g.print(infoLog, args...) } func (g *loggerT) Infoln(args ...any) { - g.output(infoLog, fmt.Sprintln(args...)) + g.println(infoLog, args...) } func (g *loggerT) Infof(format string, args ...any) { - g.output(infoLog, fmt.Sprintf(format, args...)) + g.printf(infoLog, format, args...) } func (g *loggerT) Warning(args ...any) { - g.output(warningLog, fmt.Sprint(args...)) + g.print(warningLog, args...) } func (g *loggerT) Warningln(args ...any) { - g.output(warningLog, fmt.Sprintln(args...)) + g.println(warningLog, args...) } func (g *loggerT) Warningf(format string, args ...any) { - g.output(warningLog, fmt.Sprintf(format, args...)) + g.printf(warningLog, format, args...) } func (g *loggerT) Error(args ...any) { - g.output(errorLog, fmt.Sprint(args...)) + g.print(errorLog, args...) } func (g *loggerT) Errorln(args ...any) { - g.output(errorLog, fmt.Sprintln(args...)) + g.println(errorLog, args...) } func (g *loggerT) Errorf(format string, args ...any) { - g.output(errorLog, fmt.Sprintf(format, args...)) + g.printf(errorLog, format, args...) } func (g *loggerT) Fatal(args ...any) { - g.output(fatalLog, fmt.Sprint(args...)) - os.Exit(1) + g.print(fatalLog, args...) + exit(1) } func (g *loggerT) Fatalln(args ...any) { - g.output(fatalLog, fmt.Sprintln(args...)) - os.Exit(1) + g.println(fatalLog, args...) + exit(1) } func (g *loggerT) Fatalf(format string, args ...any) { - g.output(fatalLog, fmt.Sprintf(format, args...)) - os.Exit(1) + g.printf(fatalLog, format, args...) + exit(1) } func (g *loggerT) V(l int) bool { @@ -186,19 +226,42 @@ type LoggerV2Config struct { FormatJSON bool } +// combineLoggers returns a combined logger for both higher & lower severity logs, +// or only one if the other is io.Discard. +// +// This uses io.Discard instead of io.MultiWriter when all loggers +// are set to io.Discard. Both this package and the standard log package have +// significant optimizations for io.Discard, which io.MultiWriter lacks (as of +// this writing). +func combineLoggers(lower, higher io.Writer) io.Writer { + if lower == io.Discard { + return higher + } + if higher == io.Discard { + return lower + } + return io.MultiWriter(lower, higher) +} + // NewLoggerV2 creates a new LoggerV2 instance with the provided configuration. // The infoW, warningW, and errorW writers are used to write log messages of // different severity levels. func NewLoggerV2(infoW, warningW, errorW io.Writer, c LoggerV2Config) LoggerV2 { - var m []*log.Logger flag := log.LstdFlags if c.FormatJSON { flag = 0 } - m = append(m, log.New(infoW, "", flag)) - m = append(m, log.New(io.MultiWriter(infoW, warningW), "", flag)) - ew := io.MultiWriter(infoW, warningW, errorW) // ew will be used for error and fatal. - m = append(m, log.New(ew, "", flag)) - m = append(m, log.New(ew, "", flag)) + + warningW = combineLoggers(infoW, warningW) + errorW = combineLoggers(errorW, warningW) + + fatalW := errorW + + m := []*log.Logger{ + log.New(infoW, "", flag), + log.New(warningW, "", flag), + log.New(errorW, "", flag), + log.New(fatalW, "", flag), + } return &loggerT{m: m, v: c.Verbosity, jsonFormat: c.FormatJSON} } diff --git a/vendor/google.golang.org/grpc/internal/backoff/backoff.go b/vendor/google.golang.org/grpc/internal/backoff/backoff.go index b15cf482d2..b6ae7f2585 100644 --- a/vendor/google.golang.org/grpc/internal/backoff/backoff.go +++ b/vendor/google.golang.org/grpc/internal/backoff/backoff.go @@ -25,7 +25,7 @@ package backoff import ( "context" "errors" - "math/rand" + rand "math/rand/v2" "time" grpcbackoff "google.golang.org/grpc/backoff" diff --git a/vendor/google.golang.org/grpc/internal/internal.go b/vendor/google.golang.org/grpc/internal/internal.go index 20b4dc3d35..3afc181344 100644 --- a/vendor/google.golang.org/grpc/internal/internal.go +++ b/vendor/google.golang.org/grpc/internal/internal.go @@ -29,8 +29,6 @@ import ( ) var ( - // WithHealthCheckFunc is set by dialoptions.go - WithHealthCheckFunc any // func (HealthChecker) DialOption // HealthCheckFunc is used to provide client-side LB channel health checking HealthCheckFunc HealthChecker // BalancerUnregister is exported by package balancer to unregister a balancer. @@ -149,6 +147,20 @@ var ( // other features, including the CSDS service. NewXDSResolverWithConfigForTesting any // func([]byte) (resolver.Builder, error) + // NewXDSResolverWithClientForTesting creates a new xDS resolver builder + // using the provided xDS client instead of creating a new one using the + // bootstrap configuration specified by the supported environment variables. + // The resolver.Builder is meant to be used in conjunction with the + // grpc.WithResolvers DialOption. The resolver.Builder does not take + // ownership of the provided xDS client and it is the responsibility of the + // caller to close the client when no longer required. + // + // Testing Only + // + // This function should ONLY be used for testing and may not work with some + // other features, including the CSDS service. + NewXDSResolverWithClientForTesting any // func(xdsclient.XDSClient) (resolver.Builder, error) + // RegisterRLSClusterSpecifierPluginForTesting registers the RLS Cluster // Specifier Plugin for testing purposes, regardless of the XDSRLS environment // variable. @@ -255,3 +267,9 @@ const ( // It currently has an experimental suffix which would be removed once // end-to-end testing of the policy is completed. const RLSLoadBalancingPolicyName = "rls_experimental" + +// EnforceSubConnEmbedding is used to enforce proper SubConn implementation +// embedding. +type EnforceSubConnEmbedding interface { + enforceSubConnEmbedding() +} diff --git a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go index 374c12fb77..ba5c5a95d0 100644 --- a/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go +++ b/vendor/google.golang.org/grpc/internal/resolver/dns/dns_resolver.go @@ -24,8 +24,9 @@ import ( "context" "encoding/json" "fmt" - "math/rand" + rand "math/rand/v2" "net" + "net/netip" "os" "strconv" "strings" @@ -122,7 +123,7 @@ func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts } // IP address. - if ipAddr, ok := formatIP(host); ok { + if ipAddr, err := formatIP(host); err == nil { addr := []resolver.Address{{Addr: ipAddr + ":" + port}} cc.UpdateState(resolver.State{Addresses: addr}) return deadResolver{}, nil @@ -260,9 +261,9 @@ func (d *dnsResolver) lookupSRV(ctx context.Context) ([]resolver.Address, error) return nil, err } for _, a := range lbAddrs { - ip, ok := formatIP(a) - if !ok { - return nil, fmt.Errorf("dns: error parsing A record IP address %v", a) + ip, err := formatIP(a) + if err != nil { + return nil, fmt.Errorf("dns: error parsing A record IP address %v: %v", a, err) } addr := ip + ":" + strconv.Itoa(int(s.Port)) newAddrs = append(newAddrs, resolver.Address{Addr: addr, ServerName: s.Target}) @@ -322,9 +323,9 @@ func (d *dnsResolver) lookupHost(ctx context.Context) ([]resolver.Address, error } newAddrs := make([]resolver.Address, 0, len(addrs)) for _, a := range addrs { - ip, ok := formatIP(a) - if !ok { - return nil, fmt.Errorf("dns: error parsing A record IP address %v", a) + ip, err := formatIP(a) + if err != nil { + return nil, fmt.Errorf("dns: error parsing A record IP address %v: %v", a, err) } addr := ip + ":" + d.port newAddrs = append(newAddrs, resolver.Address{Addr: addr}) @@ -351,19 +352,19 @@ func (d *dnsResolver) lookup() (*resolver.State, error) { return &state, nil } -// formatIP returns ok = false if addr is not a valid textual representation of -// an IP address. If addr is an IPv4 address, return the addr and ok = true. +// formatIP returns an error if addr is not a valid textual representation of +// an IP address. If addr is an IPv4 address, return the addr and error = nil. // If addr is an IPv6 address, return the addr enclosed in square brackets and -// ok = true. -func formatIP(addr string) (addrIP string, ok bool) { - ip := net.ParseIP(addr) - if ip == nil { - return "", false +// error = nil. +func formatIP(addr string) (string, error) { + ip, err := netip.ParseAddr(addr) + if err != nil { + return "", err } - if ip.To4() != nil { - return addr, true + if ip.Is4() { + return addr, nil } - return "[" + addr + "]", true + return "[" + addr + "]", nil } // parseTarget takes the user input target string and default port, returns @@ -379,7 +380,7 @@ func parseTarget(target, defaultPort string) (host, port string, err error) { if target == "" { return "", "", internal.ErrMissingAddr } - if ip := net.ParseIP(target); ip != nil { + if _, err := netip.ParseAddr(target); err == nil { // target is an IPv4 or IPv6(without brackets) address return target, defaultPort, nil } @@ -427,7 +428,7 @@ func chosenByPercentage(a *int) bool { if a == nil { return true } - return rand.Intn(100)+1 <= *a + return rand.IntN(100)+1 <= *a } func canaryingSC(js string) string { diff --git a/vendor/google.golang.org/grpc/internal/transport/client_stream.go b/vendor/google.golang.org/grpc/internal/transport/client_stream.go new file mode 100644 index 0000000000..8ed347c541 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/client_stream.go @@ -0,0 +1,144 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "sync/atomic" + + "golang.org/x/net/http2" + "google.golang.org/grpc/mem" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// ClientStream implements streaming functionality for a gRPC client. +type ClientStream struct { + *Stream // Embed for common stream functionality. + + ct *http2Client + done chan struct{} // closed at the end of stream to unblock writers. + doneFunc func() // invoked at the end of stream. + + headerChan chan struct{} // closed to indicate the end of header metadata. + headerChanClosed uint32 // set when headerChan is closed. Used to avoid closing headerChan multiple times. + // headerValid indicates whether a valid header was received. Only + // meaningful after headerChan is closed (always call waitOnHeader() before + // reading its value). + headerValid bool + header metadata.MD // the received header metadata + noHeaders bool // set if the client never received headers (set only after the stream is done). + + bytesReceived atomic.Bool // indicates whether any bytes have been received on this stream + unprocessed atomic.Bool // set if the server sends a refused stream or GOAWAY including this stream + + status *status.Status // the status error received from the server +} + +// Read reads an n byte message from the input stream. +func (s *ClientStream) Read(n int) (mem.BufferSlice, error) { + b, err := s.Stream.read(n) + if err == nil { + s.ct.incrMsgRecv() + } + return b, err +} + +// Close closes the stream and popagates err to any readers. +func (s *ClientStream) Close(err error) { + var ( + rst bool + rstCode http2.ErrCode + ) + if err != nil { + rst = true + rstCode = http2.ErrCodeCancel + } + s.ct.closeStream(s, err, rst, rstCode, status.Convert(err), nil, false) +} + +// Write writes the hdr and data bytes to the output stream. +func (s *ClientStream) Write(hdr []byte, data mem.BufferSlice, opts *WriteOptions) error { + return s.ct.write(s, hdr, data, opts) +} + +// BytesReceived indicates whether any bytes have been received on this stream. +func (s *ClientStream) BytesReceived() bool { + return s.bytesReceived.Load() +} + +// Unprocessed indicates whether the server did not process this stream -- +// i.e. it sent a refused stream or GOAWAY including this stream ID. +func (s *ClientStream) Unprocessed() bool { + return s.unprocessed.Load() +} + +func (s *ClientStream) waitOnHeader() { + select { + case <-s.ctx.Done(): + // Close the stream to prevent headers/trailers from changing after + // this function returns. + s.Close(ContextErr(s.ctx.Err())) + // headerChan could possibly not be closed yet if closeStream raced + // with operateHeaders; wait until it is closed explicitly here. + <-s.headerChan + case <-s.headerChan: + } +} + +// RecvCompress returns the compression algorithm applied to the inbound +// message. It is empty string if there is no compression applied. +func (s *ClientStream) RecvCompress() string { + s.waitOnHeader() + return s.recvCompress +} + +// Done returns a channel which is closed when it receives the final status +// from the server. +func (s *ClientStream) Done() <-chan struct{} { + return s.done +} + +// Header returns the header metadata of the stream. Acquires the key-value +// pairs of header metadata once it is available. It blocks until i) the +// metadata is ready or ii) there is no header metadata or iii) the stream is +// canceled/expired. +func (s *ClientStream) Header() (metadata.MD, error) { + s.waitOnHeader() + + if !s.headerValid || s.noHeaders { + return nil, s.status.Err() + } + + return s.header.Copy(), nil +} + +// TrailersOnly blocks until a header or trailers-only frame is received and +// then returns true if the stream was trailers-only. If the stream ends +// before headers are received, returns true, nil. +func (s *ClientStream) TrailersOnly() bool { + s.waitOnHeader() + return s.noHeaders +} + +// Status returns the status received from the server. +// Status can be read safely only after the stream has ended, +// that is, after Done() is closed. +func (s *ClientStream) Status() *status.Status { + return s.status +} diff --git a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go index 97198c5158..dfc0f224ec 100644 --- a/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go +++ b/vendor/google.golang.org/grpc/internal/transport/flowcontrol.go @@ -92,14 +92,11 @@ func (f *trInFlow) newLimit(n uint32) uint32 { func (f *trInFlow) onData(n uint32) uint32 { f.unacked += n - if f.unacked >= f.limit/4 { - w := f.unacked - f.unacked = 0 + if f.unacked < f.limit/4 { f.updateEffectiveWindowSize() - return w + return 0 } - f.updateEffectiveWindowSize() - return 0 + return f.reset() } func (f *trInFlow) reset() uint32 { diff --git a/vendor/google.golang.org/grpc/internal/transport/handler_server.go b/vendor/google.golang.org/grpc/internal/transport/handler_server.go index ce878693bd..d9305a65d8 100644 --- a/vendor/google.golang.org/grpc/internal/transport/handler_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/handler_server.go @@ -225,7 +225,7 @@ func (ht *serverHandlerTransport) do(fn func()) error { } } -func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) error { +func (ht *serverHandlerTransport) writeStatus(s *ServerStream, st *status.Status) error { ht.writeStatusMu.Lock() defer ht.writeStatusMu.Unlock() @@ -289,14 +289,14 @@ func (ht *serverHandlerTransport) WriteStatus(s *Stream, st *status.Status) erro // writePendingHeaders sets common and custom headers on the first // write call (Write, WriteHeader, or WriteStatus) -func (ht *serverHandlerTransport) writePendingHeaders(s *Stream) { +func (ht *serverHandlerTransport) writePendingHeaders(s *ServerStream) { ht.writeCommonHeaders(s) ht.writeCustomHeaders(s) } // writeCommonHeaders sets common headers on the first write // call (Write, WriteHeader, or WriteStatus). -func (ht *serverHandlerTransport) writeCommonHeaders(s *Stream) { +func (ht *serverHandlerTransport) writeCommonHeaders(s *ServerStream) { h := ht.rw.Header() h["Date"] = nil // suppress Date to make tests happy; TODO: restore h.Set("Content-Type", ht.contentType) @@ -317,7 +317,7 @@ func (ht *serverHandlerTransport) writeCommonHeaders(s *Stream) { // writeCustomHeaders sets custom headers set on the stream via SetHeader // on the first write call (Write, WriteHeader, or WriteStatus) -func (ht *serverHandlerTransport) writeCustomHeaders(s *Stream) { +func (ht *serverHandlerTransport) writeCustomHeaders(s *ServerStream) { h := ht.rw.Header() s.hdrMu.Lock() @@ -333,7 +333,7 @@ func (ht *serverHandlerTransport) writeCustomHeaders(s *Stream) { s.hdrMu.Unlock() } -func (ht *serverHandlerTransport) Write(s *Stream, hdr []byte, data mem.BufferSlice, _ *Options) error { +func (ht *serverHandlerTransport) write(s *ServerStream, hdr []byte, data mem.BufferSlice, _ *WriteOptions) error { // Always take a reference because otherwise there is no guarantee the data will // be available after this function returns. This is what callers to Write // expect. @@ -357,7 +357,7 @@ func (ht *serverHandlerTransport) Write(s *Stream, hdr []byte, data mem.BufferSl return nil } -func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { +func (ht *serverHandlerTransport) writeHeader(s *ServerStream, md metadata.MD) error { if err := s.SetHeader(md); err != nil { return err } @@ -385,7 +385,7 @@ func (ht *serverHandlerTransport) WriteHeader(s *Stream, md metadata.MD) error { return err } -func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream func(*Stream)) { +func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream func(*ServerStream)) { // With this transport type there will be exactly 1 stream: this HTTP request. var cancel context.CancelFunc if ht.timeoutSet { @@ -408,16 +408,18 @@ func (ht *serverHandlerTransport) HandleStreams(ctx context.Context, startStream ctx = metadata.NewIncomingContext(ctx, ht.headerMD) req := ht.req - s := &Stream{ - id: 0, // irrelevant - ctx: ctx, - requestRead: func(int) {}, + s := &ServerStream{ + Stream: &Stream{ + id: 0, // irrelevant + ctx: ctx, + requestRead: func(int) {}, + buf: newRecvBuffer(), + method: req.URL.Path, + recvCompress: req.Header.Get("grpc-encoding"), + contentSubtype: ht.contentSubtype, + }, cancel: cancel, - buf: newRecvBuffer(), st: ht, - method: req.URL.Path, - recvCompress: req.Header.Get("grpc-encoding"), - contentSubtype: ht.contentSubtype, headerWireLength: 0, // won't have access to header wire length until golang/go#18997. } s.trReader = &transportReader{ @@ -471,9 +473,7 @@ func (ht *serverHandlerTransport) runStream() { } } -func (ht *serverHandlerTransport) IncrMsgSent() {} - -func (ht *serverHandlerTransport) IncrMsgRecv() {} +func (ht *serverHandlerTransport) incrMsgRecv() {} func (ht *serverHandlerTransport) Drain(string) { panic("Drain() is not implemented") diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_client.go b/vendor/google.golang.org/grpc/internal/transport/http2_client.go index 62b81885d8..f323ab7f45 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_client.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_client.go @@ -123,7 +123,7 @@ type http2Client struct { mu sync.Mutex // guard the following variables nextID uint32 state transportState - activeStreams map[uint32]*Stream + activeStreams map[uint32]*ClientStream // prevGoAway ID records the Last-Stream-ID in the previous GOAway frame. prevGoAwayID uint32 // goAwayReason records the http2.ErrCode and debug data received with the @@ -199,10 +199,10 @@ func isTemporary(err error) bool { return true } -// newHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 +// NewHTTP2Client constructs a connected ClientTransport to addr based on HTTP2 // and starts to receive messages on it. Non-nil error returns if construction // fails. -func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (_ *http2Client, err error) { +func NewHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (_ ClientTransport, err error) { scheme := "http" ctx, cancel := context.WithCancel(ctx) defer func() { @@ -339,7 +339,7 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts framer: newFramer(conn, writeBufSize, readBufSize, opts.SharedWriteBuffer, maxHeaderListSize), fc: &trInFlow{limit: uint32(icwz)}, scheme: scheme, - activeStreams: make(map[uint32]*Stream), + activeStreams: make(map[uint32]*ClientStream), isSecure: isSecure, perRPCCreds: perRPCCreds, kp: kp, @@ -480,17 +480,19 @@ func newHTTP2Client(connectCtx, ctx context.Context, addr resolver.Address, opts return t, nil } -func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { +func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *ClientStream { // TODO(zhaoq): Handle uint32 overflow of Stream.id. - s := &Stream{ - ct: t, - done: make(chan struct{}), - method: callHdr.Method, - sendCompress: callHdr.SendCompress, - buf: newRecvBuffer(), - headerChan: make(chan struct{}), - contentSubtype: callHdr.ContentSubtype, - doneFunc: callHdr.DoneFunc, + s := &ClientStream{ + Stream: &Stream{ + method: callHdr.Method, + sendCompress: callHdr.SendCompress, + buf: newRecvBuffer(), + contentSubtype: callHdr.ContentSubtype, + }, + ct: t, + done: make(chan struct{}), + headerChan: make(chan struct{}), + doneFunc: callHdr.DoneFunc, } s.wq = newWriteQuota(defaultWriteQuota, s.done) s.requestRead = func(n int) { @@ -506,7 +508,7 @@ func (t *http2Client) newStream(ctx context.Context, callHdr *CallHdr) *Stream { ctxDone: s.ctx.Done(), recv: s.buf, closeStream: func(err error) { - t.CloseStream(s, err) + s.Close(err) }, }, windowHandler: func(n int) { @@ -597,12 +599,6 @@ func (t *http2Client) createHeaderFields(ctx context.Context, callHdr *CallHdr) for k, v := range callAuthData { headerFields = append(headerFields, hpack.HeaderField{Name: k, Value: encodeMetadataHeader(k, v)}) } - if b := stats.OutgoingTags(ctx); b != nil { - headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-tags-bin", Value: encodeBinHeader(b)}) - } - if b := stats.OutgoingTrace(ctx); b != nil { - headerFields = append(headerFields, hpack.HeaderField{Name: "grpc-trace-bin", Value: encodeBinHeader(b)}) - } if md, added, ok := metadataFromOutgoingContextRaw(ctx); ok { var k string @@ -738,7 +734,7 @@ func (e NewStreamError) Error() string { // NewStream creates a stream and registers it into the transport as "active" // streams. All non-nil errors returned will be *NewStreamError. -func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) { +func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*ClientStream, error) { ctx = peer.NewContext(ctx, t.getPeer()) // ServerName field of the resolver returned address takes precedence over @@ -763,7 +759,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return } // The stream was unprocessed by the server. - atomic.StoreUint32(&s.unprocessed, 1) + s.unprocessed.Store(true) s.write(recvMsg{err: err}) close(s.done) // If headerChan isn't closed, then close it. @@ -908,21 +904,7 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, return s, nil } -// CloseStream clears the footprint of a stream when the stream is not needed any more. -// This must not be executed in reader's goroutine. -func (t *http2Client) CloseStream(s *Stream, err error) { - var ( - rst bool - rstCode http2.ErrCode - ) - if err != nil { - rst = true - rstCode = http2.ErrCodeCancel - } - t.closeStream(s, err, rst, rstCode, status.Convert(err), nil, false) -} - -func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2.ErrCode, st *status.Status, mdata map[string][]string, eosReceived bool) { +func (t *http2Client) closeStream(s *ClientStream, err error, rst bool, rstCode http2.ErrCode, st *status.Status, mdata map[string][]string, eosReceived bool) { // Set stream status to done. if s.swapState(streamDone) == streamDone { // If it was already done, return. If multiple closeStream calls @@ -1085,7 +1067,7 @@ func (t *http2Client) GracefulClose() { // Write formats the data into HTTP2 data frame(s) and sends it out. The caller // should proceed only if Write returns nil. -func (t *http2Client) Write(s *Stream, hdr []byte, data mem.BufferSlice, opts *Options) error { +func (t *http2Client) write(s *ClientStream, hdr []byte, data mem.BufferSlice, opts *WriteOptions) error { reader := data.Reader() if opts.Last { @@ -1114,10 +1096,11 @@ func (t *http2Client) Write(s *Stream, hdr []byte, data mem.BufferSlice, opts *O _ = reader.Close() return err } + t.incrMsgSent() return nil } -func (t *http2Client) getStream(f http2.Frame) *Stream { +func (t *http2Client) getStream(f http2.Frame) *ClientStream { t.mu.Lock() s := t.activeStreams[f.Header().StreamID] t.mu.Unlock() @@ -1127,7 +1110,7 @@ func (t *http2Client) getStream(f http2.Frame) *Stream { // adjustWindow sends out extra window update over the initial window size // of stream if the application is requesting data larger in size than // the window. -func (t *http2Client) adjustWindow(s *Stream, n uint32) { +func (t *http2Client) adjustWindow(s *ClientStream, n uint32) { if w := s.fc.maybeAdjust(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) } @@ -1136,7 +1119,7 @@ func (t *http2Client) adjustWindow(s *Stream, n uint32) { // updateWindow adjusts the inbound quota for the stream. // Window updates will be sent out when the cumulative quota // exceeds the corresponding threshold. -func (t *http2Client) updateWindow(s *Stream, n uint32) { +func (t *http2Client) updateWindow(s *ClientStream, n uint32) { if w := s.fc.onRead(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) } @@ -1242,7 +1225,7 @@ func (t *http2Client) handleRSTStream(f *http2.RSTStreamFrame) { } if f.ErrCode == http2.ErrCodeRefusedStream { // The stream was unprocessed by the server. - atomic.StoreUint32(&s.unprocessed, 1) + s.unprocessed.Store(true) } statusCode, ok := http2ErrConvTab[f.ErrCode] if !ok { @@ -1383,11 +1366,11 @@ func (t *http2Client) handleGoAway(f *http2.GoAwayFrame) error { return connectionErrorf(true, nil, "received goaway and there are no active streams") } - streamsToClose := make([]*Stream, 0) + streamsToClose := make([]*ClientStream, 0) for streamID, stream := range t.activeStreams { if streamID > id && streamID <= upperLimit { // The stream was unprocessed by the server. - atomic.StoreUint32(&stream.unprocessed, 1) + stream.unprocessed.Store(true) streamsToClose = append(streamsToClose, stream) } } @@ -1439,7 +1422,7 @@ func (t *http2Client) operateHeaders(frame *http2.MetaHeadersFrame) { return } endStream := frame.StreamEnded() - atomic.StoreUint32(&s.bytesReceived, 1) + s.bytesReceived.Store(true) initialHeader := atomic.LoadUint32(&s.headerChanClosed) == 0 if !initialHeader && !endStream { @@ -1809,14 +1792,18 @@ func (t *http2Client) socketMetrics() *channelz.EphemeralSocketMetrics { func (t *http2Client) RemoteAddr() net.Addr { return t.remoteAddr } -func (t *http2Client) IncrMsgSent() { - t.channelz.SocketMetrics.MessagesSent.Add(1) - t.channelz.SocketMetrics.LastMessageSentTimestamp.Store(time.Now().UnixNano()) +func (t *http2Client) incrMsgSent() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesSent.Add(1) + t.channelz.SocketMetrics.LastMessageSentTimestamp.Store(time.Now().UnixNano()) + } } -func (t *http2Client) IncrMsgRecv() { - t.channelz.SocketMetrics.MessagesReceived.Add(1) - t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Store(time.Now().UnixNano()) +func (t *http2Client) incrMsgRecv() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesReceived.Add(1) + t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Store(time.Now().UnixNano()) + } } func (t *http2Client) getOutFlowWindow() int64 { diff --git a/vendor/google.golang.org/grpc/internal/transport/http2_server.go b/vendor/google.golang.org/grpc/internal/transport/http2_server.go index 584b50fe55..0055fddd7e 100644 --- a/vendor/google.golang.org/grpc/internal/transport/http2_server.go +++ b/vendor/google.golang.org/grpc/internal/transport/http2_server.go @@ -25,7 +25,7 @@ import ( "fmt" "io" "math" - "math/rand" + rand "math/rand/v2" "net" "net/http" "strconv" @@ -111,7 +111,7 @@ type http2Server struct { // already initialized since draining is already underway. drainEvent *grpcsync.Event state transportState - activeStreams map[uint32]*Stream + activeStreams map[uint32]*ServerStream // idle is the time instant when the connection went idle. // This is either the beginning of the connection or when the number of // RPCs go down to 0. @@ -256,7 +256,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, inTapHandle: config.InTapHandle, fc: &trInFlow{limit: uint32(icwz)}, state: reachable, - activeStreams: make(map[uint32]*Stream), + activeStreams: make(map[uint32]*ServerStream), stats: config.StatsHandlers, kp: kp, idle: time.Now(), @@ -359,7 +359,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport, // operateHeaders takes action on the decoded headers. Returns an error if fatal // error encountered and transport needs to close, otherwise returns nil. -func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeadersFrame, handle func(*Stream)) error { +func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeadersFrame, handle func(*ServerStream)) error { // Acquire max stream ID lock for entire duration t.maxStreamMu.Lock() defer t.maxStreamMu.Unlock() @@ -385,11 +385,13 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade t.maxStreamID = streamID buf := newRecvBuffer() - s := &Stream{ - id: streamID, + s := &ServerStream{ + Stream: &Stream{ + id: streamID, + buf: buf, + fc: &inFlow{limit: uint32(t.initialWindowSize)}, + }, st: t, - buf: buf, - fc: &inFlow{limit: uint32(t.initialWindowSize)}, headerWireLength: int(frame.Header().Length), } var ( @@ -537,12 +539,6 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade // Attach the received metadata to the context. if len(mdata) > 0 { s.ctx = metadata.NewIncomingContext(s.ctx, mdata) - if statsTags := mdata["grpc-tags-bin"]; len(statsTags) > 0 { - s.ctx = stats.SetIncomingTags(s.ctx, []byte(statsTags[len(statsTags)-1])) - } - if statsTrace := mdata["grpc-trace-bin"]; len(statsTrace) > 0 { - s.ctx = stats.SetIncomingTrace(s.ctx, []byte(statsTrace[len(statsTrace)-1])) - } } t.mu.Lock() if t.state != reachable { @@ -634,7 +630,7 @@ func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeade // HandleStreams receives incoming streams using the given handler. This is // typically run in a separate goroutine. // traceCtx attaches trace to ctx and returns the new context. -func (t *http2Server) HandleStreams(ctx context.Context, handle func(*Stream)) { +func (t *http2Server) HandleStreams(ctx context.Context, handle func(*ServerStream)) { defer func() { close(t.readerDone) <-t.loopyWriterDone @@ -698,7 +694,7 @@ func (t *http2Server) HandleStreams(ctx context.Context, handle func(*Stream)) { } } -func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { +func (t *http2Server) getStream(f http2.Frame) (*ServerStream, bool) { t.mu.Lock() defer t.mu.Unlock() if t.activeStreams == nil { @@ -716,7 +712,7 @@ func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { // adjustWindow sends out extra window update over the initial window size // of stream if the application is requesting data larger in size than // the window. -func (t *http2Server) adjustWindow(s *Stream, n uint32) { +func (t *http2Server) adjustWindow(s *ServerStream, n uint32) { if w := s.fc.maybeAdjust(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w}) } @@ -726,7 +722,7 @@ func (t *http2Server) adjustWindow(s *Stream, n uint32) { // updateWindow adjusts the inbound quota for the stream and the transport. // Window updates will deliver to the controller for sending when // the cumulative quota exceeds the corresponding threshold. -func (t *http2Server) updateWindow(s *Stream, n uint32) { +func (t *http2Server) updateWindow(s *ServerStream, n uint32) { if w := s.fc.onRead(n); w > 0 { t.controlBuf.put(&outgoingWindowUpdate{streamID: s.id, increment: w, @@ -963,7 +959,7 @@ func (t *http2Server) checkForHeaderListSize(it any) bool { return true } -func (t *http2Server) streamContextErr(s *Stream) error { +func (t *http2Server) streamContextErr(s *ServerStream) error { select { case <-t.done: return ErrConnClosing @@ -973,7 +969,7 @@ func (t *http2Server) streamContextErr(s *Stream) error { } // WriteHeader sends the header metadata md back to the client. -func (t *http2Server) WriteHeader(s *Stream, md metadata.MD) error { +func (t *http2Server) writeHeader(s *ServerStream, md metadata.MD) error { s.hdrMu.Lock() defer s.hdrMu.Unlock() if s.getState() == streamDone { @@ -1006,7 +1002,7 @@ func (t *http2Server) setResetPingStrikes() { atomic.StoreUint32(&t.resetPingStrikes, 1) } -func (t *http2Server) writeHeaderLocked(s *Stream) error { +func (t *http2Server) writeHeaderLocked(s *ServerStream) error { // TODO(mmukhi): Benchmark if the performance gets better if count the metadata and other header fields // first and create a slice of that exact size. headerFields := make([]hpack.HeaderField, 0, 2) // at least :status, content-type will be there if none else. @@ -1046,7 +1042,7 @@ func (t *http2Server) writeHeaderLocked(s *Stream) error { // There is no further I/O operations being able to perform on this stream. // TODO(zhaoq): Now it indicates the end of entire stream. Revisit if early // OK is adopted. -func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { +func (t *http2Server) writeStatus(s *ServerStream, st *status.Status) error { s.hdrMu.Lock() defer s.hdrMu.Unlock() @@ -1117,11 +1113,11 @@ func (t *http2Server) WriteStatus(s *Stream, st *status.Status) error { // Write converts the data into HTTP2 data frame and sends it out. Non-nil error // is returns if it fails (e.g., framing error, transport error). -func (t *http2Server) Write(s *Stream, hdr []byte, data mem.BufferSlice, _ *Options) error { +func (t *http2Server) write(s *ServerStream, hdr []byte, data mem.BufferSlice, _ *WriteOptions) error { reader := data.Reader() if !s.isHeaderSent() { // Headers haven't been written yet. - if err := t.WriteHeader(s, nil); err != nil { + if err := t.writeHeader(s, nil); err != nil { _ = reader.Close() return err } @@ -1147,6 +1143,7 @@ func (t *http2Server) Write(s *Stream, hdr []byte, data mem.BufferSlice, _ *Opti _ = reader.Close() return err } + t.incrMsgSent() return nil } @@ -1276,7 +1273,7 @@ func (t *http2Server) Close(err error) { } // deleteStream deletes the stream s from transport's active streams. -func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { +func (t *http2Server) deleteStream(s *ServerStream, eosReceived bool) { t.mu.Lock() if _, ok := t.activeStreams[s.id]; ok { @@ -1297,7 +1294,7 @@ func (t *http2Server) deleteStream(s *Stream, eosReceived bool) { } // finishStream closes the stream and puts the trailing headerFrame into controlbuf. -func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, hdr *headerFrame, eosReceived bool) { +func (t *http2Server) finishStream(s *ServerStream, rst bool, rstCode http2.ErrCode, hdr *headerFrame, eosReceived bool) { // In case stream sending and receiving are invoked in separate // goroutines (e.g., bi-directional streaming), cancel needs to be // called to interrupt the potential blocking on other goroutines. @@ -1321,7 +1318,7 @@ func (t *http2Server) finishStream(s *Stream, rst bool, rstCode http2.ErrCode, h } // closeStream clears the footprint of a stream when the stream is not needed any more. -func (t *http2Server) closeStream(s *Stream, rst bool, rstCode http2.ErrCode, eosReceived bool) { +func (t *http2Server) closeStream(s *ServerStream, rst bool, rstCode http2.ErrCode, eosReceived bool) { // In case stream sending and receiving are invoked in separate // goroutines (e.g., bi-directional streaming), cancel needs to be // called to interrupt the potential blocking on other goroutines. @@ -1415,14 +1412,18 @@ func (t *http2Server) socketMetrics() *channelz.EphemeralSocketMetrics { } } -func (t *http2Server) IncrMsgSent() { - t.channelz.SocketMetrics.MessagesSent.Add(1) - t.channelz.SocketMetrics.LastMessageSentTimestamp.Add(1) +func (t *http2Server) incrMsgSent() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesSent.Add(1) + t.channelz.SocketMetrics.LastMessageSentTimestamp.Add(1) + } } -func (t *http2Server) IncrMsgRecv() { - t.channelz.SocketMetrics.MessagesReceived.Add(1) - t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Add(1) +func (t *http2Server) incrMsgRecv() { + if channelz.IsOn() { + t.channelz.SocketMetrics.MessagesReceived.Add(1) + t.channelz.SocketMetrics.LastMessageReceivedTimestamp.Add(1) + } } func (t *http2Server) getOutFlowWindow() int64 { @@ -1455,7 +1456,7 @@ func getJitter(v time.Duration) time.Duration { } // Generate a jitter between +/- 10% of the value. r := int64(v / 10) - j := rand.Int63n(2*r) - r + j := rand.Int64N(2*r) - r return time.Duration(j) } diff --git a/vendor/google.golang.org/grpc/internal/transport/server_stream.go b/vendor/google.golang.org/grpc/internal/transport/server_stream.go new file mode 100644 index 0000000000..a22a901514 --- /dev/null +++ b/vendor/google.golang.org/grpc/internal/transport/server_stream.go @@ -0,0 +1,178 @@ +/* + * + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package transport + +import ( + "context" + "errors" + "strings" + "sync" + "sync/atomic" + + "google.golang.org/grpc/mem" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// ServerStream implements streaming functionality for a gRPC server. +type ServerStream struct { + *Stream // Embed for common stream functionality. + + st internalServerTransport + ctxDone <-chan struct{} // closed at the end of stream. Cache of ctx.Done() (for performance) + cancel context.CancelFunc // invoked at the end of stream to cancel ctx. + + // Holds compressor names passed in grpc-accept-encoding metadata from the + // client. + clientAdvertisedCompressors string + headerWireLength int + + // hdrMu protects outgoing header and trailer metadata. + hdrMu sync.Mutex + header metadata.MD // the outgoing header metadata. Updated by WriteHeader. + headerSent atomic.Bool // atomically set when the headers are sent out. +} + +// Read reads an n byte message from the input stream. +func (s *ServerStream) Read(n int) (mem.BufferSlice, error) { + b, err := s.Stream.read(n) + if err == nil { + s.st.incrMsgRecv() + } + return b, err +} + +// SendHeader sends the header metadata for the given stream. +func (s *ServerStream) SendHeader(md metadata.MD) error { + return s.st.writeHeader(s, md) +} + +// Write writes the hdr and data bytes to the output stream. +func (s *ServerStream) Write(hdr []byte, data mem.BufferSlice, opts *WriteOptions) error { + return s.st.write(s, hdr, data, opts) +} + +// WriteStatus sends the status of a stream to the client. WriteStatus is +// the final call made on a stream and always occurs. +func (s *ServerStream) WriteStatus(st *status.Status) error { + return s.st.writeStatus(s, st) +} + +// isHeaderSent indicates whether headers have been sent. +func (s *ServerStream) isHeaderSent() bool { + return s.headerSent.Load() +} + +// updateHeaderSent updates headerSent and returns true +// if it was already set. +func (s *ServerStream) updateHeaderSent() bool { + return s.headerSent.Swap(true) +} + +// RecvCompress returns the compression algorithm applied to the inbound +// message. It is empty string if there is no compression applied. +func (s *ServerStream) RecvCompress() string { + return s.recvCompress +} + +// SendCompress returns the send compressor name. +func (s *ServerStream) SendCompress() string { + return s.sendCompress +} + +// ContentSubtype returns the content-subtype for a request. For example, a +// content-subtype of "proto" will result in a content-type of +// "application/grpc+proto". This will always be lowercase. See +// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for +// more details. +func (s *ServerStream) ContentSubtype() string { + return s.contentSubtype +} + +// SetSendCompress sets the compression algorithm to the stream. +func (s *ServerStream) SetSendCompress(name string) error { + if s.isHeaderSent() || s.getState() == streamDone { + return errors.New("transport: set send compressor called after headers sent or stream done") + } + + s.sendCompress = name + return nil +} + +// SetContext sets the context of the stream. This will be deleted once the +// stats handler callouts all move to gRPC layer. +func (s *ServerStream) SetContext(ctx context.Context) { + s.ctx = ctx +} + +// ClientAdvertisedCompressors returns the compressor names advertised by the +// client via grpc-accept-encoding header. +func (s *ServerStream) ClientAdvertisedCompressors() []string { + values := strings.Split(s.clientAdvertisedCompressors, ",") + for i, v := range values { + values[i] = strings.TrimSpace(v) + } + return values +} + +// Header returns the header metadata of the stream. It returns the out header +// after t.WriteHeader is called. It does not block and must not be called +// until after WriteHeader. +func (s *ServerStream) Header() (metadata.MD, error) { + // Return the header in stream. It will be the out + // header after t.WriteHeader is called. + return s.header.Copy(), nil +} + +// HeaderWireLength returns the size of the headers of the stream as received +// from the wire. +func (s *ServerStream) HeaderWireLength() int { + return s.headerWireLength +} + +// SetHeader sets the header metadata. This can be called multiple times. +// This should not be called in parallel to other data writes. +func (s *ServerStream) SetHeader(md metadata.MD) error { + if md.Len() == 0 { + return nil + } + if s.isHeaderSent() || s.getState() == streamDone { + return ErrIllegalHeaderWrite + } + s.hdrMu.Lock() + s.header = metadata.Join(s.header, md) + s.hdrMu.Unlock() + return nil +} + +// SetTrailer sets the trailer metadata which will be sent with the RPC status +// by the server. This can be called multiple times. +// This should not be called parallel to other data writes. +func (s *ServerStream) SetTrailer(md metadata.MD) error { + if md.Len() == 0 { + return nil + } + if s.getState() == streamDone { + return ErrIllegalHeaderWrite + } + s.hdrMu.Lock() + s.trailer = metadata.Join(s.trailer, md) + s.hdrMu.Unlock() + return nil +} diff --git a/vendor/google.golang.org/grpc/internal/transport/transport.go b/vendor/google.golang.org/grpc/internal/transport/transport.go index e12cb0bc91..2859b87755 100644 --- a/vendor/google.golang.org/grpc/internal/transport/transport.go +++ b/vendor/google.golang.org/grpc/internal/transport/transport.go @@ -27,7 +27,6 @@ import ( "fmt" "io" "net" - "strings" "sync" "sync/atomic" "time" @@ -39,7 +38,6 @@ import ( "google.golang.org/grpc/mem" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" - "google.golang.org/grpc/resolver" "google.golang.org/grpc/stats" "google.golang.org/grpc/status" "google.golang.org/grpc/tap" @@ -133,7 +131,7 @@ type recvBufferReader struct { err error } -func (r *recvBufferReader) ReadHeader(header []byte) (n int, err error) { +func (r *recvBufferReader) ReadMessageHeader(header []byte) (n int, err error) { if r.err != nil { return 0, r.err } @@ -142,9 +140,9 @@ func (r *recvBufferReader) ReadHeader(header []byte) (n int, err error) { return n, nil } if r.closeStream != nil { - n, r.err = r.readHeaderClient(header) + n, r.err = r.readMessageHeaderClient(header) } else { - n, r.err = r.readHeader(header) + n, r.err = r.readMessageHeader(header) } return n, r.err } @@ -174,12 +172,12 @@ func (r *recvBufferReader) Read(n int) (buf mem.Buffer, err error) { return buf, r.err } -func (r *recvBufferReader) readHeader(header []byte) (n int, err error) { +func (r *recvBufferReader) readMessageHeader(header []byte) (n int, err error) { select { case <-r.ctxDone: return 0, ContextErr(r.ctx.Err()) case m := <-r.recv.get(): - return r.readHeaderAdditional(m, header) + return r.readMessageHeaderAdditional(m, header) } } @@ -192,7 +190,7 @@ func (r *recvBufferReader) read(n int) (buf mem.Buffer, err error) { } } -func (r *recvBufferReader) readHeaderClient(header []byte) (n int, err error) { +func (r *recvBufferReader) readMessageHeaderClient(header []byte) (n int, err error) { // If the context is canceled, then closes the stream with nil metadata. // closeStream writes its error parameter to r.recv as a recvMsg. // r.readAdditional acts on that message and returns the necessary error. @@ -213,9 +211,9 @@ func (r *recvBufferReader) readHeaderClient(header []byte) (n int, err error) { // faster. r.closeStream(ContextErr(r.ctx.Err())) m := <-r.recv.get() - return r.readHeaderAdditional(m, header) + return r.readMessageHeaderAdditional(m, header) case m := <-r.recv.get(): - return r.readHeaderAdditional(m, header) + return r.readMessageHeaderAdditional(m, header) } } @@ -246,7 +244,7 @@ func (r *recvBufferReader) readClient(n int) (buf mem.Buffer, err error) { } } -func (r *recvBufferReader) readHeaderAdditional(m recvMsg, header []byte) (n int, err error) { +func (r *recvBufferReader) readMessageHeaderAdditional(m recvMsg, header []byte) (n int, err error) { r.recv.load() if m.err != nil { if m.buffer != nil { @@ -288,14 +286,8 @@ const ( // Stream represents an RPC in the transport layer. type Stream struct { id uint32 - st ServerTransport // nil for client side Stream - ct ClientTransport // nil for server side Stream - ctx context.Context // the associated context of the stream - cancel context.CancelFunc // always nil for client side Stream - done chan struct{} // closed at the end of stream to unblock writers. On the client side. - doneFunc func() // invoked at the end of stream on client side. - ctxDone <-chan struct{} // same as done chan but for server side. Cache of ctx.Done() (for performance) - method string // the associated RPC method of the stream + ctx context.Context // the associated context of the stream + method string // the associated RPC method of the stream recvCompress string sendCompress string buf *recvBuffer @@ -303,58 +295,17 @@ type Stream struct { fc *inFlow wq *writeQuota - // Holds compressor names passed in grpc-accept-encoding metadata from the - // client. This is empty for the client side stream. - clientAdvertisedCompressors string // Callback to state application's intentions to read data. This // is used to adjust flow control, if needed. requestRead func(int) - headerChan chan struct{} // closed to indicate the end of header metadata. - headerChanClosed uint32 // set when headerChan is closed. Used to avoid closing headerChan multiple times. - // headerValid indicates whether a valid header was received. Only - // meaningful after headerChan is closed (always call waitOnHeader() before - // reading its value). Not valid on server side. - headerValid bool - headerWireLength int // Only set on server side. - - // hdrMu protects header and trailer metadata on the server-side. - hdrMu sync.Mutex - // On client side, header keeps the received header metadata. - // - // On server side, header keeps the header set by SetHeader(). The complete - // header will merged into this after t.WriteHeader() is called. - header metadata.MD - trailer metadata.MD // the key-value map of trailer metadata. - - noHeaders bool // set if the client never received headers (set only after the stream is done). - - // On the server-side, headerSent is atomically set to 1 when the headers are sent out. - headerSent uint32 - state streamState - // On client-side it is the status error received from the server. - // On server-side it is unused. - status *status.Status - - bytesReceived uint32 // indicates whether any bytes have been received on this stream - unprocessed uint32 // set if the server sends a refused stream or GOAWAY including this stream - // contentSubtype is the content-subtype for requests. // this must be lowercase or the behavior is undefined. contentSubtype string -} - -// isHeaderSent is only valid on the server-side. -func (s *Stream) isHeaderSent() bool { - return atomic.LoadUint32(&s.headerSent) == 1 -} -// updateHeaderSent updates headerSent and returns true -// if it was already set. It is valid only on server-side. -func (s *Stream) updateHeaderSent() bool { - return atomic.SwapUint32(&s.headerSent, 1) == 1 + trailer metadata.MD // the key-value map of trailer metadata. } func (s *Stream) swapState(st streamState) streamState { @@ -369,110 +320,12 @@ func (s *Stream) getState() streamState { return streamState(atomic.LoadUint32((*uint32)(&s.state))) } -func (s *Stream) waitOnHeader() { - if s.headerChan == nil { - // On the server headerChan is always nil since a stream originates - // only after having received headers. - return - } - select { - case <-s.ctx.Done(): - // Close the stream to prevent headers/trailers from changing after - // this function returns. - s.ct.CloseStream(s, ContextErr(s.ctx.Err())) - // headerChan could possibly not be closed yet if closeStream raced - // with operateHeaders; wait until it is closed explicitly here. - <-s.headerChan - case <-s.headerChan: - } -} - -// RecvCompress returns the compression algorithm applied to the inbound -// message. It is empty string if there is no compression applied. -func (s *Stream) RecvCompress() string { - s.waitOnHeader() - return s.recvCompress -} - -// SetSendCompress sets the compression algorithm to the stream. -func (s *Stream) SetSendCompress(name string) error { - if s.isHeaderSent() || s.getState() == streamDone { - return errors.New("transport: set send compressor called after headers sent or stream done") - } - - s.sendCompress = name - return nil -} - -// SendCompress returns the send compressor name. -func (s *Stream) SendCompress() string { - return s.sendCompress -} - -// ClientAdvertisedCompressors returns the compressor names advertised by the -// client via grpc-accept-encoding header. -func (s *Stream) ClientAdvertisedCompressors() []string { - values := strings.Split(s.clientAdvertisedCompressors, ",") - for i, v := range values { - values[i] = strings.TrimSpace(v) - } - return values -} - -// Done returns a channel which is closed when it receives the final status -// from the server. -func (s *Stream) Done() <-chan struct{} { - return s.done -} - -// Header returns the header metadata of the stream. -// -// On client side, it acquires the key-value pairs of header metadata once it is -// available. It blocks until i) the metadata is ready or ii) there is no header -// metadata or iii) the stream is canceled/expired. -// -// On server side, it returns the out header after t.WriteHeader is called. It -// does not block and must not be called until after WriteHeader. -func (s *Stream) Header() (metadata.MD, error) { - if s.headerChan == nil { - // On server side, return the header in stream. It will be the out - // header after t.WriteHeader is called. - return s.header.Copy(), nil - } - s.waitOnHeader() - - if !s.headerValid || s.noHeaders { - return nil, s.status.Err() - } - - return s.header.Copy(), nil -} - -// TrailersOnly blocks until a header or trailers-only frame is received and -// then returns true if the stream was trailers-only. If the stream ends -// before headers are received, returns true, nil. Client-side only. -func (s *Stream) TrailersOnly() bool { - s.waitOnHeader() - return s.noHeaders -} - // Trailer returns the cached trailer metadata. Note that if it is not called -// after the entire stream is done, it could return an empty MD. Client -// side only. +// after the entire stream is done, it could return an empty MD. // It can be safely read only after stream has ended that is either read // or write have returned io.EOF. func (s *Stream) Trailer() metadata.MD { - c := s.trailer.Copy() - return c -} - -// ContentSubtype returns the content-subtype for a request. For example, a -// content-subtype of "proto" will result in a content-type of -// "application/grpc+proto". This will always be lowercase. See -// https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests for -// more details. -func (s *Stream) ContentSubtype() string { - return s.contentSubtype + return s.trailer.Copy() } // Context returns the context of the stream. @@ -480,90 +333,31 @@ func (s *Stream) Context() context.Context { return s.ctx } -// SetContext sets the context of the stream. This will be deleted once the -// stats handler callouts all move to gRPC layer. -func (s *Stream) SetContext(ctx context.Context) { - s.ctx = ctx -} - // Method returns the method for the stream. func (s *Stream) Method() string { return s.method } -// Status returns the status received from the server. -// Status can be read safely only after the stream has ended, -// that is, after Done() is closed. -func (s *Stream) Status() *status.Status { - return s.status -} - -// HeaderWireLength returns the size of the headers of the stream as received -// from the wire. Valid only on the server. -func (s *Stream) HeaderWireLength() int { - return s.headerWireLength -} - -// SetHeader sets the header metadata. This can be called multiple times. -// Server side only. -// This should not be called in parallel to other data writes. -func (s *Stream) SetHeader(md metadata.MD) error { - if md.Len() == 0 { - return nil - } - if s.isHeaderSent() || s.getState() == streamDone { - return ErrIllegalHeaderWrite - } - s.hdrMu.Lock() - s.header = metadata.Join(s.header, md) - s.hdrMu.Unlock() - return nil -} - -// SendHeader sends the given header metadata. The given metadata is -// combined with any metadata set by previous calls to SetHeader and -// then written to the transport stream. -func (s *Stream) SendHeader(md metadata.MD) error { - return s.st.WriteHeader(s, md) -} - -// SetTrailer sets the trailer metadata which will be sent with the RPC status -// by the server. This can be called multiple times. Server side only. -// This should not be called parallel to other data writes. -func (s *Stream) SetTrailer(md metadata.MD) error { - if md.Len() == 0 { - return nil - } - if s.getState() == streamDone { - return ErrIllegalHeaderWrite - } - s.hdrMu.Lock() - s.trailer = metadata.Join(s.trailer, md) - s.hdrMu.Unlock() - return nil -} - func (s *Stream) write(m recvMsg) { s.buf.put(m) } -// ReadHeader reads data into the provided header slice from the stream. It -// first checks if there was an error during a previous read operation and +// ReadMessageHeader reads data into the provided header slice from the stream. +// It first checks if there was an error during a previous read operation and // returns it if present. It then requests a read operation for the length of // the header. It continues to read from the stream until the entire header -// slice is filled or an error occurs. If an `io.EOF` error is encountered -// with partially read data, it is converted to `io.ErrUnexpectedEOF` to -// indicate an unexpected end of the stream. The method returns any error -// encountered during the read process or nil if the header was successfully -// read. -func (s *Stream) ReadHeader(header []byte) (err error) { +// slice is filled or an error occurs. If an `io.EOF` error is encountered with +// partially read data, it is converted to `io.ErrUnexpectedEOF` to indicate an +// unexpected end of the stream. The method returns any error encountered during +// the read process or nil if the header was successfully read. +func (s *Stream) ReadMessageHeader(header []byte) (err error) { // Don't request a read if there was an error earlier if er := s.trReader.er; er != nil { return er } s.requestRead(len(header)) for len(header) != 0 { - n, err := s.trReader.ReadHeader(header) + n, err := s.trReader.ReadMessageHeader(header) header = header[n:] if len(header) == 0 { err = nil @@ -579,7 +373,7 @@ func (s *Stream) ReadHeader(header []byte) (err error) { } // Read reads n bytes from the wire for this stream. -func (s *Stream) Read(n int) (data mem.BufferSlice, err error) { +func (s *Stream) read(n int) (data mem.BufferSlice, err error) { // Don't request a read if there was an error earlier if er := s.trReader.er; er != nil { return nil, er @@ -619,8 +413,8 @@ type transportReader struct { er error } -func (t *transportReader) ReadHeader(header []byte) (int, error) { - n, err := t.reader.ReadHeader(header) +func (t *transportReader) ReadMessageHeader(header []byte) (int, error) { + n, err := t.reader.ReadMessageHeader(header) if err != nil { t.er = err return 0, err @@ -639,17 +433,6 @@ func (t *transportReader) Read(n int) (mem.Buffer, error) { return buf, nil } -// BytesReceived indicates whether any bytes have been received on this stream. -func (s *Stream) BytesReceived() bool { - return atomic.LoadUint32(&s.bytesReceived) == 1 -} - -// Unprocessed indicates whether the server did not process this stream -- -// i.e. it sent a refused stream or GOAWAY including this stream ID. -func (s *Stream) Unprocessed() bool { - return atomic.LoadUint32(&s.unprocessed) == 1 -} - // GoString is implemented by Stream so context.String() won't // race when printing %#v. func (s *Stream) GoString() string { @@ -725,15 +508,9 @@ type ConnectOptions struct { BufferPool mem.BufferPool } -// NewClientTransport establishes the transport with the required ConnectOptions -// and returns it to the caller. -func NewClientTransport(connectCtx, ctx context.Context, addr resolver.Address, opts ConnectOptions, onClose func(GoAwayReason)) (ClientTransport, error) { - return newHTTP2Client(connectCtx, ctx, addr, opts, onClose) -} - -// Options provides additional hints and information for message +// WriteOptions provides additional hints and information for message // transmission. -type Options struct { +type WriteOptions struct { // Last indicates whether this write is the last piece for // this stream. Last bool @@ -782,18 +559,8 @@ type ClientTransport interface { // It does not block. GracefulClose() - // Write sends the data for the given stream. A nil stream indicates - // the write is to be performed on the transport as a whole. - Write(s *Stream, hdr []byte, data mem.BufferSlice, opts *Options) error - // NewStream creates a Stream for an RPC. - NewStream(ctx context.Context, callHdr *CallHdr) (*Stream, error) - - // CloseStream clears the footprint of a stream when the stream is - // not needed any more. The err indicates the error incurred when - // CloseStream is called. Must be called when a stream is finished - // unless the associated transport is closing. - CloseStream(stream *Stream, err error) + NewStream(ctx context.Context, callHdr *CallHdr) (*ClientStream, error) // Error returns a channel that is closed when some I/O error // happens. Typically the caller should have a goroutine to monitor @@ -813,12 +580,6 @@ type ClientTransport interface { // RemoteAddr returns the remote network address. RemoteAddr() net.Addr - - // IncrMsgSent increments the number of message sent through this transport. - IncrMsgSent() - - // IncrMsgRecv increments the number of message received through this transport. - IncrMsgRecv() } // ServerTransport is the common interface for all gRPC server-side transport @@ -828,19 +589,7 @@ type ClientTransport interface { // Write methods for a given Stream will be called serially. type ServerTransport interface { // HandleStreams receives incoming streams using the given handler. - HandleStreams(context.Context, func(*Stream)) - - // WriteHeader sends the header metadata for the given stream. - // WriteHeader may not be called on all streams. - WriteHeader(s *Stream, md metadata.MD) error - - // Write sends the data for the given stream. - // Write may not be called on all streams. - Write(s *Stream, hdr []byte, data mem.BufferSlice, opts *Options) error - - // WriteStatus sends the status of a stream to the client. WriteStatus is - // the final call made on a stream and always occurs. - WriteStatus(s *Stream, st *status.Status) error + HandleStreams(context.Context, func(*ServerStream)) // Close tears down the transport. Once it is called, the transport // should not be accessed any more. All the pending streams and their @@ -852,12 +601,14 @@ type ServerTransport interface { // Drain notifies the client this ServerTransport stops accepting new RPCs. Drain(debugData string) +} - // IncrMsgSent increments the number of message sent through this transport. - IncrMsgSent() - - // IncrMsgRecv increments the number of message received through this transport. - IncrMsgRecv() +type internalServerTransport interface { + ServerTransport + writeHeader(s *ServerStream, md metadata.MD) error + write(s *ServerStream, hdr []byte, data mem.BufferSlice, opts *WriteOptions) error + writeStatus(s *ServerStream, st *status.Status) error + incrMsgRecv() } // connectionErrorf creates an ConnectionError with the specified error description. diff --git a/vendor/google.golang.org/grpc/mem/buffer_slice.go b/vendor/google.golang.org/grpc/mem/buffer_slice.go index 228e9c2f20..65002e2cc8 100644 --- a/vendor/google.golang.org/grpc/mem/buffer_slice.go +++ b/vendor/google.golang.org/grpc/mem/buffer_slice.go @@ -22,6 +22,11 @@ import ( "io" ) +const ( + // 32 KiB is what io.Copy uses. + readAllBufSize = 32 * 1024 +) + // BufferSlice offers a means to represent data that spans one or more Buffer // instances. A BufferSlice is meant to be immutable after creation, and methods // like Ref create and return copies of the slice. This is why all methods have @@ -219,8 +224,58 @@ func (w *writer) Write(p []byte) (n int, err error) { // NewWriter wraps the given BufferSlice and BufferPool to implement the // io.Writer interface. Every call to Write copies the contents of the given -// buffer into a new Buffer pulled from the given pool and the Buffer is added to -// the given BufferSlice. +// buffer into a new Buffer pulled from the given pool and the Buffer is +// added to the given BufferSlice. func NewWriter(buffers *BufferSlice, pool BufferPool) io.Writer { return &writer{buffers: buffers, pool: pool} } + +// ReadAll reads from r until an error or EOF and returns the data it read. +// A successful call returns err == nil, not err == EOF. Because ReadAll is +// defined to read from src until EOF, it does not treat an EOF from Read +// as an error to be reported. +// +// Important: A failed call returns a non-nil error and may also return +// partially read buffers. It is the responsibility of the caller to free the +// BufferSlice returned, or its memory will not be reused. +func ReadAll(r io.Reader, pool BufferPool) (BufferSlice, error) { + var result BufferSlice + if wt, ok := r.(io.WriterTo); ok { + // This is more optimal since wt knows the size of chunks it wants to + // write and, hence, we can allocate buffers of an optimal size to fit + // them. E.g. might be a single big chunk, and we wouldn't chop it + // into pieces. + w := NewWriter(&result, pool) + _, err := wt.WriteTo(w) + return result, err + } +nextBuffer: + for { + buf := pool.Get(readAllBufSize) + // We asked for 32KiB but may have been given a bigger buffer. + // Use all of it if that's the case. + *buf = (*buf)[:cap(*buf)] + usedCap := 0 + for { + n, err := r.Read((*buf)[usedCap:]) + usedCap += n + if err != nil { + if usedCap == 0 { + // Nothing in this buf, put it back + pool.Put(buf) + } else { + *buf = (*buf)[:usedCap] + result = append(result, NewBuffer(buf, pool)) + } + if err == io.EOF { + err = nil + } + return result, err + } + if len(*buf) == usedCap { + result = append(result, NewBuffer(buf, pool)) + continue nextBuffer + } + } + } +} diff --git a/vendor/google.golang.org/grpc/preloader.go b/vendor/google.golang.org/grpc/preloader.go index e87a17f36a..ee0ff969af 100644 --- a/vendor/google.golang.org/grpc/preloader.go +++ b/vendor/google.golang.org/grpc/preloader.go @@ -62,7 +62,7 @@ func (p *PreparedMsg) Encode(s Stream, msg any) error { materializedData := data.Materialize() data.Free() - p.encodedData = mem.BufferSlice{mem.NewBuffer(&materializedData, nil)} + p.encodedData = mem.BufferSlice{mem.SliceBuffer(materializedData)} // TODO: it should be possible to grab the bufferPool from the underlying // stream implementation with a type cast to its actual type (such as @@ -76,7 +76,7 @@ func (p *PreparedMsg) Encode(s Stream, msg any) error { if p.pf.isCompressed() { materializedCompData := compData.Materialize() compData.Free() - compData = mem.BufferSlice{mem.NewBuffer(&materializedCompData, nil)} + compData = mem.BufferSlice{mem.SliceBuffer(materializedCompData)} } p.hdr, p.payload = msgHeader(p.encodedData, compData, p.pf) diff --git a/vendor/google.golang.org/grpc/resolver/resolver.go b/vendor/google.golang.org/grpc/resolver/resolver.go index 202854511b..8eb1cf3bcf 100644 --- a/vendor/google.golang.org/grpc/resolver/resolver.go +++ b/vendor/google.golang.org/grpc/resolver/resolver.go @@ -22,6 +22,7 @@ package resolver import ( "context" + "errors" "fmt" "net" "net/url" @@ -237,8 +238,8 @@ type ClientConn interface { // UpdateState can be omitted. UpdateState(State) error // ReportError notifies the ClientConn that the Resolver encountered an - // error. The ClientConn will notify the load balancer and begin calling - // ResolveNow on the Resolver with exponential backoff. + // error. The ClientConn then forwards this error to the load balancing + // policy. ReportError(error) // NewAddress is called by resolver to notify ClientConn a new list // of resolved addresses. @@ -330,3 +331,20 @@ type AuthorityOverrider interface { // typically in line, and must keep it unchanged. OverrideAuthority(Target) string } + +// ValidateEndpoints validates endpoints from a petiole policy's perspective. +// Petiole policies should call this before calling into their children. See +// [gRPC A61](https://github.com/grpc/proposal/blob/master/A61-IPv4-IPv6-dualstack-backends.md) +// for details. +func ValidateEndpoints(endpoints []Endpoint) error { + if len(endpoints) == 0 { + return errors.New("endpoints list is empty") + } + + for _, endpoint := range endpoints { + for range endpoint.Addresses { + return nil + } + } + return errors.New("endpoints list contains no addresses") +} diff --git a/vendor/google.golang.org/grpc/rpc_util.go b/vendor/google.golang.org/grpc/rpc_util.go index aba1ae3e67..9fac2b08b4 100644 --- a/vendor/google.golang.org/grpc/rpc_util.go +++ b/vendor/google.golang.org/grpc/rpc_util.go @@ -622,7 +622,7 @@ func (pf payloadFormat) isCompressed() bool { } type streamReader interface { - ReadHeader(header []byte) error + ReadMessageHeader(header []byte) error Read(n int) (mem.BufferSlice, error) } @@ -656,7 +656,7 @@ type parser struct { // that the underlying streamReader must not return an incompatible // error. func (p *parser) recvMsg(maxReceiveMessageSize int) (payloadFormat, mem.BufferSlice, error) { - err := p.r.ReadHeader(p.header[:]) + err := p.r.ReadMessageHeader(p.header[:]) if err != nil { return 0, nil, err } @@ -664,9 +664,6 @@ func (p *parser) recvMsg(maxReceiveMessageSize int) (payloadFormat, mem.BufferSl pf := payloadFormat(p.header[0]) length := binary.BigEndian.Uint32(p.header[1:]) - if length == 0 { - return pf, nil, nil - } if int64(length) > int64(maxInt) { return 0, nil, status.Errorf(codes.ResourceExhausted, "grpc: received message larger than max length allowed on current machine (%d vs. %d)", length, maxInt) } @@ -817,7 +814,7 @@ func (p *payloadInfo) free() { // the buffer is no longer needed. // TODO: Refactor this function to reduce the number of arguments. // See: https://google.github.io/styleguide/go/best-practices.html#function-argument-lists -func recvAndDecompress(p *parser, s *transport.Stream, dc Decompressor, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, isServer bool, +func recvAndDecompress(p *parser, s recvCompressor, dc Decompressor, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, isServer bool, ) (out mem.BufferSlice, err error) { pf, compressed, err := p.recvMsg(maxReceiveMessageSize) if err != nil { @@ -841,7 +838,7 @@ func recvAndDecompress(p *parser, s *transport.Stream, dc Decompressor, maxRecei var uncompressedBuf []byte uncompressedBuf, err = dc.Do(compressed.Reader()) if err == nil { - out = mem.BufferSlice{mem.NewBuffer(&uncompressedBuf, nil)} + out = mem.BufferSlice{mem.SliceBuffer(uncompressedBuf)} } size = len(uncompressedBuf) } else { @@ -877,30 +874,7 @@ func decompress(compressor encoding.Compressor, d mem.BufferSlice, maxReceiveMes return nil, 0, err } - // TODO: Can/should this still be preserved with the new BufferSlice API? Are - // there any actual benefits to allocating a single large buffer instead of - // multiple smaller ones? - //if sizer, ok := compressor.(interface { - // DecompressedSize(compressedBytes []byte) int - //}); ok { - // if size := sizer.DecompressedSize(d); size >= 0 { - // if size > maxReceiveMessageSize { - // return nil, size, nil - // } - // // size is used as an estimate to size the buffer, but we - // // will read more data if available. - // // +MinRead so ReadFrom will not reallocate if size is correct. - // // - // // TODO: If we ensure that the buffer size is the same as the DecompressedSize, - // // we can also utilize the recv buffer pool here. - // buf := bytes.NewBuffer(make([]byte, 0, size+bytes.MinRead)) - // bytesRead, err := buf.ReadFrom(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) - // return buf.Bytes(), int(bytesRead), err - // } - //} - - var out mem.BufferSlice - _, err = io.Copy(mem.NewWriter(&out, pool), io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1)) + out, err := mem.ReadAll(io.LimitReader(dcReader, int64(maxReceiveMessageSize)+1), pool) if err != nil { out.Free() return nil, 0, err @@ -908,10 +882,14 @@ func decompress(compressor encoding.Compressor, d mem.BufferSlice, maxReceiveMes return out, out.Len(), nil } +type recvCompressor interface { + RecvCompress() string +} + // For the two compressor parameters, both should not be set, but if they are, // dc takes precedence over compressor. // TODO(dfawley): wrap the old compressor/decompressor using the new API? -func recv(p *parser, c baseCodec, s *transport.Stream, dc Decompressor, m any, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, isServer bool) error { +func recv(p *parser, c baseCodec, s recvCompressor, dc Decompressor, m any, maxReceiveMessageSize int, payInfo *payloadInfo, compressor encoding.Compressor, isServer bool) error { data, err := recvAndDecompress(p, s, dc, maxReceiveMessageSize, payInfo, compressor, isServer) if err != nil { return err diff --git a/vendor/google.golang.org/grpc/server.go b/vendor/google.golang.org/grpc/server.go index d1e1415a40..16065a027a 100644 --- a/vendor/google.golang.org/grpc/server.go +++ b/vendor/google.golang.org/grpc/server.go @@ -87,12 +87,13 @@ func init() { var statusOK = status.New(codes.OK, "") var logger = grpclog.Component("core") -type methodHandler func(srv any, ctx context.Context, dec func(any) error, interceptor UnaryServerInterceptor) (any, error) +// MethodHandler is a function type that processes a unary RPC method call. +type MethodHandler func(srv any, ctx context.Context, dec func(any) error, interceptor UnaryServerInterceptor) (any, error) // MethodDesc represents an RPC service's method specification. type MethodDesc struct { MethodName string - Handler methodHandler + Handler MethodHandler } // ServiceDesc represents an RPC service's specification. @@ -621,8 +622,8 @@ func bufferPool(bufferPool mem.BufferPool) ServerOption { // workload (assuming a QPS of a few thousand requests/sec). const serverWorkerResetThreshold = 1 << 16 -// serverWorker blocks on a *transport.Stream channel forever and waits for -// data to be fed by serveStreams. This allows multiple requests to be +// serverWorker blocks on a *transport.ServerStream channel forever and waits +// for data to be fed by serveStreams. This allows multiple requests to be // processed by the same goroutine, removing the need for expensive stack // re-allocations (see the runtime.morestack problem [1]). // @@ -1020,7 +1021,7 @@ func (s *Server) serveStreams(ctx context.Context, st transport.ServerTransport, }() streamQuota := newHandlerQuota(s.opts.maxConcurrentStreams) - st.HandleStreams(ctx, func(stream *transport.Stream) { + st.HandleStreams(ctx, func(stream *transport.ServerStream) { s.handlersWG.Add(1) streamQuota.acquire() f := func() { @@ -1136,7 +1137,7 @@ func (s *Server) incrCallsFailed() { s.channelz.ServerMetrics.CallsFailed.Add(1) } -func (s *Server) sendResponse(ctx context.Context, t transport.ServerTransport, stream *transport.Stream, msg any, cp Compressor, opts *transport.Options, comp encoding.Compressor) error { +func (s *Server) sendResponse(ctx context.Context, stream *transport.ServerStream, msg any, cp Compressor, opts *transport.WriteOptions, comp encoding.Compressor) error { data, err := encode(s.getCodec(stream.ContentSubtype()), msg) if err != nil { channelz.Error(logger, s.channelz, "grpc: server failed to encode response: ", err) @@ -1165,7 +1166,7 @@ func (s *Server) sendResponse(ctx context.Context, t transport.ServerTransport, if payloadLen > s.opts.maxSendMessageSize { return status.Errorf(codes.ResourceExhausted, "grpc: trying to send message larger than max (%d vs. %d)", payloadLen, s.opts.maxSendMessageSize) } - err = t.Write(stream, hdr, payload, opts) + err = stream.Write(hdr, payload, opts) if err == nil { if len(s.opts.statsHandlers) != 0 { for _, sh := range s.opts.statsHandlers { @@ -1212,7 +1213,7 @@ func getChainUnaryHandler(interceptors []UnaryServerInterceptor, curr int, info } } -func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTransport, stream *transport.Stream, info *serviceInfo, md *MethodDesc, trInfo *traceInfo) (err error) { +func (s *Server) processUnaryRPC(ctx context.Context, stream *transport.ServerStream, info *serviceInfo, md *MethodDesc, trInfo *traceInfo) (err error) { shs := s.opts.statsHandlers if len(shs) != 0 || trInfo != nil || channelz.IsOn() { if channelz.IsOn() { @@ -1320,7 +1321,7 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor decomp = encoding.GetCompressor(rc) if decomp == nil { st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc) - t.WriteStatus(stream, st) + stream.WriteStatus(st) return st.Err() } } @@ -1354,15 +1355,12 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor d, err := recvAndDecompress(&parser{r: stream, bufferPool: s.opts.bufferPool}, stream, dc, s.opts.maxReceiveMessageSize, payInfo, decomp, true) if err != nil { - if e := t.WriteStatus(stream, status.Convert(err)); e != nil { + if e := stream.WriteStatus(status.Convert(err)); e != nil { channelz.Warningf(logger, s.channelz, "grpc: Server.processUnaryRPC failed to write status: %v", e) } return err } defer d.Free() - if channelz.IsOn() { - t.IncrMsgRecv() - } df := func(v any) error { if err := s.getCodec(stream.ContentSubtype()).Unmarshal(d, v); err != nil { return status.Errorf(codes.Internal, "grpc: error unmarshalling request: %v", err) @@ -1404,7 +1402,7 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor trInfo.tr.LazyLog(stringer(appStatus.Message()), true) trInfo.tr.SetError() } - if e := t.WriteStatus(stream, appStatus); e != nil { + if e := stream.WriteStatus(appStatus); e != nil { channelz.Warningf(logger, s.channelz, "grpc: Server.processUnaryRPC failed to write status: %v", e) } if len(binlogs) != 0 { @@ -1431,20 +1429,20 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor if trInfo != nil { trInfo.tr.LazyLog(stringer("OK"), false) } - opts := &transport.Options{Last: true} + opts := &transport.WriteOptions{Last: true} // Server handler could have set new compressor by calling SetSendCompressor. // In case it is set, we need to use it for compressing outbound message. if stream.SendCompress() != sendCompressorName { comp = encoding.GetCompressor(stream.SendCompress()) } - if err := s.sendResponse(ctx, t, stream, reply, cp, opts, comp); err != nil { + if err := s.sendResponse(ctx, stream, reply, cp, opts, comp); err != nil { if err == io.EOF { // The entire stream is done (for unary RPC only). return err } if sts, ok := status.FromError(err); ok { - if e := t.WriteStatus(stream, sts); e != nil { + if e := stream.WriteStatus(sts); e != nil { channelz.Warningf(logger, s.channelz, "grpc: Server.processUnaryRPC failed to write status: %v", e) } } else { @@ -1484,9 +1482,6 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor binlog.Log(ctx, sm) } } - if channelz.IsOn() { - t.IncrMsgSent() - } if trInfo != nil { trInfo.tr.LazyLog(&payload{sent: true, msg: reply}, true) } @@ -1502,7 +1497,7 @@ func (s *Server) processUnaryRPC(ctx context.Context, t transport.ServerTranspor binlog.Log(ctx, st) } } - return t.WriteStatus(stream, statusOK) + return stream.WriteStatus(statusOK) } // chainStreamServerInterceptors chains all stream server interceptors into one. @@ -1541,7 +1536,7 @@ func getChainStreamHandler(interceptors []StreamServerInterceptor, curr int, inf } } -func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTransport, stream *transport.Stream, info *serviceInfo, sd *StreamDesc, trInfo *traceInfo) (err error) { +func (s *Server) processStreamingRPC(ctx context.Context, stream *transport.ServerStream, info *serviceInfo, sd *StreamDesc, trInfo *traceInfo) (err error) { if channelz.IsOn() { s.incrCallsStarted() } @@ -1561,7 +1556,6 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran ctx = NewContextWithServerTransportStream(ctx, stream) ss := &serverStream{ ctx: ctx, - t: t, s: stream, p: &parser{r: stream, bufferPool: s.opts.bufferPool}, codec: s.getCodec(stream.ContentSubtype()), @@ -1648,7 +1642,7 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran ss.decomp = encoding.GetCompressor(rc) if ss.decomp == nil { st := status.Newf(codes.Unimplemented, "grpc: Decompressor is not installed for grpc-encoding %q", rc) - t.WriteStatus(ss.s, st) + ss.s.WriteStatus(st) return st.Err() } } @@ -1717,7 +1711,7 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran binlog.Log(ctx, st) } } - t.WriteStatus(ss.s, appStatus) + ss.s.WriteStatus(appStatus) // TODO: Should we log an error from WriteStatus here and below? return appErr } @@ -1735,10 +1729,10 @@ func (s *Server) processStreamingRPC(ctx context.Context, t transport.ServerTran binlog.Log(ctx, st) } } - return t.WriteStatus(ss.s, statusOK) + return ss.s.WriteStatus(statusOK) } -func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Stream) { +func (s *Server) handleStream(t transport.ServerTransport, stream *transport.ServerStream) { ctx := stream.Context() ctx = contextWithServer(ctx, s) var ti *traceInfo @@ -1768,7 +1762,7 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str ti.tr.SetError() } errDesc := fmt.Sprintf("malformed method name: %q", stream.Method()) - if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { + if err := stream.WriteStatus(status.New(codes.Unimplemented, errDesc)); err != nil { if ti != nil { ti.tr.LazyLog(&fmtStringer{"%v", []any{err}}, true) ti.tr.SetError() @@ -1783,17 +1777,20 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str service := sm[:pos] method := sm[pos+1:] - md, _ := metadata.FromIncomingContext(ctx) - for _, sh := range s.opts.statsHandlers { - ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: stream.Method()}) - sh.HandleRPC(ctx, &stats.InHeader{ - FullMethod: stream.Method(), - RemoteAddr: t.Peer().Addr, - LocalAddr: t.Peer().LocalAddr, - Compression: stream.RecvCompress(), - WireLength: stream.HeaderWireLength(), - Header: md, - }) + // FromIncomingContext is expensive: skip if there are no statsHandlers + if len(s.opts.statsHandlers) > 0 { + md, _ := metadata.FromIncomingContext(ctx) + for _, sh := range s.opts.statsHandlers { + ctx = sh.TagRPC(ctx, &stats.RPCTagInfo{FullMethodName: stream.Method()}) + sh.HandleRPC(ctx, &stats.InHeader{ + FullMethod: stream.Method(), + RemoteAddr: t.Peer().Addr, + LocalAddr: t.Peer().LocalAddr, + Compression: stream.RecvCompress(), + WireLength: stream.HeaderWireLength(), + Header: md, + }) + } } // To have calls in stream callouts work. Will delete once all stats handler // calls come from the gRPC layer. @@ -1802,17 +1799,17 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str srv, knownService := s.services[service] if knownService { if md, ok := srv.methods[method]; ok { - s.processUnaryRPC(ctx, t, stream, srv, md, ti) + s.processUnaryRPC(ctx, stream, srv, md, ti) return } if sd, ok := srv.streams[method]; ok { - s.processStreamingRPC(ctx, t, stream, srv, sd, ti) + s.processStreamingRPC(ctx, stream, srv, sd, ti) return } } // Unknown service, or known server unknown method. if unknownDesc := s.opts.unknownStreamDesc; unknownDesc != nil { - s.processStreamingRPC(ctx, t, stream, nil, unknownDesc, ti) + s.processStreamingRPC(ctx, stream, nil, unknownDesc, ti) return } var errDesc string @@ -1825,7 +1822,7 @@ func (s *Server) handleStream(t transport.ServerTransport, stream *transport.Str ti.tr.LazyPrintf("%s", errDesc) ti.tr.SetError() } - if err := t.WriteStatus(stream, status.New(codes.Unimplemented, errDesc)); err != nil { + if err := stream.WriteStatus(status.New(codes.Unimplemented, errDesc)); err != nil { if ti != nil { ti.tr.LazyLog(&fmtStringer{"%v", []any{err}}, true) ti.tr.SetError() @@ -2100,7 +2097,7 @@ func SendHeader(ctx context.Context, md metadata.MD) error { // Notice: This function is EXPERIMENTAL and may be changed or removed in a // later release. func SetSendCompressor(ctx context.Context, name string) error { - stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) + stream, ok := ServerTransportStreamFromContext(ctx).(*transport.ServerStream) if !ok || stream == nil { return fmt.Errorf("failed to fetch the stream from the given context") } @@ -2122,7 +2119,7 @@ func SetSendCompressor(ctx context.Context, name string) error { // Notice: This function is EXPERIMENTAL and may be changed or removed in a // later release. func ClientSupportedCompressors(ctx context.Context) ([]string, error) { - stream, ok := ServerTransportStreamFromContext(ctx).(*transport.Stream) + stream, ok := ServerTransportStreamFromContext(ctx).(*transport.ServerStream) if !ok || stream == nil { return nil, fmt.Errorf("failed to fetch the stream from the given context %v", ctx) } diff --git a/vendor/google.golang.org/grpc/service_config.go b/vendor/google.golang.org/grpc/service_config.go index 2671c5ef69..7e83027d19 100644 --- a/vendor/google.golang.org/grpc/service_config.go +++ b/vendor/google.golang.org/grpc/service_config.go @@ -168,6 +168,7 @@ func init() { return parseServiceConfig(js, defaultMaxCallAttempts) } } + func parseServiceConfig(js string, maxAttempts int) *serviceconfig.ParseResult { if len(js) == 0 { return &serviceconfig.ParseResult{Err: fmt.Errorf("no JSON service config provided")} @@ -297,7 +298,7 @@ func convertRetryPolicy(jrp *jsonRetryPolicy, maxAttempts int) (p *internalservi return rp, nil } -func min(a, b *int) *int { +func minPointers(a, b *int) *int { if *a < *b { return a } @@ -309,7 +310,7 @@ func getMaxSize(mcMax, doptMax *int, defaultVal int) *int { return &defaultVal } if mcMax != nil && doptMax != nil { - return min(mcMax, doptMax) + return minPointers(mcMax, doptMax) } if mcMax != nil { return mcMax diff --git a/vendor/google.golang.org/grpc/stats/metrics.go b/vendor/google.golang.org/grpc/stats/metrics.go new file mode 100644 index 0000000000..641c8e9794 --- /dev/null +++ b/vendor/google.golang.org/grpc/stats/metrics.go @@ -0,0 +1,81 @@ +/* + * Copyright 2024 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package stats + +import "maps" + +// MetricSet is a set of metrics to record. Once created, MetricSet is immutable, +// however Add and Remove can make copies with specific metrics added or +// removed, respectively. +// +// Do not construct directly; use NewMetricSet instead. +type MetricSet struct { + // metrics are the set of metrics to initialize. + metrics map[string]bool +} + +// NewMetricSet returns a MetricSet containing metricNames. +func NewMetricSet(metricNames ...string) *MetricSet { + newMetrics := make(map[string]bool) + for _, metric := range metricNames { + newMetrics[metric] = true + } + return &MetricSet{metrics: newMetrics} +} + +// Metrics returns the metrics set. The returned map is read-only and must not +// be modified. +func (m *MetricSet) Metrics() map[string]bool { + return m.metrics +} + +// Add adds the metricNames to the metrics set and returns a new copy with the +// additional metrics. +func (m *MetricSet) Add(metricNames ...string) *MetricSet { + newMetrics := make(map[string]bool) + for metric := range m.metrics { + newMetrics[metric] = true + } + + for _, metric := range metricNames { + newMetrics[metric] = true + } + return &MetricSet{metrics: newMetrics} +} + +// Join joins the metrics passed in with the metrics set, and returns a new copy +// with the merged metrics. +func (m *MetricSet) Join(metrics *MetricSet) *MetricSet { + newMetrics := make(map[string]bool) + maps.Copy(newMetrics, m.metrics) + maps.Copy(newMetrics, metrics.metrics) + return &MetricSet{metrics: newMetrics} +} + +// Remove removes the metricNames from the metrics set and returns a new copy +// with the metrics removed. +func (m *MetricSet) Remove(metricNames ...string) *MetricSet { + newMetrics := make(map[string]bool) + for metric := range m.metrics { + newMetrics[metric] = true + } + + for _, metric := range metricNames { + delete(newMetrics, metric) + } + return &MetricSet{metrics: newMetrics} +} diff --git a/vendor/google.golang.org/grpc/stats/stats.go b/vendor/google.golang.org/grpc/stats/stats.go index 71195c4943..6f20d2d548 100644 --- a/vendor/google.golang.org/grpc/stats/stats.go +++ b/vendor/google.golang.org/grpc/stats/stats.go @@ -260,84 +260,42 @@ func (s *ConnEnd) IsClient() bool { return s.Client } func (s *ConnEnd) isConnStats() {} -type incomingTagsKey struct{} -type outgoingTagsKey struct{} - // SetTags attaches stats tagging data to the context, which will be sent in // the outgoing RPC with the header grpc-tags-bin. Subsequent calls to // SetTags will overwrite the values from earlier calls. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: set the `grpc-tags-bin` header in the metadata instead. func SetTags(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, outgoingTagsKey{}, b) + return metadata.AppendToOutgoingContext(ctx, "grpc-tags-bin", string(b)) } // Tags returns the tags from the context for the inbound RPC. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: obtain the `grpc-tags-bin` header from metadata instead. func Tags(ctx context.Context) []byte { - b, _ := ctx.Value(incomingTagsKey{}).([]byte) - return b -} - -// SetIncomingTags attaches stats tagging data to the context, to be read by -// the application (not sent in outgoing RPCs). -// -// This is intended for gRPC-internal use ONLY. -func SetIncomingTags(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, incomingTagsKey{}, b) -} - -// OutgoingTags returns the tags from the context for the outbound RPC. -// -// This is intended for gRPC-internal use ONLY. -func OutgoingTags(ctx context.Context) []byte { - b, _ := ctx.Value(outgoingTagsKey{}).([]byte) - return b + traceValues := metadata.ValueFromIncomingContext(ctx, "grpc-tags-bin") + if len(traceValues) == 0 { + return nil + } + return []byte(traceValues[len(traceValues)-1]) } -type incomingTraceKey struct{} -type outgoingTraceKey struct{} - // SetTrace attaches stats tagging data to the context, which will be sent in // the outgoing RPC with the header grpc-trace-bin. Subsequent calls to // SetTrace will overwrite the values from earlier calls. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: set the `grpc-trace-bin` header in the metadata instead. func SetTrace(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, outgoingTraceKey{}, b) + return metadata.AppendToOutgoingContext(ctx, "grpc-trace-bin", string(b)) } // Trace returns the trace from the context for the inbound RPC. // -// NOTE: this is provided only for backward compatibility with existing clients -// and will likely be removed in an upcoming release. New uses should transmit -// this type of data using metadata with a different, non-reserved (i.e. does -// not begin with "grpc-") header name. +// Deprecated: obtain the `grpc-trace-bin` header from metadata instead. func Trace(ctx context.Context) []byte { - b, _ := ctx.Value(incomingTraceKey{}).([]byte) - return b -} - -// SetIncomingTrace attaches stats tagging data to the context, to be read by -// the application (not sent in outgoing RPCs). It is intended for -// gRPC-internal use. -func SetIncomingTrace(ctx context.Context, b []byte) context.Context { - return context.WithValue(ctx, incomingTraceKey{}, b) -} - -// OutgoingTrace returns the trace from the context for the outbound RPC. It is -// intended for gRPC-internal use. -func OutgoingTrace(ctx context.Context) []byte { - b, _ := ctx.Value(outgoingTraceKey{}).([]byte) - return b + traceValues := metadata.ValueFromIncomingContext(ctx, "grpc-trace-bin") + if len(traceValues) == 0 { + return nil + } + return []byte(traceValues[len(traceValues)-1]) } diff --git a/vendor/google.golang.org/grpc/stream.go b/vendor/google.golang.org/grpc/stream.go index bb2b2a216c..17e2267b33 100644 --- a/vendor/google.golang.org/grpc/stream.go +++ b/vendor/google.golang.org/grpc/stream.go @@ -23,7 +23,7 @@ import ( "errors" "io" "math" - "math/rand" + rand "math/rand/v2" "strconv" "sync" "time" @@ -113,7 +113,9 @@ type ClientStream interface { // SendMsg is generally called by generated code. On error, SendMsg aborts // the stream. If the error was generated by the client, the status is // returned directly; otherwise, io.EOF is returned and the status of - // the stream may be discovered using RecvMsg. + // the stream may be discovered using RecvMsg. For unary or server-streaming + // RPCs (StreamDesc.ClientStreams is false), a nil error is returned + // unconditionally. // // SendMsg blocks until: // - There is sufficient flow control to schedule m with the transport, or @@ -216,7 +218,7 @@ func newClientStream(ctx context.Context, desc *StreamDesc, cc *ClientConn, meth var mc serviceconfig.MethodConfig var onCommit func() - var newStream = func(ctx context.Context, done func()) (iresolver.ClientStream, error) { + newStream := func(ctx context.Context, done func()) (iresolver.ClientStream, error) { return newClientStreamWithParams(ctx, desc, cc, method, mc, onCommit, done, opts...) } @@ -584,7 +586,7 @@ type csAttempt struct { ctx context.Context cs *clientStream t transport.ClientTransport - s *transport.Stream + s *transport.ClientStream p *parser pickResult balancer.PickResult @@ -706,11 +708,10 @@ func (a *csAttempt) shouldRetry(err error) (bool, error) { cs.numRetriesSincePushback = 0 } else { fact := math.Pow(rp.BackoffMultiplier, float64(cs.numRetriesSincePushback)) - cur := float64(rp.InitialBackoff) * fact - if max := float64(rp.MaxBackoff); cur > max { - cur = max - } - dur = time.Duration(rand.Int63n(int64(cur))) + cur := min(float64(rp.InitialBackoff)*fact, float64(rp.MaxBackoff)) + // Apply jitter by multiplying with a random factor between 0.8 and 1.2 + cur *= 0.8 + 0.4*rand.Float64() + dur = time.Duration(int64(cur)) cs.numRetriesSincePushback++ } @@ -991,7 +992,7 @@ func (cs *clientStream) CloseSend() error { } cs.sentLast = true op := func(a *csAttempt) error { - a.t.Write(a.s, nil, nil, &transport.Options{Last: true}) + a.s.Write(nil, nil, &transport.WriteOptions{Last: true}) // Always return nil; io.EOF is the only error that might make sense // instead, but there is no need to signal the client to call RecvMsg // as the only use left for the stream after CloseSend is to call @@ -1083,7 +1084,7 @@ func (a *csAttempt) sendMsg(m any, hdr []byte, payld mem.BufferSlice, dataLength } a.mu.Unlock() } - if err := a.t.Write(a.s, hdr, payld, &transport.Options{Last: !cs.desc.ClientStreams}); err != nil { + if err := a.s.Write(hdr, payld, &transport.WriteOptions{Last: !cs.desc.ClientStreams}); err != nil { if !cs.desc.ClientStreams { // For non-client-streaming RPCs, we return nil instead of EOF on error // because the generated code requires it. finish is not called; RecvMsg() @@ -1097,9 +1098,6 @@ func (a *csAttempt) sendMsg(m any, hdr []byte, payld mem.BufferSlice, dataLength sh.HandleRPC(a.ctx, outPayload(true, m, dataLength, payloadLength, time.Now())) } } - if channelz.IsOn() { - a.t.IncrMsgSent() - } return nil } @@ -1153,9 +1151,6 @@ func (a *csAttempt) recvMsg(m any, payInfo *payloadInfo) (err error) { Length: payInfo.uncompressedBytes.Len(), }) } - if channelz.IsOn() { - a.t.IncrMsgRecv() - } if cs.desc.ServerStreams { // Subsequent messages should be received by subsequent RecvMsg calls. return nil @@ -1183,7 +1178,7 @@ func (a *csAttempt) finish(err error) { } var tr metadata.MD if a.s != nil { - a.t.CloseStream(a.s, err) + a.s.Close(err) tr = a.s.Trailer() } @@ -1340,7 +1335,7 @@ func newNonRetryClientStream(ctx context.Context, desc *StreamDesc, method strin } type addrConnStream struct { - s *transport.Stream + s *transport.ClientStream ac *addrConn callHdr *transport.CallHdr cancel context.CancelFunc @@ -1380,7 +1375,7 @@ func (as *addrConnStream) CloseSend() error { } as.sentLast = true - as.t.Write(as.s, nil, nil, &transport.Options{Last: true}) + as.s.Write(nil, nil, &transport.WriteOptions{Last: true}) // Always return nil; io.EOF is the only error that might make sense // instead, but there is no need to signal the client to call RecvMsg // as the only use left for the stream after CloseSend is to call @@ -1430,7 +1425,7 @@ func (as *addrConnStream) SendMsg(m any) (err error) { return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", payload.Len(), *as.callInfo.maxSendMessageSize) } - if err := as.t.Write(as.s, hdr, payload, &transport.Options{Last: !as.desc.ClientStreams}); err != nil { + if err := as.s.Write(hdr, payload, &transport.WriteOptions{Last: !as.desc.ClientStreams}); err != nil { if !as.desc.ClientStreams { // For non-client-streaming RPCs, we return nil instead of EOF on error // because the generated code requires it. finish is not called; RecvMsg() @@ -1440,9 +1435,6 @@ func (as *addrConnStream) SendMsg(m any) (err error) { return io.EOF } - if channelz.IsOn() { - as.t.IncrMsgSent() - } return nil } @@ -1480,9 +1472,6 @@ func (as *addrConnStream) RecvMsg(m any) (err error) { return toRPCErr(err) } - if channelz.IsOn() { - as.t.IncrMsgRecv() - } if as.desc.ServerStreams { // Subsequent messages should be received by subsequent RecvMsg calls. return nil @@ -1510,7 +1499,7 @@ func (as *addrConnStream) finish(err error) { err = nil } if as.s != nil { - as.t.CloseStream(as.s, err) + as.s.Close(err) } if err != nil { @@ -1577,8 +1566,7 @@ type ServerStream interface { // serverStream implements a server side Stream. type serverStream struct { ctx context.Context - t transport.ServerTransport - s *transport.Stream + s *transport.ServerStream p *parser codec baseCodec @@ -1628,7 +1616,7 @@ func (ss *serverStream) SendHeader(md metadata.MD) error { return status.Error(codes.Internal, err.Error()) } - err = ss.t.WriteHeader(ss.s, md) + err = ss.s.SendHeader(md) if len(ss.binlogs) != 0 && !ss.serverHeaderBinlogged { h, _ := ss.s.Header() sh := &binarylog.ServerHeader{ @@ -1668,7 +1656,7 @@ func (ss *serverStream) SendMsg(m any) (err error) { } if err != nil && err != io.EOF { st, _ := status.FromError(toRPCErr(err)) - ss.t.WriteStatus(ss.s, st) + ss.s.WriteStatus(st) // Non-user specified status was sent out. This should be an error // case (as a server side Cancel maybe). // @@ -1676,9 +1664,6 @@ func (ss *serverStream) SendMsg(m any) (err error) { // status from the service handler, we will log that error instead. // This behavior is similar to an interceptor. } - if channelz.IsOn() && err == nil { - ss.t.IncrMsgSent() - } }() // Server handler could have set new compressor by calling SetSendCompressor. @@ -1710,7 +1695,7 @@ func (ss *serverStream) SendMsg(m any) (err error) { if payloadLen > ss.maxSendMessageSize { return status.Errorf(codes.ResourceExhausted, "trying to send message larger than max (%d vs. %d)", payloadLen, ss.maxSendMessageSize) } - if err := ss.t.Write(ss.s, hdr, payload, &transport.Options{Last: false}); err != nil { + if err := ss.s.Write(hdr, payload, &transport.WriteOptions{Last: false}); err != nil { return toRPCErr(err) } @@ -1756,7 +1741,7 @@ func (ss *serverStream) RecvMsg(m any) (err error) { } if err != nil && err != io.EOF { st, _ := status.FromError(toRPCErr(err)) - ss.t.WriteStatus(ss.s, st) + ss.s.WriteStatus(st) // Non-user specified status was sent out. This should be an error // case (as a server side Cancel maybe). // @@ -1764,9 +1749,6 @@ func (ss *serverStream) RecvMsg(m any) (err error) { // status from the service handler, we will log that error instead. // This behavior is similar to an interceptor. } - if channelz.IsOn() && err == nil { - ss.t.IncrMsgRecv() - } }() var payInfo *payloadInfo if len(ss.statsHandler) != 0 || len(ss.binlogs) != 0 { diff --git a/vendor/google.golang.org/grpc/version.go b/vendor/google.golang.org/grpc/version.go index 5a47094ae8..6cbe116f24 100644 --- a/vendor/google.golang.org/grpc/version.go +++ b/vendor/google.golang.org/grpc/version.go @@ -19,4 +19,4 @@ package grpc // Version is the current grpc version. -const Version = "1.68.1" +const Version = "1.69.2" diff --git a/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb b/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb index 2c0693d7abbf532f021dafc96e7568f57214b8e7..5a57ef6f3c80a4a930b7bdb33b039ea94d1eb5f2 100644 GIT binary patch literal 138 zcmd;*muO*EV!mX@pe4$|D8MAaq`<7fXux#Ijt$6VkYMDJmv|0Wz$CyZ!KlClRKN&Q wzyMY7f?Y`%s2WL*1th1%ddZFnY{E-+C6MVz3P75fB^b3pHY+@1*LcYe04AXnGXMYp literal 99 zcmd;*m3YRk#C*w)K}(o}QGiK;Nr72|(SYfa9SaAe1S6NM#B;bblK@aefe9$h2$E(1 dOTS=O5(H{Ql40Ut&|548XQ diff --git a/vendor/google.golang.org/protobuf/internal/errors/is_go112.go b/vendor/google.golang.org/protobuf/internal/errors/is_go112.go deleted file mode 100644 index fbcd349207..0000000000 --- a/vendor/google.golang.org/protobuf/internal/errors/is_go112.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.13 -// +build !go1.13 - -package errors - -import "reflect" - -// Is is a copy of Go 1.13's errors.Is for use with older Go versions. -func Is(err, target error) bool { - if target == nil { - return err == target - } - - isComparable := reflect.TypeOf(target).Comparable() - for { - if isComparable && err == target { - return true - } - if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) { - return true - } - if err = unwrap(err); err == nil { - return false - } - } -} - -func unwrap(err error) error { - u, ok := err.(interface { - Unwrap() error - }) - if !ok { - return nil - } - return u.Unwrap() -} diff --git a/vendor/google.golang.org/protobuf/internal/errors/is_go113.go b/vendor/google.golang.org/protobuf/internal/errors/is_go113.go deleted file mode 100644 index 5e72f1cde9..0000000000 --- a/vendor/google.golang.org/protobuf/internal/errors/is_go113.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.13 -// +build go1.13 - -package errors - -import "errors" - -// Is is errors.Is. -func Is(err, target error) bool { return errors.Is(err, target) } diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go index f325298564..378b826faa 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/desc.go @@ -117,6 +117,9 @@ type ( // GenerateLegacyUnmarshalJSON determines if the plugin generates the // UnmarshalJSON([]byte) error method for enums. GenerateLegacyUnmarshalJSON bool + // APILevel controls which API (Open, Hybrid or Opaque) should be used + // for generated code (.pb.go files). + APILevel int } ) diff --git a/vendor/google.golang.org/protobuf/internal/filedesc/editions.go b/vendor/google.golang.org/protobuf/internal/filedesc/editions.go index 7611796e86..10132c9b38 100644 --- a/vendor/google.golang.org/protobuf/internal/filedesc/editions.go +++ b/vendor/google.golang.org/protobuf/internal/filedesc/editions.go @@ -32,6 +32,10 @@ func unmarshalGoFeature(b []byte, parent EditionFeatures) EditionFeatures { v, m := protowire.ConsumeVarint(b) b = b[m:] parent.GenerateLegacyUnmarshalJSON = protowire.DecodeBool(v) + case genid.GoFeatures_ApiLevel_field_number: + v, m := protowire.ConsumeVarint(b) + b = b[m:] + parent.APILevel = int(v) case genid.GoFeatures_StripEnumPrefix_field_number: v, m := protowire.ConsumeVarint(b) b = b[m:] diff --git a/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go b/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go index 09792d96f6..f5ee7f5c2b 100644 --- a/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go +++ b/vendor/google.golang.org/protobuf/internal/genid/go_features_gen.go @@ -21,18 +21,35 @@ const ( // Field names for pb.GoFeatures. const ( GoFeatures_LegacyUnmarshalJsonEnum_field_name protoreflect.Name = "legacy_unmarshal_json_enum" + GoFeatures_ApiLevel_field_name protoreflect.Name = "api_level" GoFeatures_StripEnumPrefix_field_name protoreflect.Name = "strip_enum_prefix" GoFeatures_LegacyUnmarshalJsonEnum_field_fullname protoreflect.FullName = "pb.GoFeatures.legacy_unmarshal_json_enum" + GoFeatures_ApiLevel_field_fullname protoreflect.FullName = "pb.GoFeatures.api_level" GoFeatures_StripEnumPrefix_field_fullname protoreflect.FullName = "pb.GoFeatures.strip_enum_prefix" ) // Field numbers for pb.GoFeatures. const ( GoFeatures_LegacyUnmarshalJsonEnum_field_number protoreflect.FieldNumber = 1 + GoFeatures_ApiLevel_field_number protoreflect.FieldNumber = 2 GoFeatures_StripEnumPrefix_field_number protoreflect.FieldNumber = 3 ) +// Full and short names for pb.GoFeatures.APILevel. +const ( + GoFeatures_APILevel_enum_fullname = "pb.GoFeatures.APILevel" + GoFeatures_APILevel_enum_name = "APILevel" +) + +// Enum values for pb.GoFeatures.APILevel. +const ( + GoFeatures_API_LEVEL_UNSPECIFIED_enum_value = 0 + GoFeatures_API_OPEN_enum_value = 1 + GoFeatures_API_HYBRID_enum_value = 2 + GoFeatures_API_OPAQUE_enum_value = 3 +) + // Full and short names for pb.GoFeatures.StripEnumPrefix. const ( GoFeatures_StripEnumPrefix_enum_fullname = "pb.GoFeatures.StripEnumPrefix" diff --git a/vendor/google.golang.org/protobuf/internal/genid/name.go b/vendor/google.golang.org/protobuf/internal/genid/name.go new file mode 100644 index 0000000000..224f339302 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/genid/name.go @@ -0,0 +1,12 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package genid + +const ( + NoUnkeyedLiteral_goname = "noUnkeyedLiteral" + NoUnkeyedLiteralA_goname = "XXX_NoUnkeyedLiteral" + + BuilderSuffix_goname = "_builder" +) diff --git a/vendor/google.golang.org/protobuf/internal/impl/api_export_opaque.go b/vendor/google.golang.org/protobuf/internal/impl/api_export_opaque.go new file mode 100644 index 0000000000..6075d6f696 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/api_export_opaque.go @@ -0,0 +1,128 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package impl + +import ( + "strconv" + "sync/atomic" + "unsafe" + + "google.golang.org/protobuf/reflect/protoreflect" +) + +func (Export) UnmarshalField(msg any, fieldNum int32) { + UnmarshalField(msg.(protoreflect.ProtoMessage).ProtoReflect(), protoreflect.FieldNumber(fieldNum)) +} + +// Present checks the presence set for a certain field number (zero +// based, ordered by appearance in original proto file). part is +// a pointer to the correct element in the bitmask array, num is the +// field number unaltered. Example (field number 70 -> part = +// &m.XXX_presence[1], num = 70) +func (Export) Present(part *uint32, num uint32) bool { + // This hook will read an unprotected shadow presence set if + // we're unning under the race detector + raceDetectHookPresent(part, num) + return atomic.LoadUint32(part)&(1<<(num%32)) > 0 +} + +// SetPresent adds a field to the presence set. part is a pointer to +// the relevant element in the array and num is the field number +// unaltered. size is the number of fields in the protocol +// buffer. +func (Export) SetPresent(part *uint32, num uint32, size uint32) { + // This hook will mutate an unprotected shadow presence set if + // we're running under the race detector + raceDetectHookSetPresent(part, num, presenceSize(size)) + for { + old := atomic.LoadUint32(part) + if atomic.CompareAndSwapUint32(part, old, old|(1<<(num%32))) { + return + } + } +} + +// SetPresentNonAtomic is like SetPresent, but operates non-atomically. +// It is meant for use by builder methods, where the message is known not +// to be accessible yet by other goroutines. +func (Export) SetPresentNonAtomic(part *uint32, num uint32, size uint32) { + // This hook will mutate an unprotected shadow presence set if + // we're running under the race detector + raceDetectHookSetPresent(part, num, presenceSize(size)) + *part |= 1 << (num % 32) +} + +// ClearPresence removes a field from the presence set. part is a +// pointer to the relevant element in the presence array and num is +// the field number unaltered. +func (Export) ClearPresent(part *uint32, num uint32) { + // This hook will mutate an unprotected shadow presence set if + // we're running under the race detector + raceDetectHookClearPresent(part, num) + for { + old := atomic.LoadUint32(part) + if atomic.CompareAndSwapUint32(part, old, old&^(1<<(num%32))) { + return + } + } +} + +// interfaceToPointer takes a pointer to an empty interface whose value is a +// pointer type, and converts it into a "pointer" that points to the same +// target +func interfaceToPointer(i *any) pointer { + return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} +} + +func (p pointer) atomicGetPointer() pointer { + return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))} +} + +func (p pointer) atomicSetPointer(q pointer) { + atomic.StorePointer((*unsafe.Pointer)(p.p), q.p) +} + +// AtomicCheckPointerIsNil takes an interface (which is a pointer to a +// pointer) and returns true if the pointed-to pointer is nil (using an +// atomic load). This function is inlineable and, on x86, just becomes a +// simple load and compare. +func (Export) AtomicCheckPointerIsNil(ptr any) bool { + return interfaceToPointer(&ptr).atomicGetPointer().IsNil() +} + +// AtomicSetPointer takes two interfaces (first is a pointer to a pointer, +// second is a pointer) and atomically sets the second pointer into location +// referenced by first pointer. Unfortunately, atomicSetPointer() does not inline +// (even on x86), so this does not become a simple store on x86. +func (Export) AtomicSetPointer(dstPtr, valPtr any) { + interfaceToPointer(&dstPtr).atomicSetPointer(interfaceToPointer(&valPtr)) +} + +// AtomicLoadPointer loads the pointer at the location pointed at by src, +// and stores that pointer value into the location pointed at by dst. +func (Export) AtomicLoadPointer(ptr Pointer, dst Pointer) { + *(*unsafe.Pointer)(unsafe.Pointer(dst)) = atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(ptr))) +} + +// AtomicInitializePointer makes ptr and dst point to the same value. +// +// If *ptr is a nil pointer, it sets *ptr = *dst. +// +// If *ptr is a non-nil pointer, it sets *dst = *ptr. +func (Export) AtomicInitializePointer(ptr Pointer, dst Pointer) { + if !atomic.CompareAndSwapPointer((*unsafe.Pointer)(ptr), unsafe.Pointer(nil), *(*unsafe.Pointer)(dst)) { + *(*unsafe.Pointer)(unsafe.Pointer(dst)) = atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(ptr))) + } +} + +// MessageFieldStringOf returns the field formatted as a string, +// either as the field name if resolvable otherwise as a decimal string. +func (Export) MessageFieldStringOf(md protoreflect.MessageDescriptor, n protoreflect.FieldNumber) string { + fd := md.Fields().ByNumber(n) + if fd != nil { + return string(fd.Name()) + } + return strconv.Itoa(int(n)) +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/bitmap.go b/vendor/google.golang.org/protobuf/internal/impl/bitmap.go new file mode 100644 index 0000000000..ea276547cd --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/bitmap.go @@ -0,0 +1,34 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !race + +package impl + +// There is no additional data as we're not running under race detector. +type RaceDetectHookData struct{} + +// Empty stubs for when not using the race detector. Calls to these from index.go should be optimized away. +func (presence) raceDetectHookPresent(num uint32) {} +func (presence) raceDetectHookSetPresent(num uint32, size presenceSize) {} +func (presence) raceDetectHookClearPresent(num uint32) {} +func (presence) raceDetectHookAllocAndCopy(src presence) {} + +// raceDetectHookPresent is called by the generated file interface +// (*proto.internalFuncs) Present to optionally read an unprotected +// shadow bitmap when race detection is enabled. In regular code it is +// a noop. +func raceDetectHookPresent(field *uint32, num uint32) {} + +// raceDetectHookSetPresent is called by the generated file interface +// (*proto.internalFuncs) SetPresent to optionally write an unprotected +// shadow bitmap when race detection is enabled. In regular code it is +// a noop. +func raceDetectHookSetPresent(field *uint32, num uint32, size presenceSize) {} + +// raceDetectHookClearPresent is called by the generated file interface +// (*proto.internalFuncs) ClearPresent to optionally write an unprotected +// shadow bitmap when race detection is enabled. In regular code it is +// a noop. +func raceDetectHookClearPresent(field *uint32, num uint32) {} diff --git a/vendor/google.golang.org/protobuf/internal/impl/bitmap_race.go b/vendor/google.golang.org/protobuf/internal/impl/bitmap_race.go new file mode 100644 index 0000000000..e9a27583ae --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/bitmap_race.go @@ -0,0 +1,126 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build race + +package impl + +// When running under race detector, we add a presence map of bytes, that we can access +// in the hook functions so that we trigger the race detection whenever we have concurrent +// Read-Writes or Write-Writes. The race detector does not otherwise detect invalid concurrent +// access to lazy fields as all updates of bitmaps and pointers are done using atomic operations. +type RaceDetectHookData struct { + shadowPresence *[]byte +} + +// Hooks for presence bitmap operations that allocate, read and write the shadowPresence +// using non-atomic operations. +func (data *RaceDetectHookData) raceDetectHookAlloc(size presenceSize) { + sp := make([]byte, size) + atomicStoreShadowPresence(&data.shadowPresence, &sp) +} + +func (p presence) raceDetectHookPresent(num uint32) { + data := p.toRaceDetectData() + if data == nil { + return + } + sp := atomicLoadShadowPresence(&data.shadowPresence) + if sp != nil { + _ = (*sp)[num] + } +} + +func (p presence) raceDetectHookSetPresent(num uint32, size presenceSize) { + data := p.toRaceDetectData() + if data == nil { + return + } + sp := atomicLoadShadowPresence(&data.shadowPresence) + if sp == nil { + data.raceDetectHookAlloc(size) + sp = atomicLoadShadowPresence(&data.shadowPresence) + } + (*sp)[num] = 1 +} + +func (p presence) raceDetectHookClearPresent(num uint32) { + data := p.toRaceDetectData() + if data == nil { + return + } + sp := atomicLoadShadowPresence(&data.shadowPresence) + if sp != nil { + (*sp)[num] = 0 + + } +} + +// raceDetectHookAllocAndCopy allocates a new shadowPresence slice at lazy and copies +// shadowPresence bytes from src to lazy. +func (p presence) raceDetectHookAllocAndCopy(q presence) { + sData := q.toRaceDetectData() + dData := p.toRaceDetectData() + if sData == nil { + return + } + srcSp := atomicLoadShadowPresence(&sData.shadowPresence) + if srcSp == nil { + atomicStoreShadowPresence(&dData.shadowPresence, nil) + return + } + n := len(*srcSp) + dSlice := make([]byte, n) + atomicStoreShadowPresence(&dData.shadowPresence, &dSlice) + for i := 0; i < n; i++ { + dSlice[i] = (*srcSp)[i] + } +} + +// raceDetectHookPresent is called by the generated file interface +// (*proto.internalFuncs) Present to optionally read an unprotected +// shadow bitmap when race detection is enabled. In regular code it is +// a noop. +func raceDetectHookPresent(field *uint32, num uint32) { + data := findPointerToRaceDetectData(field, num) + if data == nil { + return + } + sp := atomicLoadShadowPresence(&data.shadowPresence) + if sp != nil { + _ = (*sp)[num] + } +} + +// raceDetectHookSetPresent is called by the generated file interface +// (*proto.internalFuncs) SetPresent to optionally write an unprotected +// shadow bitmap when race detection is enabled. In regular code it is +// a noop. +func raceDetectHookSetPresent(field *uint32, num uint32, size presenceSize) { + data := findPointerToRaceDetectData(field, num) + if data == nil { + return + } + sp := atomicLoadShadowPresence(&data.shadowPresence) + if sp == nil { + data.raceDetectHookAlloc(size) + sp = atomicLoadShadowPresence(&data.shadowPresence) + } + (*sp)[num] = 1 +} + +// raceDetectHookClearPresent is called by the generated file interface +// (*proto.internalFuncs) ClearPresent to optionally write an unprotected +// shadow bitmap when race detection is enabled. In regular code it is +// a noop. +func raceDetectHookClearPresent(field *uint32, num uint32) { + data := findPointerToRaceDetectData(field, num) + if data == nil { + return + } + sp := atomicLoadShadowPresence(&data.shadowPresence) + if sp != nil { + (*sp)[num] = 0 + } +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/checkinit.go b/vendor/google.golang.org/protobuf/internal/impl/checkinit.go index f29e6a8fa8..fe2c719ce4 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/checkinit.go +++ b/vendor/google.golang.org/protobuf/internal/impl/checkinit.go @@ -35,6 +35,12 @@ func (mi *MessageInfo) checkInitializedPointer(p pointer) error { } return nil } + + var presence presence + if mi.presenceOffset.IsValid() { + presence = p.Apply(mi.presenceOffset).PresenceInfo() + } + if mi.extensionOffset.IsValid() { e := p.Apply(mi.extensionOffset).Extensions() if err := mi.isInitExtensions(e); err != nil { @@ -45,6 +51,33 @@ func (mi *MessageInfo) checkInitializedPointer(p pointer) error { if !f.isRequired && f.funcs.isInit == nil { continue } + + if f.presenceIndex != noPresence { + if !presence.Present(f.presenceIndex) { + if f.isRequired { + return errors.RequiredNotSet(string(mi.Desc.Fields().ByNumber(f.num).FullName())) + } + continue + } + if f.funcs.isInit != nil { + f.mi.init() + if f.mi.needsInitCheck { + if f.isLazy && p.Apply(f.offset).AtomicGetPointer().IsNil() { + lazy := *p.Apply(mi.lazyOffset).LazyInfoPtr() + if !lazy.AllowedPartial() { + // Nothing to see here, it was checked on unmarshal + continue + } + mi.lazyUnmarshal(p, f.num) + } + if err := f.funcs.isInit(p.Apply(f.offset), f); err != nil { + return err + } + } + } + continue + } + fptr := p.Apply(f.offset) if f.isPointer && fptr.Elem().IsNil() { if f.isRequired { diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_field_opaque.go b/vendor/google.golang.org/protobuf/internal/impl/codec_field_opaque.go new file mode 100644 index 0000000000..76818ea252 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_field_opaque.go @@ -0,0 +1,264 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package impl + +import ( + "fmt" + "reflect" + + "google.golang.org/protobuf/encoding/protowire" + "google.golang.org/protobuf/internal/errors" + "google.golang.org/protobuf/reflect/protoreflect" +) + +func makeOpaqueMessageFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) { + mi := getMessageInfo(ft) + if mi == nil { + panic(fmt.Sprintf("invalid field: %v: unsupported message type %v", fd.FullName(), ft)) + } + switch fd.Kind() { + case protoreflect.MessageKind: + return mi, pointerCoderFuncs{ + size: sizeOpaqueMessage, + marshal: appendOpaqueMessage, + unmarshal: consumeOpaqueMessage, + isInit: isInitOpaqueMessage, + merge: mergeOpaqueMessage, + } + case protoreflect.GroupKind: + return mi, pointerCoderFuncs{ + size: sizeOpaqueGroup, + marshal: appendOpaqueGroup, + unmarshal: consumeOpaqueGroup, + isInit: isInitOpaqueMessage, + merge: mergeOpaqueMessage, + } + } + panic("unexpected field kind") +} + +func sizeOpaqueMessage(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) { + return protowire.SizeBytes(f.mi.sizePointer(p.AtomicGetPointer(), opts)) + f.tagsize +} + +func appendOpaqueMessage(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { + mp := p.AtomicGetPointer() + calculatedSize := f.mi.sizePointer(mp, opts) + b = protowire.AppendVarint(b, f.wiretag) + b = protowire.AppendVarint(b, uint64(calculatedSize)) + before := len(b) + b, err := f.mi.marshalAppendPointer(b, mp, opts) + if measuredSize := len(b) - before; calculatedSize != measuredSize && err == nil { + return nil, errors.MismatchedSizeCalculation(calculatedSize, measuredSize) + } + return b, err +} + +func consumeOpaqueMessage(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { + if wtyp != protowire.BytesType { + return out, errUnknown + } + v, n := protowire.ConsumeBytes(b) + if n < 0 { + return out, errDecode + } + mp := p.AtomicGetPointer() + if mp.IsNil() { + mp = p.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem()))) + } + o, err := f.mi.unmarshalPointer(v, mp, 0, opts) + if err != nil { + return out, err + } + out.n = n + out.initialized = o.initialized + return out, nil +} + +func isInitOpaqueMessage(p pointer, f *coderFieldInfo) error { + mp := p.AtomicGetPointer() + if mp.IsNil() { + return nil + } + return f.mi.checkInitializedPointer(mp) +} + +func mergeOpaqueMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { + dstmp := dst.AtomicGetPointer() + if dstmp.IsNil() { + dstmp = dst.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem()))) + } + f.mi.mergePointer(dstmp, src.AtomicGetPointer(), opts) +} + +func sizeOpaqueGroup(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) { + return 2*f.tagsize + f.mi.sizePointer(p.AtomicGetPointer(), opts) +} + +func appendOpaqueGroup(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { + b = protowire.AppendVarint(b, f.wiretag) // start group + b, err := f.mi.marshalAppendPointer(b, p.AtomicGetPointer(), opts) + b = protowire.AppendVarint(b, f.wiretag+1) // end group + return b, err +} + +func consumeOpaqueGroup(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { + if wtyp != protowire.StartGroupType { + return out, errUnknown + } + mp := p.AtomicGetPointer() + if mp.IsNil() { + mp = p.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem()))) + } + o, e := f.mi.unmarshalPointer(b, mp, f.num, opts) + return o, e +} + +func makeOpaqueRepeatedMessageFieldCoder(fd protoreflect.FieldDescriptor, ft reflect.Type) (*MessageInfo, pointerCoderFuncs) { + if ft.Kind() != reflect.Ptr || ft.Elem().Kind() != reflect.Slice { + panic(fmt.Sprintf("invalid field: %v: unsupported type for opaque repeated message: %v", fd.FullName(), ft)) + } + mt := ft.Elem().Elem() // *[]*T -> *T + mi := getMessageInfo(mt) + if mi == nil { + panic(fmt.Sprintf("invalid field: %v: unsupported message type %v", fd.FullName(), mt)) + } + switch fd.Kind() { + case protoreflect.MessageKind: + return mi, pointerCoderFuncs{ + size: sizeOpaqueMessageSlice, + marshal: appendOpaqueMessageSlice, + unmarshal: consumeOpaqueMessageSlice, + isInit: isInitOpaqueMessageSlice, + merge: mergeOpaqueMessageSlice, + } + case protoreflect.GroupKind: + return mi, pointerCoderFuncs{ + size: sizeOpaqueGroupSlice, + marshal: appendOpaqueGroupSlice, + unmarshal: consumeOpaqueGroupSlice, + isInit: isInitOpaqueMessageSlice, + merge: mergeOpaqueMessageSlice, + } + } + panic("unexpected field kind") +} + +func sizeOpaqueMessageSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) { + s := p.AtomicGetPointer().PointerSlice() + n := 0 + for _, v := range s { + n += protowire.SizeBytes(f.mi.sizePointer(v, opts)) + f.tagsize + } + return n +} + +func appendOpaqueMessageSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { + s := p.AtomicGetPointer().PointerSlice() + var err error + for _, v := range s { + b = protowire.AppendVarint(b, f.wiretag) + siz := f.mi.sizePointer(v, opts) + b = protowire.AppendVarint(b, uint64(siz)) + before := len(b) + b, err = f.mi.marshalAppendPointer(b, v, opts) + if err != nil { + return b, err + } + if measuredSize := len(b) - before; siz != measuredSize { + return nil, errors.MismatchedSizeCalculation(siz, measuredSize) + } + } + return b, nil +} + +func consumeOpaqueMessageSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { + if wtyp != protowire.BytesType { + return out, errUnknown + } + v, n := protowire.ConsumeBytes(b) + if n < 0 { + return out, errDecode + } + mp := pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())) + o, err := f.mi.unmarshalPointer(v, mp, 0, opts) + if err != nil { + return out, err + } + sp := p.AtomicGetPointer() + if sp.IsNil() { + sp = p.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.ft.Elem()))) + } + sp.AppendPointerSlice(mp) + out.n = n + out.initialized = o.initialized + return out, nil +} + +func isInitOpaqueMessageSlice(p pointer, f *coderFieldInfo) error { + sp := p.AtomicGetPointer() + if sp.IsNil() { + return nil + } + s := sp.PointerSlice() + for _, v := range s { + if err := f.mi.checkInitializedPointer(v); err != nil { + return err + } + } + return nil +} + +func mergeOpaqueMessageSlice(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { + ds := dst.AtomicGetPointer() + if ds.IsNil() { + ds = dst.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.ft.Elem()))) + } + for _, sp := range src.AtomicGetPointer().PointerSlice() { + dm := pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())) + f.mi.mergePointer(dm, sp, opts) + ds.AppendPointerSlice(dm) + } +} + +func sizeOpaqueGroupSlice(p pointer, f *coderFieldInfo, opts marshalOptions) (size int) { + s := p.AtomicGetPointer().PointerSlice() + n := 0 + for _, v := range s { + n += 2*f.tagsize + f.mi.sizePointer(v, opts) + } + return n +} + +func appendOpaqueGroupSlice(b []byte, p pointer, f *coderFieldInfo, opts marshalOptions) ([]byte, error) { + s := p.AtomicGetPointer().PointerSlice() + var err error + for _, v := range s { + b = protowire.AppendVarint(b, f.wiretag) // start group + b, err = f.mi.marshalAppendPointer(b, v, opts) + if err != nil { + return b, err + } + b = protowire.AppendVarint(b, f.wiretag+1) // end group + } + return b, nil +} + +func consumeOpaqueGroupSlice(b []byte, p pointer, wtyp protowire.Type, f *coderFieldInfo, opts unmarshalOptions) (out unmarshalOutput, err error) { + if wtyp != protowire.StartGroupType { + return out, errUnknown + } + mp := pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())) + out, err = f.mi.unmarshalPointer(b, mp, f.num, opts) + if err != nil { + return out, err + } + sp := p.AtomicGetPointer() + if sp.IsNil() { + sp = p.AtomicSetPointerIfNil(pointerOfValue(reflect.New(f.ft.Elem()))) + } + sp.AppendPointerSlice(mp) + return out, err +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go index 78be9df342..2f7b363ec4 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_message.go @@ -32,6 +32,10 @@ type coderMessageInfo struct { needsInitCheck bool isMessageSet bool numRequiredFields uint8 + + lazyOffset offset + presenceOffset offset + presenceSize presenceSize } type coderFieldInfo struct { @@ -45,12 +49,19 @@ type coderFieldInfo struct { tagsize int // size of the varint-encoded tag isPointer bool // true if IsNil may be called on the struct field isRequired bool // true if field is required + + isLazy bool + presenceIndex uint32 } +const noPresence = 0xffffffff + func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { mi.sizecacheOffset = invalidOffset mi.unknownOffset = invalidOffset mi.extensionOffset = invalidOffset + mi.lazyOffset = invalidOffset + mi.presenceOffset = si.presenceOffset if si.sizecacheOffset.IsValid() && si.sizecacheType == sizecacheType { mi.sizecacheOffset = si.sizecacheOffset @@ -127,6 +138,8 @@ func (mi *MessageInfo) makeCoderMethods(t reflect.Type, si structInfo) { validation: newFieldValidationInfo(mi, si, fd, ft), isPointer: fd.Cardinality() == protoreflect.Repeated || fd.HasPresence(), isRequired: fd.Cardinality() == protoreflect.Required, + + presenceIndex: noPresence, } mi.orderedCoderFields = append(mi.orderedCoderFields, cf) mi.coderFields[cf.num] = cf diff --git a/vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.go b/vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.go new file mode 100644 index 0000000000..88c16ae5b7 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/codec_message_opaque.go @@ -0,0 +1,156 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package impl + +import ( + "fmt" + "reflect" + "sort" + + "google.golang.org/protobuf/encoding/protowire" + "google.golang.org/protobuf/internal/encoding/messageset" + "google.golang.org/protobuf/internal/order" + "google.golang.org/protobuf/reflect/protoreflect" + piface "google.golang.org/protobuf/runtime/protoiface" +) + +func (mi *MessageInfo) makeOpaqueCoderMethods(t reflect.Type, si opaqueStructInfo) { + mi.sizecacheOffset = si.sizecacheOffset + mi.unknownOffset = si.unknownOffset + mi.unknownPtrKind = si.unknownType.Kind() == reflect.Ptr + mi.extensionOffset = si.extensionOffset + mi.lazyOffset = si.lazyOffset + mi.presenceOffset = si.presenceOffset + + mi.coderFields = make(map[protowire.Number]*coderFieldInfo) + fields := mi.Desc.Fields() + for i := 0; i < fields.Len(); i++ { + fd := fields.Get(i) + + fs := si.fieldsByNumber[fd.Number()] + if fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic() { + fs = si.oneofsByName[fd.ContainingOneof().Name()] + } + ft := fs.Type + var wiretag uint64 + if !fd.IsPacked() { + wiretag = protowire.EncodeTag(fd.Number(), wireTypes[fd.Kind()]) + } else { + wiretag = protowire.EncodeTag(fd.Number(), protowire.BytesType) + } + var fieldOffset offset + var funcs pointerCoderFuncs + var childMessage *MessageInfo + switch { + case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic(): + fieldOffset = offsetOf(fs, mi.Exporter) + case fd.IsWeak(): + fieldOffset = si.weakOffset + funcs = makeWeakMessageFieldCoder(fd) + case fd.Message() != nil && !fd.IsMap(): + fieldOffset = offsetOf(fs, mi.Exporter) + if fd.IsList() { + childMessage, funcs = makeOpaqueRepeatedMessageFieldCoder(fd, ft) + } else { + childMessage, funcs = makeOpaqueMessageFieldCoder(fd, ft) + } + default: + fieldOffset = offsetOf(fs, mi.Exporter) + childMessage, funcs = fieldCoder(fd, ft) + } + cf := &coderFieldInfo{ + num: fd.Number(), + offset: fieldOffset, + wiretag: wiretag, + ft: ft, + tagsize: protowire.SizeVarint(wiretag), + funcs: funcs, + mi: childMessage, + validation: newFieldValidationInfo(mi, si.structInfo, fd, ft), + isPointer: (fd.Cardinality() == protoreflect.Repeated || + fd.Kind() == protoreflect.MessageKind || + fd.Kind() == protoreflect.GroupKind), + isRequired: fd.Cardinality() == protoreflect.Required, + presenceIndex: noPresence, + } + + // TODO: Use presence for all fields. + // + // In some cases, such as maps, presence means only "might be set" rather + // than "is definitely set", but every field should have a presence bit to + // permit us to skip over definitely-unset fields at marshal time. + + var hasPresence bool + hasPresence, cf.isLazy = usePresenceForField(si, fd) + + if hasPresence { + cf.presenceIndex, mi.presenceSize = presenceIndex(mi.Desc, fd) + } + + mi.orderedCoderFields = append(mi.orderedCoderFields, cf) + mi.coderFields[cf.num] = cf + } + for i, oneofs := 0, mi.Desc.Oneofs(); i < oneofs.Len(); i++ { + if od := oneofs.Get(i); !od.IsSynthetic() { + mi.initOneofFieldCoders(od, si.structInfo) + } + } + if messageset.IsMessageSet(mi.Desc) { + if !mi.extensionOffset.IsValid() { + panic(fmt.Sprintf("%v: MessageSet with no extensions field", mi.Desc.FullName())) + } + if !mi.unknownOffset.IsValid() { + panic(fmt.Sprintf("%v: MessageSet with no unknown field", mi.Desc.FullName())) + } + mi.isMessageSet = true + } + sort.Slice(mi.orderedCoderFields, func(i, j int) bool { + return mi.orderedCoderFields[i].num < mi.orderedCoderFields[j].num + }) + + var maxDense protoreflect.FieldNumber + for _, cf := range mi.orderedCoderFields { + if cf.num >= 16 && cf.num >= 2*maxDense { + break + } + maxDense = cf.num + } + mi.denseCoderFields = make([]*coderFieldInfo, maxDense+1) + for _, cf := range mi.orderedCoderFields { + if int(cf.num) > len(mi.denseCoderFields) { + break + } + mi.denseCoderFields[cf.num] = cf + } + + // To preserve compatibility with historic wire output, marshal oneofs last. + if mi.Desc.Oneofs().Len() > 0 { + sort.Slice(mi.orderedCoderFields, func(i, j int) bool { + fi := fields.ByNumber(mi.orderedCoderFields[i].num) + fj := fields.ByNumber(mi.orderedCoderFields[j].num) + return order.LegacyFieldOrder(fi, fj) + }) + } + + mi.needsInitCheck = needsInitCheck(mi.Desc) + if mi.methods.Marshal == nil && mi.methods.Size == nil { + mi.methods.Flags |= piface.SupportMarshalDeterministic + mi.methods.Marshal = mi.marshal + mi.methods.Size = mi.size + } + if mi.methods.Unmarshal == nil { + mi.methods.Flags |= piface.SupportUnmarshalDiscardUnknown + mi.methods.Unmarshal = mi.unmarshal + } + if mi.methods.CheckInitialized == nil { + mi.methods.CheckInitialized = mi.checkInitialized + } + if mi.methods.Merge == nil { + mi.methods.Merge = mi.merge + } + if mi.methods.Equal == nil { + mi.methods.Equal = equal + } +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/decode.go b/vendor/google.golang.org/protobuf/internal/impl/decode.go index cda0520c27..e0dd21fa5f 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/decode.go +++ b/vendor/google.golang.org/protobuf/internal/impl/decode.go @@ -34,6 +34,8 @@ func (o unmarshalOptions) Options() proto.UnmarshalOptions { AllowPartial: true, DiscardUnknown: o.DiscardUnknown(), Resolver: o.resolver, + + NoLazyDecoding: o.NoLazyDecoding(), } } @@ -41,13 +43,26 @@ func (o unmarshalOptions) DiscardUnknown() bool { return o.flags&protoiface.UnmarshalDiscardUnknown != 0 } -func (o unmarshalOptions) IsDefault() bool { - return o.flags == 0 && o.resolver == protoregistry.GlobalTypes +func (o unmarshalOptions) AliasBuffer() bool { return o.flags&protoiface.UnmarshalAliasBuffer != 0 } +func (o unmarshalOptions) Validated() bool { return o.flags&protoiface.UnmarshalValidated != 0 } +func (o unmarshalOptions) NoLazyDecoding() bool { + return o.flags&protoiface.UnmarshalNoLazyDecoding != 0 +} + +func (o unmarshalOptions) CanBeLazy() bool { + if o.resolver != protoregistry.GlobalTypes { + return false + } + // We ignore the UnmarshalInvalidateSizeCache even though it's not in the default set + return (o.flags & ^(protoiface.UnmarshalAliasBuffer | protoiface.UnmarshalValidated | protoiface.UnmarshalCheckRequired)) == 0 } var lazyUnmarshalOptions = unmarshalOptions{ resolver: protoregistry.GlobalTypes, - depth: protowire.DefaultRecursionLimit, + + flags: protoiface.UnmarshalAliasBuffer | protoiface.UnmarshalValidated, + + depth: protowire.DefaultRecursionLimit, } type unmarshalOutput struct { @@ -94,9 +109,30 @@ func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire. if flags.ProtoLegacy && mi.isMessageSet { return unmarshalMessageSet(mi, b, p, opts) } + + lazyDecoding := LazyEnabled() // default + if opts.NoLazyDecoding() { + lazyDecoding = false // explicitly disabled + } + if mi.lazyOffset.IsValid() && lazyDecoding { + return mi.unmarshalPointerLazy(b, p, groupTag, opts) + } + return mi.unmarshalPointerEager(b, p, groupTag, opts) +} + +// unmarshalPointerEager is the message unmarshalling function for all messages that are not lazy. +// The corresponding function for Lazy is in google_lazy.go. +func (mi *MessageInfo) unmarshalPointerEager(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) { + initialized := true var requiredMask uint64 var exts *map[int32]ExtensionField + + var presence presence + if mi.presenceOffset.IsValid() { + presence = p.Apply(mi.presenceOffset).PresenceInfo() + } + start := len(b) for len(b) > 0 { // Parse the tag (field number and wire type). @@ -154,6 +190,11 @@ func (mi *MessageInfo) unmarshalPointer(b []byte, p pointer, groupTag protowire. if f.funcs.isInit != nil && !o.initialized { initialized = false } + + if f.presenceIndex != noPresence { + presence.SetPresentUnatomic(f.presenceIndex, mi.presenceSize) + } + default: // Possible extension. if exts == nil && mi.extensionOffset.IsValid() { @@ -222,7 +263,7 @@ func (mi *MessageInfo) unmarshalExtension(b []byte, num protowire.Number, wtyp p return out, errUnknown } if flags.LazyUnmarshalExtensions { - if opts.IsDefault() && x.canLazy(xt) { + if opts.CanBeLazy() && x.canLazy(xt) { out, valid := skipExtension(b, xi, num, wtyp, opts) switch valid { case ValidationValid: @@ -270,6 +311,13 @@ func skipExtension(b []byte, xi *extensionFieldInfo, num protowire.Number, wtyp if n < 0 { return out, ValidationUnknown } + + if opts.Validated() { + out.initialized = true + out.n = n + return out, ValidationValid + } + out, st := xi.validation.mi.validate(v, 0, opts) out.n = n return out, st diff --git a/vendor/google.golang.org/protobuf/internal/impl/encode.go b/vendor/google.golang.org/protobuf/internal/impl/encode.go index 6254f5de41..b2e212291d 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/encode.go +++ b/vendor/google.golang.org/protobuf/internal/impl/encode.go @@ -10,6 +10,7 @@ import ( "sync/atomic" "google.golang.org/protobuf/internal/flags" + "google.golang.org/protobuf/internal/protolazy" "google.golang.org/protobuf/proto" piface "google.golang.org/protobuf/runtime/protoiface" ) @@ -71,11 +72,39 @@ func (mi *MessageInfo) sizePointerSlow(p pointer, opts marshalOptions) (size int e := p.Apply(mi.extensionOffset).Extensions() size += mi.sizeExtensions(e, opts) } + + var lazy **protolazy.XXX_lazyUnmarshalInfo + var presence presence + if mi.presenceOffset.IsValid() { + presence = p.Apply(mi.presenceOffset).PresenceInfo() + if mi.lazyOffset.IsValid() { + lazy = p.Apply(mi.lazyOffset).LazyInfoPtr() + } + } + for _, f := range mi.orderedCoderFields { if f.funcs.size == nil { continue } fptr := p.Apply(f.offset) + + if f.presenceIndex != noPresence { + if !presence.Present(f.presenceIndex) { + continue + } + + if f.isLazy && fptr.AtomicGetPointer().IsNil() { + if lazyFields(opts) { + size += (*lazy).SizeField(uint32(f.num)) + continue + } else { + mi.lazyUnmarshal(p, f.num) + } + } + size += f.funcs.size(fptr, f, opts) + continue + } + if f.isPointer && fptr.Elem().IsNil() { continue } @@ -134,11 +163,52 @@ func (mi *MessageInfo) marshalAppendPointer(b []byte, p pointer, opts marshalOpt return b, err } } + + var lazy **protolazy.XXX_lazyUnmarshalInfo + var presence presence + if mi.presenceOffset.IsValid() { + presence = p.Apply(mi.presenceOffset).PresenceInfo() + if mi.lazyOffset.IsValid() { + lazy = p.Apply(mi.lazyOffset).LazyInfoPtr() + } + } + for _, f := range mi.orderedCoderFields { if f.funcs.marshal == nil { continue } fptr := p.Apply(f.offset) + + if f.presenceIndex != noPresence { + if !presence.Present(f.presenceIndex) { + continue + } + if f.isLazy { + // Be careful, this field needs to be read atomically, like for a get + if f.isPointer && fptr.AtomicGetPointer().IsNil() { + if lazyFields(opts) { + b, _ = (*lazy).AppendField(b, uint32(f.num)) + continue + } else { + mi.lazyUnmarshal(p, f.num) + } + } + + b, err = f.funcs.marshal(b, fptr, f, opts) + if err != nil { + return b, err + } + continue + } else if f.isPointer && fptr.Elem().IsNil() { + continue + } + b, err = f.funcs.marshal(b, fptr, f, opts) + if err != nil { + return b, err + } + continue + } + if f.isPointer && fptr.Elem().IsNil() { continue } @@ -163,6 +233,14 @@ func fullyLazyExtensions(opts marshalOptions) bool { return opts.flags&piface.MarshalDeterministic == 0 } +// lazyFields returns true if we should attempt to keep fields lazy over size and marshal. +func lazyFields(opts marshalOptions) bool { + // When deterministic marshaling is requested, force an unmarshal for lazy + // fields to produce a deterministic result, instead of passing through + // bytes lazily that may or may not match what Go Protobuf would produce. + return opts.flags&piface.MarshalDeterministic == 0 +} + func (mi *MessageInfo) sizeExtensions(ext *map[int32]ExtensionField, opts marshalOptions) (n int) { if ext == nil { return 0 diff --git a/vendor/google.golang.org/protobuf/internal/impl/lazy.go b/vendor/google.golang.org/protobuf/internal/impl/lazy.go new file mode 100644 index 0000000000..e8fb6c35b4 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/lazy.go @@ -0,0 +1,433 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package impl + +import ( + "fmt" + "math/bits" + "os" + "reflect" + "sort" + "sync/atomic" + + "google.golang.org/protobuf/encoding/protowire" + "google.golang.org/protobuf/internal/errors" + "google.golang.org/protobuf/internal/protolazy" + "google.golang.org/protobuf/reflect/protoreflect" + preg "google.golang.org/protobuf/reflect/protoregistry" + piface "google.golang.org/protobuf/runtime/protoiface" +) + +var enableLazy int32 = func() int32 { + if os.Getenv("GOPROTODEBUG") == "nolazy" { + return 0 + } + return 1 +}() + +// EnableLazyUnmarshal enables lazy unmarshaling. +func EnableLazyUnmarshal(enable bool) { + if enable { + atomic.StoreInt32(&enableLazy, 1) + return + } + atomic.StoreInt32(&enableLazy, 0) +} + +// LazyEnabled reports whether lazy unmarshalling is currently enabled. +func LazyEnabled() bool { + return atomic.LoadInt32(&enableLazy) != 0 +} + +// UnmarshalField unmarshals a field in a message. +func UnmarshalField(m interface{}, num protowire.Number) { + switch m := m.(type) { + case *messageState: + m.messageInfo().lazyUnmarshal(m.pointer(), num) + case *messageReflectWrapper: + m.messageInfo().lazyUnmarshal(m.pointer(), num) + default: + panic(fmt.Sprintf("unsupported wrapper type %T", m)) + } +} + +func (mi *MessageInfo) lazyUnmarshal(p pointer, num protoreflect.FieldNumber) { + var f *coderFieldInfo + if int(num) < len(mi.denseCoderFields) { + f = mi.denseCoderFields[num] + } else { + f = mi.coderFields[num] + } + if f == nil { + panic(fmt.Sprintf("lazyUnmarshal: field info for %v.%v", mi.Desc.FullName(), num)) + } + lazy := *p.Apply(mi.lazyOffset).LazyInfoPtr() + start, end, found, _, multipleEntries := lazy.FindFieldInProto(uint32(num)) + if !found && multipleEntries == nil { + panic(fmt.Sprintf("lazyUnmarshal: can't find field data for %v.%v", mi.Desc.FullName(), num)) + } + // The actual pointer in the message can not be set until the whole struct is filled in, otherwise we will have races. + // Create another pointer and set it atomically, if we won the race and the pointer in the original message is still nil. + fp := pointerOfValue(reflect.New(f.ft)) + if multipleEntries != nil { + for _, entry := range multipleEntries { + mi.unmarshalField(lazy.Buffer()[entry.Start:entry.End], fp, f, lazy, lazy.UnmarshalFlags()) + } + } else { + mi.unmarshalField(lazy.Buffer()[start:end], fp, f, lazy, lazy.UnmarshalFlags()) + } + p.Apply(f.offset).AtomicSetPointerIfNil(fp.Elem()) +} + +func (mi *MessageInfo) unmarshalField(b []byte, p pointer, f *coderFieldInfo, lazyInfo *protolazy.XXX_lazyUnmarshalInfo, flags piface.UnmarshalInputFlags) error { + opts := lazyUnmarshalOptions + opts.flags |= flags + for len(b) > 0 { + // Parse the tag (field number and wire type). + var tag uint64 + if b[0] < 0x80 { + tag = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + tag = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + tag, n = protowire.ConsumeVarint(b) + if n < 0 { + return errors.New("invalid wire data") + } + b = b[n:] + } + var num protowire.Number + if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) { + return errors.New("invalid wire data") + } else { + num = protowire.Number(n) + } + wtyp := protowire.Type(tag & 7) + if num == f.num { + o, err := f.funcs.unmarshal(b, p, wtyp, f, opts) + if err == nil { + b = b[o.n:] + continue + } + if err != errUnknown { + return err + } + } + n := protowire.ConsumeFieldValue(num, wtyp, b) + if n < 0 { + return errors.New("invalid wire data") + } + b = b[n:] + } + return nil +} + +func (mi *MessageInfo) skipField(b []byte, f *coderFieldInfo, wtyp protowire.Type, opts unmarshalOptions) (out unmarshalOutput, _ ValidationStatus) { + fmi := f.validation.mi + if fmi == nil { + fd := mi.Desc.Fields().ByNumber(f.num) + if fd == nil || !fd.IsWeak() { + return out, ValidationUnknown + } + messageName := fd.Message().FullName() + messageType, err := preg.GlobalTypes.FindMessageByName(messageName) + if err != nil { + return out, ValidationUnknown + } + var ok bool + fmi, ok = messageType.(*MessageInfo) + if !ok { + return out, ValidationUnknown + } + } + fmi.init() + switch f.validation.typ { + case validationTypeMessage: + if wtyp != protowire.BytesType { + return out, ValidationWrongWireType + } + v, n := protowire.ConsumeBytes(b) + if n < 0 { + return out, ValidationInvalid + } + out, st := fmi.validate(v, 0, opts) + out.n = n + return out, st + case validationTypeGroup: + if wtyp != protowire.StartGroupType { + return out, ValidationWrongWireType + } + out, st := fmi.validate(b, f.num, opts) + return out, st + default: + return out, ValidationUnknown + } +} + +// unmarshalPointerLazy is similar to unmarshalPointerEager, but it +// specifically handles lazy unmarshalling. it expects lazyOffset and +// presenceOffset to both be valid. +func (mi *MessageInfo) unmarshalPointerLazy(b []byte, p pointer, groupTag protowire.Number, opts unmarshalOptions) (out unmarshalOutput, err error) { + initialized := true + var requiredMask uint64 + var lazy **protolazy.XXX_lazyUnmarshalInfo + var presence presence + var lazyIndex []protolazy.IndexEntry + var lastNum protowire.Number + outOfOrder := false + lazyDecode := false + presence = p.Apply(mi.presenceOffset).PresenceInfo() + lazy = p.Apply(mi.lazyOffset).LazyInfoPtr() + if !presence.AnyPresent(mi.presenceSize) { + if opts.CanBeLazy() { + // If the message contains existing data, we need to merge into it. + // Lazy unmarshaling doesn't merge, so only enable it when the + // message is empty (has no presence bitmap). + lazyDecode = true + if *lazy == nil { + *lazy = &protolazy.XXX_lazyUnmarshalInfo{} + } + (*lazy).SetUnmarshalFlags(opts.flags) + if !opts.AliasBuffer() { + // Make a copy of the buffer for lazy unmarshaling. + // Set the AliasBuffer flag so recursive unmarshal + // operations reuse the copy. + b = append([]byte{}, b...) + opts.flags |= piface.UnmarshalAliasBuffer + } + (*lazy).SetBuffer(b) + } + } + // Track special handling of lazy fields. + // + // In the common case, all fields are lazyValidateOnly (and lazyFields remains nil). + // In the event that validation for a field fails, this map tracks handling of the field. + type lazyAction uint8 + const ( + lazyValidateOnly lazyAction = iota // validate the field only + lazyUnmarshalNow // eagerly unmarshal the field + lazyUnmarshalLater // unmarshal the field after the message is fully processed + ) + var lazyFields map[*coderFieldInfo]lazyAction + var exts *map[int32]ExtensionField + start := len(b) + pos := 0 + for len(b) > 0 { + // Parse the tag (field number and wire type). + var tag uint64 + if b[0] < 0x80 { + tag = uint64(b[0]) + b = b[1:] + } else if len(b) >= 2 && b[1] < 128 { + tag = uint64(b[0]&0x7f) + uint64(b[1])<<7 + b = b[2:] + } else { + var n int + tag, n = protowire.ConsumeVarint(b) + if n < 0 { + return out, errDecode + } + b = b[n:] + } + var num protowire.Number + if n := tag >> 3; n < uint64(protowire.MinValidNumber) || n > uint64(protowire.MaxValidNumber) { + return out, errors.New("invalid field number") + } else { + num = protowire.Number(n) + } + wtyp := protowire.Type(tag & 7) + + if wtyp == protowire.EndGroupType { + if num != groupTag { + return out, errors.New("mismatching end group marker") + } + groupTag = 0 + break + } + + var f *coderFieldInfo + if int(num) < len(mi.denseCoderFields) { + f = mi.denseCoderFields[num] + } else { + f = mi.coderFields[num] + } + var n int + err := errUnknown + discardUnknown := false + Field: + switch { + case f != nil: + if f.funcs.unmarshal == nil { + break + } + if f.isLazy && lazyDecode { + switch { + case lazyFields == nil || lazyFields[f] == lazyValidateOnly: + // Attempt to validate this field and leave it for later lazy unmarshaling. + o, valid := mi.skipField(b, f, wtyp, opts) + switch valid { + case ValidationValid: + // Skip over the valid field and continue. + err = nil + presence.SetPresentUnatomic(f.presenceIndex, mi.presenceSize) + requiredMask |= f.validation.requiredBit + if !o.initialized { + initialized = false + } + n = o.n + break Field + case ValidationInvalid: + return out, errors.New("invalid proto wire format") + case ValidationWrongWireType: + break Field + case ValidationUnknown: + if lazyFields == nil { + lazyFields = make(map[*coderFieldInfo]lazyAction) + } + if presence.Present(f.presenceIndex) { + // We were unable to determine if the field is valid or not, + // and we've already skipped over at least one instance of this + // field. Clear the presence bit (so if we stop decoding early, + // we don't leave a partially-initialized field around) and flag + // the field for unmarshaling before we return. + presence.ClearPresent(f.presenceIndex) + lazyFields[f] = lazyUnmarshalLater + discardUnknown = true + break Field + } else { + // We were unable to determine if the field is valid or not, + // but this is the first time we've seen it. Flag it as needing + // eager unmarshaling and fall through to the eager unmarshal case below. + lazyFields[f] = lazyUnmarshalNow + } + } + case lazyFields[f] == lazyUnmarshalLater: + // This field will be unmarshaled in a separate pass below. + // Skip over it here. + discardUnknown = true + break Field + default: + // Eagerly unmarshal the field. + } + } + if f.isLazy && !lazyDecode && presence.Present(f.presenceIndex) { + if p.Apply(f.offset).AtomicGetPointer().IsNil() { + mi.lazyUnmarshal(p, f.num) + } + } + var o unmarshalOutput + o, err = f.funcs.unmarshal(b, p.Apply(f.offset), wtyp, f, opts) + n = o.n + if err != nil { + break + } + requiredMask |= f.validation.requiredBit + if f.funcs.isInit != nil && !o.initialized { + initialized = false + } + if f.presenceIndex != noPresence { + presence.SetPresentUnatomic(f.presenceIndex, mi.presenceSize) + } + default: + // Possible extension. + if exts == nil && mi.extensionOffset.IsValid() { + exts = p.Apply(mi.extensionOffset).Extensions() + if *exts == nil { + *exts = make(map[int32]ExtensionField) + } + } + if exts == nil { + break + } + var o unmarshalOutput + o, err = mi.unmarshalExtension(b, num, wtyp, *exts, opts) + if err != nil { + break + } + n = o.n + if !o.initialized { + initialized = false + } + } + if err != nil { + if err != errUnknown { + return out, err + } + n = protowire.ConsumeFieldValue(num, wtyp, b) + if n < 0 { + return out, errDecode + } + if !discardUnknown && !opts.DiscardUnknown() && mi.unknownOffset.IsValid() { + u := mi.mutableUnknownBytes(p) + *u = protowire.AppendTag(*u, num, wtyp) + *u = append(*u, b[:n]...) + } + } + b = b[n:] + end := start - len(b) + if lazyDecode && f != nil && f.isLazy { + if num != lastNum { + lazyIndex = append(lazyIndex, protolazy.IndexEntry{ + FieldNum: uint32(num), + Start: uint32(pos), + End: uint32(end), + }) + } else { + i := len(lazyIndex) - 1 + lazyIndex[i].End = uint32(end) + lazyIndex[i].MultipleContiguous = true + } + } + if num < lastNum { + outOfOrder = true + } + pos = end + lastNum = num + } + if groupTag != 0 { + return out, errors.New("missing end group marker") + } + if lazyFields != nil { + // Some fields failed validation, and now need to be unmarshaled. + for f, action := range lazyFields { + if action != lazyUnmarshalLater { + continue + } + initialized = false + if *lazy == nil { + *lazy = &protolazy.XXX_lazyUnmarshalInfo{} + } + if err := mi.unmarshalField((*lazy).Buffer(), p.Apply(f.offset), f, *lazy, opts.flags); err != nil { + return out, err + } + presence.SetPresentUnatomic(f.presenceIndex, mi.presenceSize) + } + } + if lazyDecode { + if outOfOrder { + sort.Slice(lazyIndex, func(i, j int) bool { + return lazyIndex[i].FieldNum < lazyIndex[j].FieldNum || + (lazyIndex[i].FieldNum == lazyIndex[j].FieldNum && + lazyIndex[i].Start < lazyIndex[j].Start) + }) + } + if *lazy == nil { + *lazy = &protolazy.XXX_lazyUnmarshalInfo{} + } + + (*lazy).SetIndex(lazyIndex) + } + if mi.numRequiredFields > 0 && bits.OnesCount64(requiredMask) != int(mi.numRequiredFields) { + initialized = false + } + if initialized { + out.initialized = true + } + out.n = start - len(b) + return out, nil +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/merge.go b/vendor/google.golang.org/protobuf/internal/impl/merge.go index 7e65f64f28..8ffdce67d3 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/merge.go +++ b/vendor/google.golang.org/protobuf/internal/impl/merge.go @@ -41,11 +41,38 @@ func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { if src.IsNil() { return } + + var presenceSrc presence + var presenceDst presence + if mi.presenceOffset.IsValid() { + presenceSrc = src.Apply(mi.presenceOffset).PresenceInfo() + presenceDst = dst.Apply(mi.presenceOffset).PresenceInfo() + } + for _, f := range mi.orderedCoderFields { if f.funcs.merge == nil { continue } sfptr := src.Apply(f.offset) + + if f.presenceIndex != noPresence { + if !presenceSrc.Present(f.presenceIndex) { + continue + } + dfptr := dst.Apply(f.offset) + if f.isLazy { + if sfptr.AtomicGetPointer().IsNil() { + mi.lazyUnmarshal(src, f.num) + } + if presenceDst.Present(f.presenceIndex) && dfptr.AtomicGetPointer().IsNil() { + mi.lazyUnmarshal(dst, f.num) + } + } + f.funcs.merge(dst.Apply(f.offset), sfptr, f, opts) + presenceDst.SetPresentUnatomic(f.presenceIndex, mi.presenceSize) + continue + } + if f.isPointer && sfptr.Elem().IsNil() { continue } diff --git a/vendor/google.golang.org/protobuf/internal/impl/message.go b/vendor/google.golang.org/protobuf/internal/impl/message.go index 741b5ed29c..fa10a0f5cc 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message.go @@ -79,6 +79,9 @@ func (mi *MessageInfo) initOnce() { if mi.initDone == 1 { return } + if opaqueInitHook(mi) { + return + } t := mi.GoReflectType if t.Kind() != reflect.Ptr && t.Elem().Kind() != reflect.Struct { @@ -133,6 +136,9 @@ type structInfo struct { extensionOffset offset extensionType reflect.Type + lazyOffset offset + presenceOffset offset + fieldsByNumber map[protoreflect.FieldNumber]reflect.StructField oneofsByName map[protoreflect.Name]reflect.StructField oneofWrappersByType map[reflect.Type]protoreflect.FieldNumber @@ -145,6 +151,8 @@ func (mi *MessageInfo) makeStructInfo(t reflect.Type) structInfo { weakOffset: invalidOffset, unknownOffset: invalidOffset, extensionOffset: invalidOffset, + lazyOffset: invalidOffset, + presenceOffset: invalidOffset, fieldsByNumber: map[protoreflect.FieldNumber]reflect.StructField{}, oneofsByName: map[protoreflect.Name]reflect.StructField{}, @@ -175,6 +183,10 @@ fieldLoop: si.extensionOffset = offsetOf(f, mi.Exporter) si.extensionType = f.Type } + case "lazyFields", "XXX_lazyUnmarshalInfo": + si.lazyOffset = offsetOf(f, mi.Exporter) + case "XXX_presence": + si.presenceOffset = offsetOf(f, mi.Exporter) default: for _, s := range strings.Split(f.Tag.Get("protobuf"), ",") { if len(s) > 0 && strings.Trim(s, "0123456789") == "" { diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_opaque.go b/vendor/google.golang.org/protobuf/internal/impl/message_opaque.go new file mode 100644 index 0000000000..d7ec53f074 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/message_opaque.go @@ -0,0 +1,632 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package impl + +import ( + "fmt" + "math" + "reflect" + "strings" + "sync/atomic" + + "google.golang.org/protobuf/reflect/protoreflect" +) + +type opaqueStructInfo struct { + structInfo +} + +// isOpaque determines whether a protobuf message type is on the Opaque API. It +// checks whether the type is a Go struct that protoc-gen-go would generate. +// +// This function only detects newly generated messages from the v2 +// implementation of protoc-gen-go. It is unable to classify generated messages +// that are too old or those that are generated by a different generator +// such as protoc-gen-gogo. +func isOpaque(t reflect.Type) bool { + // The current detection mechanism is to simply check the first field + // for a struct tag with the "protogen" key. + if t.Kind() == reflect.Struct && t.NumField() > 0 { + pgt := t.Field(0).Tag.Get("protogen") + return strings.HasPrefix(pgt, "opaque.") + } + return false +} + +func opaqueInitHook(mi *MessageInfo) bool { + mt := mi.GoReflectType.Elem() + si := opaqueStructInfo{ + structInfo: mi.makeStructInfo(mt), + } + + if !isOpaque(mt) { + return false + } + + defer atomic.StoreUint32(&mi.initDone, 1) + + mi.fields = map[protoreflect.FieldNumber]*fieldInfo{} + fds := mi.Desc.Fields() + for i := 0; i < fds.Len(); i++ { + fd := fds.Get(i) + fs := si.fieldsByNumber[fd.Number()] + var fi fieldInfo + usePresence, _ := usePresenceForField(si, fd) + + switch { + case fd.IsWeak(): + // Weak fields are no different for opaque. + fi = fieldInfoForWeakMessage(fd, si.weakOffset) + case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic(): + // Oneofs are no different for opaque. + fi = fieldInfoForOneof(fd, si.oneofsByName[fd.ContainingOneof().Name()], mi.Exporter, si.oneofWrappersByNumber[fd.Number()]) + case fd.IsMap(): + fi = mi.fieldInfoForMapOpaque(si, fd, fs) + case fd.IsList() && fd.Message() == nil && usePresence: + fi = mi.fieldInfoForScalarListOpaque(si, fd, fs) + case fd.IsList() && fd.Message() == nil: + // Proto3 lists without presence can use same access methods as open + fi = fieldInfoForList(fd, fs, mi.Exporter) + case fd.IsList() && usePresence: + fi = mi.fieldInfoForMessageListOpaque(si, fd, fs) + case fd.IsList(): + // Proto3 opaque messages that does not need presence bitmap. + // Different representation than open struct, but same logic + fi = mi.fieldInfoForMessageListOpaqueNoPresence(si, fd, fs) + case fd.Message() != nil && usePresence: + fi = mi.fieldInfoForMessageOpaque(si, fd, fs) + case fd.Message() != nil: + // Proto3 messages without presence can use same access methods as open + fi = fieldInfoForMessage(fd, fs, mi.Exporter) + default: + fi = mi.fieldInfoForScalarOpaque(si, fd, fs) + } + mi.fields[fd.Number()] = &fi + } + mi.oneofs = map[protoreflect.Name]*oneofInfo{} + for i := 0; i < mi.Desc.Oneofs().Len(); i++ { + od := mi.Desc.Oneofs().Get(i) + mi.oneofs[od.Name()] = makeOneofInfoOpaque(mi, od, si.structInfo, mi.Exporter) + } + + mi.denseFields = make([]*fieldInfo, fds.Len()*2) + for i := 0; i < fds.Len(); i++ { + if fd := fds.Get(i); int(fd.Number()) < len(mi.denseFields) { + mi.denseFields[fd.Number()] = mi.fields[fd.Number()] + } + } + + for i := 0; i < fds.Len(); { + fd := fds.Get(i) + if od := fd.ContainingOneof(); od != nil && !fd.ContainingOneof().IsSynthetic() { + mi.rangeInfos = append(mi.rangeInfos, mi.oneofs[od.Name()]) + i += od.Fields().Len() + } else { + mi.rangeInfos = append(mi.rangeInfos, mi.fields[fd.Number()]) + i++ + } + } + + mi.makeExtensionFieldsFunc(mt, si.structInfo) + mi.makeUnknownFieldsFunc(mt, si.structInfo) + mi.makeOpaqueCoderMethods(mt, si) + mi.makeFieldTypes(si.structInfo) + + return true +} + +func makeOneofInfoOpaque(mi *MessageInfo, od protoreflect.OneofDescriptor, si structInfo, x exporter) *oneofInfo { + oi := &oneofInfo{oneofDesc: od} + if od.IsSynthetic() { + fd := od.Fields().Get(0) + index, _ := presenceIndex(mi.Desc, fd) + oi.which = func(p pointer) protoreflect.FieldNumber { + if p.IsNil() { + return 0 + } + if !mi.present(p, index) { + return 0 + } + return od.Fields().Get(0).Number() + } + return oi + } + // Dispatch to non-opaque oneof implementation for non-synthetic oneofs. + return makeOneofInfo(od, si, x) +} + +func (mi *MessageInfo) fieldInfoForMapOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo { + ft := fs.Type + if ft.Kind() != reflect.Map { + panic(fmt.Sprintf("invalid type: got %v, want map kind", ft)) + } + fieldOffset := offsetOf(fs, mi.Exporter) + conv := NewConverter(ft, fd) + return fieldInfo{ + fieldDesc: fd, + has: func(p pointer) bool { + if p.IsNil() { + return false + } + // Don't bother checking presence bits, since we need to + // look at the map length even if the presence bit is set. + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + return rv.Len() > 0 + }, + clear: func(p pointer) { + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + rv.Set(reflect.Zero(rv.Type())) + }, + get: func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + if rv.Len() == 0 { + return conv.Zero() + } + return conv.PBValueOf(rv) + }, + set: func(p pointer, v protoreflect.Value) { + pv := conv.GoValueOf(v) + if pv.IsNil() { + panic(fmt.Sprintf("invalid value: setting map field to read-only value")) + } + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + rv.Set(pv) + }, + mutable: func(p pointer) protoreflect.Value { + v := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + if v.IsNil() { + v.Set(reflect.MakeMap(fs.Type)) + } + return conv.PBValueOf(v) + }, + newField: func() protoreflect.Value { + return conv.New() + }, + } +} + +func (mi *MessageInfo) fieldInfoForScalarListOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo { + ft := fs.Type + if ft.Kind() != reflect.Slice { + panic(fmt.Sprintf("invalid type: got %v, want slice kind", ft)) + } + conv := NewConverter(reflect.PtrTo(ft), fd) + fieldOffset := offsetOf(fs, mi.Exporter) + index, _ := presenceIndex(mi.Desc, fd) + return fieldInfo{ + fieldDesc: fd, + has: func(p pointer) bool { + if p.IsNil() { + return false + } + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + return rv.Len() > 0 + }, + clear: func(p pointer) { + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + rv.Set(reflect.Zero(rv.Type())) + }, + get: func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + rv := p.Apply(fieldOffset).AsValueOf(fs.Type) + if rv.Elem().Len() == 0 { + return conv.Zero() + } + return conv.PBValueOf(rv) + }, + set: func(p pointer, v protoreflect.Value) { + pv := conv.GoValueOf(v) + if pv.IsNil() { + panic(fmt.Sprintf("invalid value: setting repeated field to read-only value")) + } + mi.setPresent(p, index) + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + rv.Set(pv.Elem()) + }, + mutable: func(p pointer) protoreflect.Value { + mi.setPresent(p, index) + return conv.PBValueOf(p.Apply(fieldOffset).AsValueOf(fs.Type)) + }, + newField: func() protoreflect.Value { + return conv.New() + }, + } +} + +func (mi *MessageInfo) fieldInfoForMessageListOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo { + ft := fs.Type + if ft.Kind() != reflect.Ptr || ft.Elem().Kind() != reflect.Slice { + panic(fmt.Sprintf("invalid type: got %v, want slice kind", ft)) + } + conv := NewConverter(ft, fd) + fieldOffset := offsetOf(fs, mi.Exporter) + index, _ := presenceIndex(mi.Desc, fd) + fieldNumber := fd.Number() + return fieldInfo{ + fieldDesc: fd, + has: func(p pointer) bool { + if p.IsNil() { + return false + } + if !mi.present(p, index) { + return false + } + sp := p.Apply(fieldOffset).AtomicGetPointer() + if sp.IsNil() { + // Lazily unmarshal this field. + mi.lazyUnmarshal(p, fieldNumber) + sp = p.Apply(fieldOffset).AtomicGetPointer() + } + rv := sp.AsValueOf(fs.Type.Elem()) + return rv.Elem().Len() > 0 + }, + clear: func(p pointer) { + fp := p.Apply(fieldOffset) + sp := fp.AtomicGetPointer() + if sp.IsNil() { + sp = fp.AtomicSetPointerIfNil(pointerOfValue(reflect.New(fs.Type.Elem()))) + mi.setPresent(p, index) + } + rv := sp.AsValueOf(fs.Type.Elem()) + rv.Elem().Set(reflect.Zero(rv.Type().Elem())) + }, + get: func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + if !mi.present(p, index) { + return conv.Zero() + } + sp := p.Apply(fieldOffset).AtomicGetPointer() + if sp.IsNil() { + // Lazily unmarshal this field. + mi.lazyUnmarshal(p, fieldNumber) + sp = p.Apply(fieldOffset).AtomicGetPointer() + } + rv := sp.AsValueOf(fs.Type.Elem()) + if rv.Elem().Len() == 0 { + return conv.Zero() + } + return conv.PBValueOf(rv) + }, + set: func(p pointer, v protoreflect.Value) { + fp := p.Apply(fieldOffset) + sp := fp.AtomicGetPointer() + if sp.IsNil() { + sp = fp.AtomicSetPointerIfNil(pointerOfValue(reflect.New(fs.Type.Elem()))) + mi.setPresent(p, index) + } + rv := sp.AsValueOf(fs.Type.Elem()) + val := conv.GoValueOf(v) + if val.IsNil() { + panic(fmt.Sprintf("invalid value: setting repeated field to read-only value")) + } else { + rv.Elem().Set(val.Elem()) + } + }, + mutable: func(p pointer) protoreflect.Value { + fp := p.Apply(fieldOffset) + sp := fp.AtomicGetPointer() + if sp.IsNil() { + if mi.present(p, index) { + // Lazily unmarshal this field. + mi.lazyUnmarshal(p, fieldNumber) + sp = p.Apply(fieldOffset).AtomicGetPointer() + } else { + sp = fp.AtomicSetPointerIfNil(pointerOfValue(reflect.New(fs.Type.Elem()))) + mi.setPresent(p, index) + } + } + rv := sp.AsValueOf(fs.Type.Elem()) + return conv.PBValueOf(rv) + }, + newField: func() protoreflect.Value { + return conv.New() + }, + } +} + +func (mi *MessageInfo) fieldInfoForMessageListOpaqueNoPresence(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo { + ft := fs.Type + if ft.Kind() != reflect.Ptr || ft.Elem().Kind() != reflect.Slice { + panic(fmt.Sprintf("invalid type: got %v, want slice kind", ft)) + } + conv := NewConverter(ft, fd) + fieldOffset := offsetOf(fs, mi.Exporter) + return fieldInfo{ + fieldDesc: fd, + has: func(p pointer) bool { + if p.IsNil() { + return false + } + sp := p.Apply(fieldOffset).AtomicGetPointer() + if sp.IsNil() { + return false + } + rv := sp.AsValueOf(fs.Type.Elem()) + return rv.Elem().Len() > 0 + }, + clear: func(p pointer) { + sp := p.Apply(fieldOffset).AtomicGetPointer() + if !sp.IsNil() { + rv := sp.AsValueOf(fs.Type.Elem()) + rv.Elem().Set(reflect.Zero(rv.Type().Elem())) + } + }, + get: func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + sp := p.Apply(fieldOffset).AtomicGetPointer() + if sp.IsNil() { + return conv.Zero() + } + rv := sp.AsValueOf(fs.Type.Elem()) + if rv.Elem().Len() == 0 { + return conv.Zero() + } + return conv.PBValueOf(rv) + }, + set: func(p pointer, v protoreflect.Value) { + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + if rv.IsNil() { + rv.Set(reflect.New(fs.Type.Elem())) + } + val := conv.GoValueOf(v) + if val.IsNil() { + panic(fmt.Sprintf("invalid value: setting repeated field to read-only value")) + } else { + rv.Elem().Set(val.Elem()) + } + }, + mutable: func(p pointer) protoreflect.Value { + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + if rv.IsNil() { + rv.Set(reflect.New(fs.Type.Elem())) + } + return conv.PBValueOf(rv) + }, + newField: func() protoreflect.Value { + return conv.New() + }, + } +} + +func (mi *MessageInfo) fieldInfoForScalarOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo { + ft := fs.Type + nullable := fd.HasPresence() + if oneof := fd.ContainingOneof(); oneof != nil && oneof.IsSynthetic() { + nullable = true + } + deref := false + if nullable && ft.Kind() == reflect.Ptr { + ft = ft.Elem() + deref = true + } + conv := NewConverter(ft, fd) + fieldOffset := offsetOf(fs, mi.Exporter) + index, _ := presenceIndex(mi.Desc, fd) + var getter func(p pointer) protoreflect.Value + if !nullable { + getter = getterForDirectScalar(fd, fs, conv, fieldOffset) + } else { + getter = getterForOpaqueNullableScalar(mi, index, fd, fs, conv, fieldOffset) + } + return fieldInfo{ + fieldDesc: fd, + has: func(p pointer) bool { + if p.IsNil() { + return false + } + if nullable { + return mi.present(p, index) + } + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + switch rv.Kind() { + case reflect.Bool: + return rv.Bool() + case reflect.Int32, reflect.Int64: + return rv.Int() != 0 + case reflect.Uint32, reflect.Uint64: + return rv.Uint() != 0 + case reflect.Float32, reflect.Float64: + return rv.Float() != 0 || math.Signbit(rv.Float()) + case reflect.String, reflect.Slice: + return rv.Len() > 0 + default: + panic(fmt.Sprintf("invalid type: %v", rv.Type())) // should never happen + } + }, + clear: func(p pointer) { + if nullable { + mi.clearPresent(p, index) + } + // This is only valuable for bytes and strings, but we do it unconditionally. + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + rv.Set(reflect.Zero(rv.Type())) + }, + get: getter, + // TODO: Implement unsafe fast path for set? + set: func(p pointer, v protoreflect.Value) { + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + if deref { + if rv.IsNil() { + rv.Set(reflect.New(ft)) + } + rv = rv.Elem() + } + + rv.Set(conv.GoValueOf(v)) + if nullable && rv.Kind() == reflect.Slice && rv.IsNil() { + rv.Set(emptyBytes) + } + if nullable { + mi.setPresent(p, index) + } + }, + newField: func() protoreflect.Value { + return conv.New() + }, + } +} + +func (mi *MessageInfo) fieldInfoForMessageOpaque(si opaqueStructInfo, fd protoreflect.FieldDescriptor, fs reflect.StructField) fieldInfo { + ft := fs.Type + conv := NewConverter(ft, fd) + fieldOffset := offsetOf(fs, mi.Exporter) + index, _ := presenceIndex(mi.Desc, fd) + fieldNumber := fd.Number() + elemType := fs.Type.Elem() + return fieldInfo{ + fieldDesc: fd, + has: func(p pointer) bool { + if p.IsNil() { + return false + } + return mi.present(p, index) + }, + clear: func(p pointer) { + mi.clearPresent(p, index) + p.Apply(fieldOffset).AtomicSetNilPointer() + }, + get: func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + fp := p.Apply(fieldOffset) + mp := fp.AtomicGetPointer() + if mp.IsNil() { + // Lazily unmarshal this field. + mi.lazyUnmarshal(p, fieldNumber) + mp = fp.AtomicGetPointer() + } + rv := mp.AsValueOf(elemType) + return conv.PBValueOf(rv) + }, + set: func(p pointer, v protoreflect.Value) { + val := pointerOfValue(conv.GoValueOf(v)) + if val.IsNil() { + panic("invalid nil pointer") + } + p.Apply(fieldOffset).AtomicSetPointer(val) + mi.setPresent(p, index) + }, + mutable: func(p pointer) protoreflect.Value { + fp := p.Apply(fieldOffset) + mp := fp.AtomicGetPointer() + if mp.IsNil() { + if mi.present(p, index) { + // Lazily unmarshal this field. + mi.lazyUnmarshal(p, fieldNumber) + mp = fp.AtomicGetPointer() + } else { + mp = pointerOfValue(conv.GoValueOf(conv.New())) + fp.AtomicSetPointer(mp) + mi.setPresent(p, index) + } + } + return conv.PBValueOf(mp.AsValueOf(fs.Type.Elem())) + }, + newMessage: func() protoreflect.Message { + return conv.New().Message() + }, + newField: func() protoreflect.Value { + return conv.New() + }, + } +} + +// A presenceList wraps a List, updating presence bits as necessary when the +// list contents change. +type presenceList struct { + pvalueList + setPresence func(bool) +} +type pvalueList interface { + protoreflect.List + //Unwrapper +} + +func (list presenceList) Append(v protoreflect.Value) { + list.pvalueList.Append(v) + list.setPresence(true) +} +func (list presenceList) Truncate(i int) { + list.pvalueList.Truncate(i) + list.setPresence(i > 0) +} + +// presenceIndex returns the index to pass to presence functions. +// +// TODO: field.Desc.Index() would be simpler, and would give space to record the presence of oneof fields. +func presenceIndex(md protoreflect.MessageDescriptor, fd protoreflect.FieldDescriptor) (uint32, presenceSize) { + found := false + var index, numIndices uint32 + for i := 0; i < md.Fields().Len(); i++ { + f := md.Fields().Get(i) + if f == fd { + found = true + index = numIndices + } + if f.ContainingOneof() == nil || isLastOneofField(f) { + numIndices++ + } + } + if !found { + panic(fmt.Sprintf("BUG: %v not in %v", fd.Name(), md.FullName())) + } + return index, presenceSize(numIndices) +} + +func isLastOneofField(fd protoreflect.FieldDescriptor) bool { + fields := fd.ContainingOneof().Fields() + return fields.Get(fields.Len()-1) == fd +} + +func (mi *MessageInfo) setPresent(p pointer, index uint32) { + p.Apply(mi.presenceOffset).PresenceInfo().SetPresent(index, mi.presenceSize) +} + +func (mi *MessageInfo) clearPresent(p pointer, index uint32) { + p.Apply(mi.presenceOffset).PresenceInfo().ClearPresent(index) +} + +func (mi *MessageInfo) present(p pointer, index uint32) bool { + return p.Apply(mi.presenceOffset).PresenceInfo().Present(index) +} + +// usePresenceForField implements the somewhat intricate logic of when +// the presence bitmap is used for a field. The main logic is that a +// field that is optional or that can be lazy will use the presence +// bit, but for proto2, also maps have a presence bit. It also records +// if the field can ever be lazy, which is true if we have a +// lazyOffset and the field is a message or a slice of messages. A +// field that is lazy will always need a presence bit. Oneofs are not +// lazy and do not use presence, unless they are a synthetic oneof, +// which is a proto3 optional field. For proto3 optionals, we use the +// presence and they can also be lazy when applicable (a message). +func usePresenceForField(si opaqueStructInfo, fd protoreflect.FieldDescriptor) (usePresence, canBeLazy bool) { + hasLazyField := fd.(interface{ IsLazy() bool }).IsLazy() + + // Non-oneof scalar fields with explicit field presence use the presence array. + usesPresenceArray := fd.HasPresence() && fd.Message() == nil && (fd.ContainingOneof() == nil || fd.ContainingOneof().IsSynthetic()) + switch { + case fd.ContainingOneof() != nil && !fd.ContainingOneof().IsSynthetic(): + return false, false + case fd.IsWeak(): + return false, false + case fd.IsMap(): + return false, false + case fd.Kind() == protoreflect.MessageKind || fd.Kind() == protoreflect.GroupKind: + return hasLazyField, hasLazyField + default: + return usesPresenceArray || (hasLazyField && fd.HasPresence()), false + } +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_opaque_gen.go b/vendor/google.golang.org/protobuf/internal/impl/message_opaque_gen.go new file mode 100644 index 0000000000..a69825699a --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/message_opaque_gen.go @@ -0,0 +1,132 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-types. DO NOT EDIT. + +package impl + +import ( + "reflect" + + "google.golang.org/protobuf/reflect/protoreflect" +) + +func getterForOpaqueNullableScalar(mi *MessageInfo, index uint32, fd protoreflect.FieldDescriptor, fs reflect.StructField, conv Converter, fieldOffset offset) func(p pointer) protoreflect.Value { + ft := fs.Type + if ft.Kind() == reflect.Ptr { + ft = ft.Elem() + } + if fd.Kind() == protoreflect.EnumKind { + // Enums for nullable opaque types. + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + return conv.PBValueOf(rv) + } + } + switch ft.Kind() { + case reflect.Bool: + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).Bool() + return protoreflect.ValueOfBool(*x) + } + case reflect.Int32: + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).Int32() + return protoreflect.ValueOfInt32(*x) + } + case reflect.Uint32: + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).Uint32() + return protoreflect.ValueOfUint32(*x) + } + case reflect.Int64: + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).Int64() + return protoreflect.ValueOfInt64(*x) + } + case reflect.Uint64: + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).Uint64() + return protoreflect.ValueOfUint64(*x) + } + case reflect.Float32: + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).Float32() + return protoreflect.ValueOfFloat32(*x) + } + case reflect.Float64: + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).Float64() + return protoreflect.ValueOfFloat64(*x) + } + case reflect.String: + if fd.Kind() == protoreflect.BytesKind { + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).StringPtr() + if *x == nil { + return conv.Zero() + } + if len(**x) == 0 { + return protoreflect.ValueOfBytes(nil) + } + return protoreflect.ValueOfBytes([]byte(**x)) + } + } + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).StringPtr() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfString(**x) + } + case reflect.Slice: + if fd.Kind() == protoreflect.StringKind { + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).Bytes() + return protoreflect.ValueOfString(string(*x)) + } + } + return func(p pointer) protoreflect.Value { + if p.IsNil() || !mi.present(p, index) { + return conv.Zero() + } + x := p.Apply(fieldOffset).Bytes() + return protoreflect.ValueOfBytes(*x) + } + } + panic("unexpected protobuf kind: " + ft.Kind().String()) +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go index ecb4623d70..31c19b54f8 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go @@ -205,6 +205,11 @@ func (mi *MessageInfo) makeFieldTypes(si structInfo) { case fd.IsList(): if fd.Enum() != nil || fd.Message() != nil { ft = fs.Type.Elem() + + if ft.Kind() == reflect.Slice { + ft = ft.Elem() + } + } isMessage = fd.Message() != nil case fd.Enum() != nil: diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go index 986322b195..a740646205 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go @@ -256,6 +256,7 @@ func fieldInfoForScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, ft := fs.Type nullable := fd.HasPresence() isBytes := ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 + var getter func(p pointer) protoreflect.Value if nullable { if ft.Kind() != reflect.Ptr && ft.Kind() != reflect.Slice { // This never occurs for generated message types. @@ -268,19 +269,25 @@ func fieldInfoForScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, } } conv := NewConverter(ft, fd) - - // TODO: Implement unsafe fast path? fieldOffset := offsetOf(fs, x) + + // Generate specialized getter functions to avoid going through reflect.Value + if nullable { + getter = getterForNullableScalar(fd, fs, conv, fieldOffset) + } else { + getter = getterForDirectScalar(fd, fs, conv, fieldOffset) + } + return fieldInfo{ fieldDesc: fd, has: func(p pointer) bool { if p.IsNil() { return false } - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if nullable { - return !rv.IsNil() + return !p.Apply(fieldOffset).Elem().IsNil() } + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() switch rv.Kind() { case reflect.Bool: return rv.Bool() @@ -300,21 +307,8 @@ func fieldInfoForScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() rv.Set(reflect.Zero(rv.Type())) }, - get: func(p pointer) protoreflect.Value { - if p.IsNil() { - return conv.Zero() - } - rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() - if nullable { - if rv.IsNil() { - return conv.Zero() - } - if rv.Kind() == reflect.Ptr { - rv = rv.Elem() - } - } - return conv.PBValueOf(rv) - }, + get: getter, + // TODO: Implement unsafe fast path for set? set: func(p pointer, v protoreflect.Value) { rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() if nullable && rv.Kind() == reflect.Ptr { diff --git a/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field_gen.go b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field_gen.go new file mode 100644 index 0000000000..af5e063a1e --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field_gen.go @@ -0,0 +1,273 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by generate-types. DO NOT EDIT. + +package impl + +import ( + "reflect" + + "google.golang.org/protobuf/reflect/protoreflect" +) + +func getterForNullableScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, conv Converter, fieldOffset offset) func(p pointer) protoreflect.Value { + ft := fs.Type + if ft.Kind() == reflect.Ptr { + ft = ft.Elem() + } + if fd.Kind() == protoreflect.EnumKind { + elemType := fs.Type.Elem() + // Enums for nullable types. + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + rv := p.Apply(fieldOffset).Elem().AsValueOf(elemType) + if rv.IsNil() { + return conv.Zero() + } + return conv.PBValueOf(rv.Elem()) + } + } + switch ft.Kind() { + case reflect.Bool: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).BoolPtr() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfBool(**x) + } + case reflect.Int32: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Int32Ptr() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfInt32(**x) + } + case reflect.Uint32: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Uint32Ptr() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfUint32(**x) + } + case reflect.Int64: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Int64Ptr() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfInt64(**x) + } + case reflect.Uint64: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Uint64Ptr() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfUint64(**x) + } + case reflect.Float32: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Float32Ptr() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfFloat32(**x) + } + case reflect.Float64: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Float64Ptr() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfFloat64(**x) + } + case reflect.String: + if fd.Kind() == protoreflect.BytesKind { + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).StringPtr() + if *x == nil { + return conv.Zero() + } + if len(**x) == 0 { + return protoreflect.ValueOfBytes(nil) + } + return protoreflect.ValueOfBytes([]byte(**x)) + } + } + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).StringPtr() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfString(**x) + } + case reflect.Slice: + if fd.Kind() == protoreflect.StringKind { + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Bytes() + if len(*x) == 0 { + return conv.Zero() + } + return protoreflect.ValueOfString(string(*x)) + } + } + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Bytes() + if *x == nil { + return conv.Zero() + } + return protoreflect.ValueOfBytes(*x) + } + } + panic("unexpected protobuf kind: " + ft.Kind().String()) +} + +func getterForDirectScalar(fd protoreflect.FieldDescriptor, fs reflect.StructField, conv Converter, fieldOffset offset) func(p pointer) protoreflect.Value { + ft := fs.Type + if fd.Kind() == protoreflect.EnumKind { + // Enums for non nullable types. + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + rv := p.Apply(fieldOffset).AsValueOf(fs.Type).Elem() + return conv.PBValueOf(rv) + } + } + switch ft.Kind() { + case reflect.Bool: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Bool() + return protoreflect.ValueOfBool(*x) + } + case reflect.Int32: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Int32() + return protoreflect.ValueOfInt32(*x) + } + case reflect.Uint32: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Uint32() + return protoreflect.ValueOfUint32(*x) + } + case reflect.Int64: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Int64() + return protoreflect.ValueOfInt64(*x) + } + case reflect.Uint64: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Uint64() + return protoreflect.ValueOfUint64(*x) + } + case reflect.Float32: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Float32() + return protoreflect.ValueOfFloat32(*x) + } + case reflect.Float64: + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Float64() + return protoreflect.ValueOfFloat64(*x) + } + case reflect.String: + if fd.Kind() == protoreflect.BytesKind { + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).String() + if len(*x) == 0 { + return protoreflect.ValueOfBytes(nil) + } + return protoreflect.ValueOfBytes([]byte(*x)) + } + } + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).String() + return protoreflect.ValueOfString(*x) + } + case reflect.Slice: + if fd.Kind() == protoreflect.StringKind { + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Bytes() + return protoreflect.ValueOfString(string(*x)) + } + } + return func(p pointer) protoreflect.Value { + if p.IsNil() { + return conv.Zero() + } + x := p.Apply(fieldOffset).Bytes() + return protoreflect.ValueOfBytes(*x) + } + } + panic("unexpected protobuf kind: " + ft.Kind().String()) +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go index 79e186667b..041ebde2de 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +++ b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go @@ -8,6 +8,8 @@ import ( "reflect" "sync/atomic" "unsafe" + + "google.golang.org/protobuf/internal/protolazy" ) const UnsafeEnabled = true @@ -111,6 +113,13 @@ func (p pointer) BytesPtr() **[]byte { return (**[]byte)(p.p) func (p pointer) BytesSlice() *[][]byte { return (*[][]byte)(p.p) } func (p pointer) WeakFields() *weakFields { return (*weakFields)(p.p) } func (p pointer) Extensions() *map[int32]ExtensionField { return (*map[int32]ExtensionField)(p.p) } +func (p pointer) LazyInfoPtr() **protolazy.XXX_lazyUnmarshalInfo { + return (**protolazy.XXX_lazyUnmarshalInfo)(p.p) +} + +func (p pointer) PresenceInfo() presence { + return presence{P: p.p} +} func (p pointer) Elem() pointer { return pointer{p: *(*unsafe.Pointer)(p.p)} diff --git a/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe_opaque.go b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe_opaque.go new file mode 100644 index 0000000000..38aa7b7dcf --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe_opaque.go @@ -0,0 +1,42 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package impl + +import ( + "sync/atomic" + "unsafe" +) + +func (p pointer) AtomicGetPointer() pointer { + return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))} +} + +func (p pointer) AtomicSetPointer(v pointer) { + atomic.StorePointer((*unsafe.Pointer)(p.p), v.p) +} + +func (p pointer) AtomicSetNilPointer() { + atomic.StorePointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil)) +} + +func (p pointer) AtomicSetPointerIfNil(v pointer) pointer { + if atomic.CompareAndSwapPointer((*unsafe.Pointer)(p.p), unsafe.Pointer(nil), v.p) { + return v + } + return pointer{p: atomic.LoadPointer((*unsafe.Pointer)(p.p))} +} + +type atomicV1MessageInfo struct{ p Pointer } + +func (mi *atomicV1MessageInfo) Get() Pointer { + return Pointer(atomic.LoadPointer((*unsafe.Pointer)(&mi.p))) +} + +func (mi *atomicV1MessageInfo) SetIfNil(p Pointer) Pointer { + if atomic.CompareAndSwapPointer((*unsafe.Pointer)(&mi.p), nil, unsafe.Pointer(p)) { + return p + } + return mi.Get() +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/presence.go b/vendor/google.golang.org/protobuf/internal/impl/presence.go new file mode 100644 index 0000000000..914cb1deda --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/impl/presence.go @@ -0,0 +1,142 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package impl + +import ( + "sync/atomic" + "unsafe" +) + +// presenceSize represents the size of a presence set, which should be the largest index of the set+1 +type presenceSize uint32 + +// presence is the internal representation of the bitmap array in a generated protobuf +type presence struct { + // This is a pointer to the beginning of an array of uint32 + P unsafe.Pointer +} + +func (p presence) toElem(num uint32) (ret *uint32) { + const ( + bitsPerByte = 8 + siz = unsafe.Sizeof(*ret) + ) + // p.P points to an array of uint32, num is the bit in this array that the + // caller wants to check/manipulate. Calculate the index in the array that + // contains this specific bit. E.g.: 76 / 32 = 2 (integer division). + offset := uintptr(num) / (siz * bitsPerByte) * siz + return (*uint32)(unsafe.Pointer(uintptr(p.P) + offset)) +} + +// Present checks for the presence of a specific field number in a presence set. +func (p presence) Present(num uint32) bool { + if p.P == nil { + return false + } + return Export{}.Present(p.toElem(num), num) +} + +// SetPresent adds presence for a specific field number in a presence set. +func (p presence) SetPresent(num uint32, size presenceSize) { + Export{}.SetPresent(p.toElem(num), num, uint32(size)) +} + +// SetPresentUnatomic adds presence for a specific field number in a presence set without using +// atomic operations. Only to be called during unmarshaling. +func (p presence) SetPresentUnatomic(num uint32, size presenceSize) { + Export{}.SetPresentNonAtomic(p.toElem(num), num, uint32(size)) +} + +// ClearPresent removes presence for a specific field number in a presence set. +func (p presence) ClearPresent(num uint32) { + Export{}.ClearPresent(p.toElem(num), num) +} + +// LoadPresenceCache (together with PresentInCache) allows for a +// cached version of checking for presence without re-reading the word +// for every field. It is optimized for efficiency and assumes no +// simltaneous mutation of the presence set (or at least does not have +// a problem with simultaneous mutation giving inconsistent results). +func (p presence) LoadPresenceCache() (current uint32) { + if p.P == nil { + return 0 + } + return atomic.LoadUint32((*uint32)(p.P)) +} + +// PresentInCache reads presence from a cached word in the presence +// bitmap. It caches up a new word if the bit is outside the +// word. This is for really fast iteration through bitmaps in cases +// where we either know that the bitmap will not be altered, or we +// don't care about inconsistencies caused by simultaneous writes. +func (p presence) PresentInCache(num uint32, cachedElement *uint32, current *uint32) bool { + if num/32 != *cachedElement { + o := uintptr(num/32) * unsafe.Sizeof(uint32(0)) + q := (*uint32)(unsafe.Pointer(uintptr(p.P) + o)) + *current = atomic.LoadUint32(q) + *cachedElement = num / 32 + } + return (*current & (1 << (num % 32))) > 0 +} + +// AnyPresent checks if any field is marked as present in the bitmap. +func (p presence) AnyPresent(size presenceSize) bool { + n := uintptr((size + 31) / 32) + for j := uintptr(0); j < n; j++ { + o := j * unsafe.Sizeof(uint32(0)) + q := (*uint32)(unsafe.Pointer(uintptr(p.P) + o)) + b := atomic.LoadUint32(q) + if b > 0 { + return true + } + } + return false +} + +// toRaceDetectData finds the preceding RaceDetectHookData in a +// message by using pointer arithmetic. As the type of the presence +// set (bitmap) varies with the number of fields in the protobuf, we +// can not have a struct type containing the array and the +// RaceDetectHookData. instead the RaceDetectHookData is placed +// immediately before the bitmap array, and we find it by walking +// backwards in the struct. +// +// This method is only called from the race-detect version of the code, +// so RaceDetectHookData is never an empty struct. +func (p presence) toRaceDetectData() *RaceDetectHookData { + var template struct { + d RaceDetectHookData + a [1]uint32 + } + o := (uintptr(unsafe.Pointer(&template.a)) - uintptr(unsafe.Pointer(&template.d))) + return (*RaceDetectHookData)(unsafe.Pointer(uintptr(p.P) - o)) +} + +func atomicLoadShadowPresence(p **[]byte) *[]byte { + return (*[]byte)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreShadowPresence(p **[]byte, v *[]byte) { + atomic.CompareAndSwapPointer((*unsafe.Pointer)(unsafe.Pointer(p)), nil, unsafe.Pointer(v)) +} + +// findPointerToRaceDetectData finds the preceding RaceDetectHookData +// in a message by using pointer arithmetic. For the methods called +// directy from generated code, we don't have a pointer to the +// beginning of the presence set, but a pointer inside the array. As +// we know the index of the bit we're manipulating (num), we can +// calculate which element of the array ptr is pointing to. With that +// information we find the preceding RaceDetectHookData and can +// manipulate the shadow bitmap. +// +// This method is only called from the race-detect version of the +// code, so RaceDetectHookData is never an empty struct. +func findPointerToRaceDetectData(ptr *uint32, num uint32) *RaceDetectHookData { + var template struct { + d RaceDetectHookData + a [1]uint32 + } + o := (uintptr(unsafe.Pointer(&template.a)) - uintptr(unsafe.Pointer(&template.d))) + uintptr(num/32)*unsafe.Sizeof(uint32(0)) + return (*RaceDetectHookData)(unsafe.Pointer(uintptr(unsafe.Pointer(ptr)) - o)) +} diff --git a/vendor/google.golang.org/protobuf/internal/impl/validate.go b/vendor/google.golang.org/protobuf/internal/impl/validate.go index a24e6bbd7a..b534a3d6db 100644 --- a/vendor/google.golang.org/protobuf/internal/impl/validate.go +++ b/vendor/google.golang.org/protobuf/internal/impl/validate.go @@ -37,6 +37,10 @@ const ( // ValidationValid indicates that unmarshaling the message will succeed. ValidationValid + + // ValidationWrongWireType indicates that a validated field does not have + // the expected wire type. + ValidationWrongWireType ) func (v ValidationStatus) String() string { @@ -149,11 +153,23 @@ func newValidationInfo(fd protoreflect.FieldDescriptor, ft reflect.Type) validat switch fd.Kind() { case protoreflect.MessageKind: vi.typ = validationTypeMessage + + if ft.Kind() == reflect.Ptr { + // Repeated opaque message fields are *[]*T. + ft = ft.Elem() + } + if ft.Kind() == reflect.Slice { vi.mi = getMessageInfo(ft.Elem()) } case protoreflect.GroupKind: vi.typ = validationTypeGroup + + if ft.Kind() == reflect.Ptr { + // Repeated opaque message fields are *[]*T. + ft = ft.Elem() + } + if ft.Kind() == reflect.Slice { vi.mi = getMessageInfo(ft.Elem()) } diff --git a/vendor/google.golang.org/protobuf/internal/protolazy/bufferreader.go b/vendor/google.golang.org/protobuf/internal/protolazy/bufferreader.go new file mode 100644 index 0000000000..82e5cab4aa --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/protolazy/bufferreader.go @@ -0,0 +1,364 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Helper code for parsing a protocol buffer + +package protolazy + +import ( + "errors" + "fmt" + "io" + + "google.golang.org/protobuf/encoding/protowire" +) + +// BufferReader is a structure encapsulating a protobuf and a current position +type BufferReader struct { + Buf []byte + Pos int +} + +// NewBufferReader creates a new BufferRead from a protobuf +func NewBufferReader(buf []byte) BufferReader { + return BufferReader{Buf: buf, Pos: 0} +} + +var errOutOfBounds = errors.New("protobuf decoding: out of bounds") +var errOverflow = errors.New("proto: integer overflow") + +func (b *BufferReader) DecodeVarintSlow() (x uint64, err error) { + i := b.Pos + l := len(b.Buf) + + for shift := uint(0); shift < 64; shift += 7 { + if i >= l { + err = io.ErrUnexpectedEOF + return + } + v := b.Buf[i] + i++ + x |= (uint64(v) & 0x7F) << shift + if v < 0x80 { + b.Pos = i + return + } + } + + // The number is too large to represent in a 64-bit value. + err = errOverflow + return +} + +// decodeVarint decodes a varint at the current position +func (b *BufferReader) DecodeVarint() (x uint64, err error) { + i := b.Pos + buf := b.Buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + b.Pos++ + return uint64(buf[i]), nil + } else if len(buf)-i < 10 { + return b.DecodeVarintSlow() + } + + var v uint64 + // we already checked the first byte + x = uint64(buf[i]) & 127 + i++ + + v = uint64(buf[i]) + i++ + x |= (v & 127) << 7 + if v < 128 { + goto done + } + + v = uint64(buf[i]) + i++ + x |= (v & 127) << 14 + if v < 128 { + goto done + } + + v = uint64(buf[i]) + i++ + x |= (v & 127) << 21 + if v < 128 { + goto done + } + + v = uint64(buf[i]) + i++ + x |= (v & 127) << 28 + if v < 128 { + goto done + } + + v = uint64(buf[i]) + i++ + x |= (v & 127) << 35 + if v < 128 { + goto done + } + + v = uint64(buf[i]) + i++ + x |= (v & 127) << 42 + if v < 128 { + goto done + } + + v = uint64(buf[i]) + i++ + x |= (v & 127) << 49 + if v < 128 { + goto done + } + + v = uint64(buf[i]) + i++ + x |= (v & 127) << 56 + if v < 128 { + goto done + } + + v = uint64(buf[i]) + i++ + x |= (v & 127) << 63 + if v < 128 { + goto done + } + + return 0, errOverflow + +done: + b.Pos = i + return +} + +// decodeVarint32 decodes a varint32 at the current position +func (b *BufferReader) DecodeVarint32() (x uint32, err error) { + i := b.Pos + buf := b.Buf + + if i >= len(buf) { + return 0, io.ErrUnexpectedEOF + } else if buf[i] < 0x80 { + b.Pos++ + return uint32(buf[i]), nil + } else if len(buf)-i < 5 { + v, err := b.DecodeVarintSlow() + return uint32(v), err + } + + var v uint32 + // we already checked the first byte + x = uint32(buf[i]) & 127 + i++ + + v = uint32(buf[i]) + i++ + x |= (v & 127) << 7 + if v < 128 { + goto done + } + + v = uint32(buf[i]) + i++ + x |= (v & 127) << 14 + if v < 128 { + goto done + } + + v = uint32(buf[i]) + i++ + x |= (v & 127) << 21 + if v < 128 { + goto done + } + + v = uint32(buf[i]) + i++ + x |= (v & 127) << 28 + if v < 128 { + goto done + } + + return 0, errOverflow + +done: + b.Pos = i + return +} + +// skipValue skips a value in the protobuf, based on the specified tag +func (b *BufferReader) SkipValue(tag uint32) (err error) { + wireType := tag & 0x7 + switch protowire.Type(wireType) { + case protowire.VarintType: + err = b.SkipVarint() + case protowire.Fixed64Type: + err = b.SkipFixed64() + case protowire.BytesType: + var n uint32 + n, err = b.DecodeVarint32() + if err == nil { + err = b.Skip(int(n)) + } + case protowire.StartGroupType: + err = b.SkipGroup(tag) + case protowire.Fixed32Type: + err = b.SkipFixed32() + default: + err = fmt.Errorf("Unexpected wire type (%d)", wireType) + } + return +} + +// skipGroup skips a group with the specified tag. It executes efficiently using a tag stack +func (b *BufferReader) SkipGroup(tag uint32) (err error) { + tagStack := make([]uint32, 0, 16) + tagStack = append(tagStack, tag) + var n uint32 + for len(tagStack) > 0 { + tag, err = b.DecodeVarint32() + if err != nil { + return err + } + switch protowire.Type(tag & 0x7) { + case protowire.VarintType: + err = b.SkipVarint() + case protowire.Fixed64Type: + err = b.Skip(8) + case protowire.BytesType: + n, err = b.DecodeVarint32() + if err == nil { + err = b.Skip(int(n)) + } + case protowire.StartGroupType: + tagStack = append(tagStack, tag) + case protowire.Fixed32Type: + err = b.SkipFixed32() + case protowire.EndGroupType: + if protoFieldNumber(tagStack[len(tagStack)-1]) == protoFieldNumber(tag) { + tagStack = tagStack[:len(tagStack)-1] + } else { + err = fmt.Errorf("end group tag %d does not match begin group tag %d at pos %d", + protoFieldNumber(tag), protoFieldNumber(tagStack[len(tagStack)-1]), b.Pos) + } + } + if err != nil { + return err + } + } + return nil +} + +// skipVarint effiently skips a varint +func (b *BufferReader) SkipVarint() (err error) { + i := b.Pos + + if len(b.Buf)-i < 10 { + // Use DecodeVarintSlow() to check for buffer overflow, but ignore result + if _, err := b.DecodeVarintSlow(); err != nil { + return err + } + return nil + } + + if b.Buf[i] < 0x80 { + goto out + } + i++ + + if b.Buf[i] < 0x80 { + goto out + } + i++ + + if b.Buf[i] < 0x80 { + goto out + } + i++ + + if b.Buf[i] < 0x80 { + goto out + } + i++ + + if b.Buf[i] < 0x80 { + goto out + } + i++ + + if b.Buf[i] < 0x80 { + goto out + } + i++ + + if b.Buf[i] < 0x80 { + goto out + } + i++ + + if b.Buf[i] < 0x80 { + goto out + } + i++ + + if b.Buf[i] < 0x80 { + goto out + } + i++ + + if b.Buf[i] < 0x80 { + goto out + } + return errOverflow + +out: + b.Pos = i + 1 + return nil +} + +// skip skips the specified number of bytes +func (b *BufferReader) Skip(n int) (err error) { + if len(b.Buf) < b.Pos+n { + return io.ErrUnexpectedEOF + } + b.Pos += n + return +} + +// skipFixed64 skips a fixed64 +func (b *BufferReader) SkipFixed64() (err error) { + return b.Skip(8) +} + +// skipFixed32 skips a fixed32 +func (b *BufferReader) SkipFixed32() (err error) { + return b.Skip(4) +} + +// skipBytes skips a set of bytes +func (b *BufferReader) SkipBytes() (err error) { + n, err := b.DecodeVarint32() + if err != nil { + return err + } + return b.Skip(int(n)) +} + +// Done returns whether we are at the end of the protobuf +func (b *BufferReader) Done() bool { + return b.Pos == len(b.Buf) +} + +// Remaining returns how many bytes remain +func (b *BufferReader) Remaining() int { + return len(b.Buf) - b.Pos +} diff --git a/vendor/google.golang.org/protobuf/internal/protolazy/lazy.go b/vendor/google.golang.org/protobuf/internal/protolazy/lazy.go new file mode 100644 index 0000000000..ff4d4834bb --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/protolazy/lazy.go @@ -0,0 +1,359 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package protolazy contains internal data structures for lazy message decoding. +package protolazy + +import ( + "fmt" + "sort" + + "google.golang.org/protobuf/encoding/protowire" + piface "google.golang.org/protobuf/runtime/protoiface" +) + +// IndexEntry is the structure for an index of the fields in a message of a +// proto (not descending to sub-messages) +type IndexEntry struct { + FieldNum uint32 + // first byte of this tag/field + Start uint32 + // first byte after a contiguous sequence of bytes for this tag/field, which could + // include a single encoding of the field, or multiple encodings for the field + End uint32 + // True if this protobuf segment includes multiple encodings of the field + MultipleContiguous bool +} + +// XXX_lazyUnmarshalInfo has information about a particular lazily decoded message +// +// Deprecated: Do not use. This will be deleted in the near future. +type XXX_lazyUnmarshalInfo struct { + // Index of fields and their positions in the protobuf for this + // message. Make index be a pointer to a slice so it can be updated + // atomically. The index pointer is only set once (lazily when/if + // the index is first needed), and must always be SET and LOADED + // ATOMICALLY. + index *[]IndexEntry + // The protobuf associated with this lazily decoded message. It is + // only set during proto.Unmarshal(). It doesn't need to be set and + // loaded atomically, since any simultaneous set (Unmarshal) and read + // (during a get) would already be a race in the app code. + Protobuf []byte + // The flags present when Unmarshal was originally called for this particular message + unmarshalFlags piface.UnmarshalInputFlags +} + +// The Buffer and SetBuffer methods let v2/internal/impl interact with +// XXX_lazyUnmarshalInfo via an interface, to avoid an import cycle. + +// Buffer returns the lazy unmarshal buffer. +// +// Deprecated: Do not use. This will be deleted in the near future. +func (lazy *XXX_lazyUnmarshalInfo) Buffer() []byte { + return lazy.Protobuf +} + +// SetBuffer sets the lazy unmarshal buffer. +// +// Deprecated: Do not use. This will be deleted in the near future. +func (lazy *XXX_lazyUnmarshalInfo) SetBuffer(b []byte) { + lazy.Protobuf = b +} + +// SetUnmarshalFlags is called to set a copy of the original unmarshalInputFlags. +// The flags should reflect how Unmarshal was called. +func (lazy *XXX_lazyUnmarshalInfo) SetUnmarshalFlags(f piface.UnmarshalInputFlags) { + lazy.unmarshalFlags = f +} + +// UnmarshalFlags returns the original unmarshalInputFlags. +func (lazy *XXX_lazyUnmarshalInfo) UnmarshalFlags() piface.UnmarshalInputFlags { + return lazy.unmarshalFlags +} + +// AllowedPartial returns true if the user originally unmarshalled this message with +// AllowPartial set to true +func (lazy *XXX_lazyUnmarshalInfo) AllowedPartial() bool { + return (lazy.unmarshalFlags & piface.UnmarshalCheckRequired) == 0 +} + +func protoFieldNumber(tag uint32) uint32 { + return tag >> 3 +} + +// buildIndex builds an index of the specified protobuf, return the index +// array and an error. +func buildIndex(buf []byte) ([]IndexEntry, error) { + index := make([]IndexEntry, 0, 16) + var lastProtoFieldNum uint32 + var outOfOrder bool + + var r BufferReader = NewBufferReader(buf) + + for !r.Done() { + var tag uint32 + var err error + var curPos = r.Pos + // INLINED: tag, err = r.DecodeVarint32() + { + i := r.Pos + buf := r.Buf + + if i >= len(buf) { + return nil, errOutOfBounds + } else if buf[i] < 0x80 { + r.Pos++ + tag = uint32(buf[i]) + } else if r.Remaining() < 5 { + var v uint64 + v, err = r.DecodeVarintSlow() + tag = uint32(v) + } else { + var v uint32 + // we already checked the first byte + tag = uint32(buf[i]) & 127 + i++ + + v = uint32(buf[i]) + i++ + tag |= (v & 127) << 7 + if v < 128 { + goto done + } + + v = uint32(buf[i]) + i++ + tag |= (v & 127) << 14 + if v < 128 { + goto done + } + + v = uint32(buf[i]) + i++ + tag |= (v & 127) << 21 + if v < 128 { + goto done + } + + v = uint32(buf[i]) + i++ + tag |= (v & 127) << 28 + if v < 128 { + goto done + } + + return nil, errOutOfBounds + + done: + r.Pos = i + } + } + // DONE: tag, err = r.DecodeVarint32() + + fieldNum := protoFieldNumber(tag) + if fieldNum < lastProtoFieldNum { + outOfOrder = true + } + + // Skip the current value -- will skip over an entire group as well. + // INLINED: err = r.SkipValue(tag) + wireType := tag & 0x7 + switch protowire.Type(wireType) { + case protowire.VarintType: + // INLINED: err = r.SkipVarint() + i := r.Pos + + if len(r.Buf)-i < 10 { + // Use DecodeVarintSlow() to skip while + // checking for buffer overflow, but ignore result + _, err = r.DecodeVarintSlow() + goto out2 + } + if r.Buf[i] < 0x80 { + goto out + } + i++ + + if r.Buf[i] < 0x80 { + goto out + } + i++ + + if r.Buf[i] < 0x80 { + goto out + } + i++ + + if r.Buf[i] < 0x80 { + goto out + } + i++ + + if r.Buf[i] < 0x80 { + goto out + } + i++ + + if r.Buf[i] < 0x80 { + goto out + } + i++ + + if r.Buf[i] < 0x80 { + goto out + } + i++ + + if r.Buf[i] < 0x80 { + goto out + } + i++ + + if r.Buf[i] < 0x80 { + goto out + } + i++ + + if r.Buf[i] < 0x80 { + goto out + } + return nil, errOverflow + out: + r.Pos = i + 1 + // DONE: err = r.SkipVarint() + case protowire.Fixed64Type: + err = r.SkipFixed64() + case protowire.BytesType: + var n uint32 + n, err = r.DecodeVarint32() + if err == nil { + err = r.Skip(int(n)) + } + case protowire.StartGroupType: + err = r.SkipGroup(tag) + case protowire.Fixed32Type: + err = r.SkipFixed32() + default: + err = fmt.Errorf("Unexpected wire type (%d)", wireType) + } + // DONE: err = r.SkipValue(tag) + + out2: + if err != nil { + return nil, err + } + if fieldNum != lastProtoFieldNum { + index = append(index, IndexEntry{FieldNum: fieldNum, + Start: uint32(curPos), + End: uint32(r.Pos)}, + ) + } else { + index[len(index)-1].End = uint32(r.Pos) + index[len(index)-1].MultipleContiguous = true + } + lastProtoFieldNum = fieldNum + } + if outOfOrder { + sort.Slice(index, func(i, j int) bool { + return index[i].FieldNum < index[j].FieldNum || + (index[i].FieldNum == index[j].FieldNum && + index[i].Start < index[j].Start) + }) + } + return index, nil +} + +func (lazy *XXX_lazyUnmarshalInfo) SizeField(num uint32) (size int) { + start, end, found, _, multipleEntries := lazy.FindFieldInProto(num) + if multipleEntries != nil { + for _, entry := range multipleEntries { + size += int(entry.End - entry.Start) + } + return size + } + if !found { + return 0 + } + return int(end - start) +} + +func (lazy *XXX_lazyUnmarshalInfo) AppendField(b []byte, num uint32) ([]byte, bool) { + start, end, found, _, multipleEntries := lazy.FindFieldInProto(num) + if multipleEntries != nil { + for _, entry := range multipleEntries { + b = append(b, lazy.Protobuf[entry.Start:entry.End]...) + } + return b, true + } + if !found { + return nil, false + } + b = append(b, lazy.Protobuf[start:end]...) + return b, true +} + +func (lazy *XXX_lazyUnmarshalInfo) SetIndex(index []IndexEntry) { + atomicStoreIndex(&lazy.index, &index) +} + +// FindFieldInProto looks for field fieldNum in lazyUnmarshalInfo information +// (including protobuf), returns startOffset/endOffset/found. +func (lazy *XXX_lazyUnmarshalInfo) FindFieldInProto(fieldNum uint32) (start, end uint32, found, multipleContiguous bool, multipleEntries []IndexEntry) { + if lazy.Protobuf == nil { + // There is no backing protobuf for this message -- it was made from a builder + return 0, 0, false, false, nil + } + index := atomicLoadIndex(&lazy.index) + if index == nil { + r, err := buildIndex(lazy.Protobuf) + if err != nil { + panic(fmt.Sprintf("findFieldInfo: error building index when looking for field %d: %v", fieldNum, err)) + } + // lazy.index is a pointer to the slice returned by BuildIndex + index = &r + atomicStoreIndex(&lazy.index, index) + } + return lookupField(index, fieldNum) +} + +// lookupField returns the offset at which the indicated field starts using +// the index, offset immediately after field ends (including all instances of +// a repeated field), and bools indicating if field was found and if there +// are multiple encodings of the field in the byte range. +// +// To hande the uncommon case where there are repeated encodings for the same +// field which are not consecutive in the protobuf (so we need to returns +// multiple start/end offsets), we also return a slice multipleEntries. If +// multipleEntries is non-nil, then multiple entries were found, and the +// values in the slice should be used, rather than start/end/found. +func lookupField(indexp *[]IndexEntry, fieldNum uint32) (start, end uint32, found bool, multipleContiguous bool, multipleEntries []IndexEntry) { + // The pointer indexp to the index was already loaded atomically. + // The slice is uniquely associated with the pointer, so it doesn't + // need to be loaded atomically. + index := *indexp + for i, entry := range index { + if fieldNum == entry.FieldNum { + if i < len(index)-1 && entry.FieldNum == index[i+1].FieldNum { + // Handle the uncommon case where there are + // repeated entries for the same field which + // are not contiguous in the protobuf. + multiple := make([]IndexEntry, 1, 2) + multiple[0] = IndexEntry{fieldNum, entry.Start, entry.End, entry.MultipleContiguous} + i++ + for i < len(index) && index[i].FieldNum == fieldNum { + multiple = append(multiple, IndexEntry{fieldNum, index[i].Start, index[i].End, index[i].MultipleContiguous}) + i++ + } + return 0, 0, false, false, multiple + + } + return entry.Start, entry.End, true, entry.MultipleContiguous, nil + } + if fieldNum < entry.FieldNum { + return 0, 0, false, false, nil + } + } + return 0, 0, false, false, nil +} diff --git a/vendor/google.golang.org/protobuf/internal/protolazy/pointer_unsafe.go b/vendor/google.golang.org/protobuf/internal/protolazy/pointer_unsafe.go new file mode 100644 index 0000000000..dc2a64ca64 --- /dev/null +++ b/vendor/google.golang.org/protobuf/internal/protolazy/pointer_unsafe.go @@ -0,0 +1,17 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package protolazy + +import ( + "sync/atomic" + "unsafe" +) + +func atomicLoadIndex(p **[]IndexEntry) *[]IndexEntry { + return (*[]IndexEntry)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) +} +func atomicStoreIndex(p **[]IndexEntry, v *[]IndexEntry) { + atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) +} diff --git a/vendor/google.golang.org/protobuf/internal/version/version.go b/vendor/google.golang.org/protobuf/internal/version/version.go index 62a52a40a3..386c823aa6 100644 --- a/vendor/google.golang.org/protobuf/internal/version/version.go +++ b/vendor/google.golang.org/protobuf/internal/version/version.go @@ -51,7 +51,7 @@ import ( // 10. Send out the CL for review and submit it. const ( Major = 1 - Minor = 35 + Minor = 36 Patch = 2 PreRelease = "" ) diff --git a/vendor/google.golang.org/protobuf/proto/decode.go b/vendor/google.golang.org/protobuf/proto/decode.go index d75a6534c1..a3b5e142d2 100644 --- a/vendor/google.golang.org/protobuf/proto/decode.go +++ b/vendor/google.golang.org/protobuf/proto/decode.go @@ -47,6 +47,12 @@ type UnmarshalOptions struct { // RecursionLimit limits how deeply messages may be nested. // If zero, a default limit is applied. RecursionLimit int + + // + // NoLazyDecoding turns off lazy decoding, which otherwise is enabled by + // default. Lazy decoding only affects submessages (annotated with [lazy = + // true] in the .proto file) within messages that use the Opaque API. + NoLazyDecoding bool } // Unmarshal parses the wire-format message in b and places the result in m. @@ -104,6 +110,16 @@ func (o UnmarshalOptions) unmarshal(b []byte, m protoreflect.Message) (out proto if o.DiscardUnknown { in.Flags |= protoiface.UnmarshalDiscardUnknown } + + if !allowPartial { + // This does not affect how current unmarshal functions work, it just allows them + // to record this for lazy the decoding case. + in.Flags |= protoiface.UnmarshalCheckRequired + } + if o.NoLazyDecoding { + in.Flags |= protoiface.UnmarshalNoLazyDecoding + } + out, err = methods.Unmarshal(in) } else { o.RecursionLimit-- diff --git a/vendor/google.golang.org/protobuf/proto/encode.go b/vendor/google.golang.org/protobuf/proto/encode.go index 1f847bcc35..f0473c5869 100644 --- a/vendor/google.golang.org/protobuf/proto/encode.go +++ b/vendor/google.golang.org/protobuf/proto/encode.go @@ -63,7 +63,8 @@ type MarshalOptions struct { // options (except for UseCachedSize itself). // // 2. The message and all its submessages have not changed in any - // way since the Size call. + // way since the Size call. For lazily decoded messages, accessing + // a message results in decoding the message, which is a change. // // If either of these invariants is violated, // the results are undefined and may include panics or corrupted output. diff --git a/vendor/google.golang.org/protobuf/proto/size.go b/vendor/google.golang.org/protobuf/proto/size.go index 052fb5ae31..c8675806c6 100644 --- a/vendor/google.golang.org/protobuf/proto/size.go +++ b/vendor/google.golang.org/protobuf/proto/size.go @@ -12,11 +12,19 @@ import ( ) // Size returns the size in bytes of the wire-format encoding of m. +// +// Note that Size might return more bytes than Marshal will write in the case of +// lazily decoded messages that arrive in non-minimal wire format: see +// https://protobuf.dev/reference/go/size/ for more details. func Size(m Message) int { return MarshalOptions{}.Size(m) } // Size returns the size in bytes of the wire-format encoding of m. +// +// Note that Size might return more bytes than Marshal will write in the case of +// lazily decoded messages that arrive in non-minimal wire format: see +// https://protobuf.dev/reference/go/size/ for more details. func (o MarshalOptions) Size(m Message) int { // Treat a nil message interface as an empty message; nothing to output. if m == nil { diff --git a/vendor/google.golang.org/protobuf/proto/wrapperopaque.go b/vendor/google.golang.org/protobuf/proto/wrapperopaque.go new file mode 100644 index 0000000000..267fd0f1f6 --- /dev/null +++ b/vendor/google.golang.org/protobuf/proto/wrapperopaque.go @@ -0,0 +1,80 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package proto + +// ValueOrNil returns nil if has is false, or a pointer to a new variable +// containing the value returned by the specified getter. +// +// This function is similar to the wrappers (proto.Int32(), proto.String(), +// etc.), but is generic (works for any field type) and works with the hasser +// and getter of a field, as opposed to a value. +// +// This is convenient when populating builder fields. +// +// Example: +// +// hop := attr.GetDirectHop() +// injectedRoute := ripb.InjectedRoute_builder{ +// Prefixes: route.GetPrefixes(), +// NextHop: proto.ValueOrNil(hop.HasAddress(), hop.GetAddress), +// } +func ValueOrNil[T any](has bool, getter func() T) *T { + if !has { + return nil + } + v := getter() + return &v +} + +// ValueOrDefault returns the protobuf message val if val is not nil, otherwise +// it returns a pointer to an empty val message. +// +// This function allows for translating code from the old Open Struct API to the +// new Opaque API. +// +// The old Open Struct API represented oneof fields with a wrapper struct: +// +// var signedImg *accountpb.SignedImage +// profile := &accountpb.Profile{ +// // The Avatar oneof will be set, with an empty SignedImage. +// Avatar: &accountpb.Profile_SignedImage{signedImg}, +// } +// +// The new Opaque API treats oneof fields like regular fields, there are no more +// wrapper structs: +// +// var signedImg *accountpb.SignedImage +// profile := &accountpb.Profile{} +// profile.SetSignedImage(signedImg) +// +// For convenience, the Opaque API also offers Builders, which allow for a +// direct translation of struct initialization. However, because Builders use +// nilness to represent field presence (but there is no non-nil wrapper struct +// anymore), Builders cannot distinguish between an unset oneof and a set oneof +// with nil message. The above code would need to be translated with help of the +// ValueOrDefault function to retain the same behavior: +// +// var signedImg *accountpb.SignedImage +// return &accountpb.Profile_builder{ +// SignedImage: proto.ValueOrDefault(signedImg), +// }.Build() +func ValueOrDefault[T interface { + *P + Message +}, P any](val T) T { + if val == nil { + return T(new(P)) + } + return val +} + +// ValueOrDefaultBytes is like ValueOrDefault but for working with fields of +// type []byte. +func ValueOrDefaultBytes(val []byte) []byte { + if val == nil { + return []byte{} + } + return val +} diff --git a/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go b/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go index d0aeab9585..bf0a0ccdee 100644 --- a/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go +++ b/vendor/google.golang.org/protobuf/reflect/protodesc/editions.go @@ -132,6 +132,9 @@ func mergeEditionFeatures(parentDesc protoreflect.Descriptor, child *descriptorp if sep := goFeatures.StripEnumPrefix; sep != nil { parentFS.StripEnumPrefix = int(*sep) } + if al := goFeatures.ApiLevel; al != nil { + parentFS.APILevel = int(*al) + } } return parentFS diff --git a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go index a7b0d06ff3..a4b78acef6 100644 --- a/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +++ b/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go @@ -152,7 +152,7 @@ type Message interface { // This method may return nil. // // The returned methods type is identical to - // google.golang.org/protobuf/runtime/protoiface.Methods. + // [google.golang.org/protobuf/runtime/protoiface.Methods]. // Consult the protoiface package documentation for details. ProtoMethods() *methods } diff --git a/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go b/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go index 246156561c..28e9e9f039 100644 --- a/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go +++ b/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go @@ -122,6 +122,22 @@ type UnmarshalInputFlags = uint8 const ( UnmarshalDiscardUnknown UnmarshalInputFlags = 1 << iota + + // UnmarshalAliasBuffer permits unmarshal operations to alias the input buffer. + // The unmarshaller must not modify the contents of the buffer. + UnmarshalAliasBuffer + + // UnmarshalValidated indicates that validation has already been + // performed on the input buffer. + UnmarshalValidated + + // UnmarshalCheckRequired is set if this unmarshal operation ultimately will care if required fields are + // initialized. + UnmarshalCheckRequired + + // UnmarshalNoLazyDecoding is set if this unmarshal operation should not use + // lazy decoding, even when otherwise available. + UnmarshalNoLazyDecoding ) // UnmarshalOutputFlags are output from the Unmarshal method. diff --git a/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go b/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go index 4a1ab7fb3d..93df1b569b 100644 --- a/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go +++ b/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go @@ -15,6 +15,7 @@ import ( "google.golang.org/protobuf/internal/filedesc" "google.golang.org/protobuf/internal/filetype" "google.golang.org/protobuf/internal/impl" + "google.golang.org/protobuf/internal/protolazy" ) // UnsafeEnabled specifies whether package unsafe can be used. @@ -39,6 +40,9 @@ type ( ExtensionFieldV1 = impl.ExtensionField Pointer = impl.Pointer + + LazyUnmarshalInfo = *protolazy.XXX_lazyUnmarshalInfo + RaceDetectHookData = impl.RaceDetectHookData ) var X impl.Export diff --git a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go index 6dea75cd5b..a551e7ae94 100644 --- a/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +++ b/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go @@ -69,7 +69,7 @@ const ( Edition_EDITION_2023 Edition = 1000 Edition_EDITION_2024 Edition = 1001 // Placeholder editions for testing feature resolution. These should not be - // used or relyed on outside of tests. + // used or relied on outside of tests. Edition_EDITION_1_TEST_ONLY Edition = 1 Edition_EDITION_2_TEST_ONLY Edition = 2 Edition_EDITION_99997_TEST_ONLY Edition = 99997 @@ -577,8 +577,6 @@ func (FieldOptions_JSType) EnumDescriptor() ([]byte, []int) { } // If set to RETENTION_SOURCE, the option will be omitted from the binary. -// Note: as of January 2023, support for this is in progress and does not yet -// have an effect (b/264593489). type FieldOptions_OptionRetention int32 const ( @@ -640,8 +638,7 @@ func (FieldOptions_OptionRetention) EnumDescriptor() ([]byte, []int) { // This indicates the types of entities that the field may apply to when used // as an option. If it is unset, then the field may be freely used as an -// option on any kind of entity. Note: as of January 2023, support for this is -// in progress and does not yet have an effect (b/264593489). +// option on any kind of entity. type FieldOptions_OptionTargetType int32 const ( @@ -1208,11 +1205,11 @@ func (GeneratedCodeInfo_Annotation_Semantic) EnumDescriptor() ([]byte, []int) { // The protocol compiler can output a FileDescriptorSet containing the .proto // files it parses. type FileDescriptorSet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + File []*FileDescriptorProto `protobuf:"bytes,1,rep,name=file" json:"file,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FileDescriptorSet) Reset() { @@ -1254,12 +1251,9 @@ func (x *FileDescriptorSet) GetFile() []*FileDescriptorProto { // Describes a complete .proto file. type FileDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` // file name, relative to root of source tree - Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` // e.g. "foo", "foo.bar", etc. + state protoimpl.MessageState `protogen:"open.v1"` + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` // file name, relative to root of source tree + Package *string `protobuf:"bytes,2,opt,name=package" json:"package,omitempty"` // e.g. "foo", "foo.bar", etc. // Names of files imported by this file. Dependency []string `protobuf:"bytes,3,rep,name=dependency" json:"dependency,omitempty"` // Indexes of the public imported files in the dependency list above. @@ -1284,7 +1278,9 @@ type FileDescriptorProto struct { // If `edition` is present, this value must be "editions". Syntax *string `protobuf:"bytes,12,opt,name=syntax" json:"syntax,omitempty"` // The edition of the proto file. - Edition *Edition `protobuf:"varint,14,opt,name=edition,enum=google.protobuf.Edition" json:"edition,omitempty"` + Edition *Edition `protobuf:"varint,14,opt,name=edition,enum=google.protobuf.Edition" json:"edition,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FileDescriptorProto) Reset() { @@ -1410,10 +1406,7 @@ func (x *FileDescriptorProto) GetEdition() Edition { // Describes a message type. type DescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` Field []*FieldDescriptorProto `protobuf:"bytes,2,rep,name=field" json:"field,omitempty"` Extension []*FieldDescriptorProto `protobuf:"bytes,6,rep,name=extension" json:"extension,omitempty"` @@ -1425,7 +1418,9 @@ type DescriptorProto struct { ReservedRange []*DescriptorProto_ReservedRange `protobuf:"bytes,9,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` // Reserved field names, which may not be used by fields in the same message. // A given name may only be reserved once. - ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + ReservedName []string `protobuf:"bytes,10,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DescriptorProto) Reset() { @@ -1529,11 +1524,7 @@ func (x *DescriptorProto) GetReservedName() []string { } type ExtensionRangeOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` // For external users: DO NOT USE. We are in the process of open sourcing @@ -1545,7 +1536,10 @@ type ExtensionRangeOptions struct { // The verification state of the range. // TODO: flip the default to DECLARATION once all empty ranges // are marked as UNVERIFIED. - Verification *ExtensionRangeOptions_VerificationState `protobuf:"varint,3,opt,name=verification,enum=google.protobuf.ExtensionRangeOptions_VerificationState,def=1" json:"verification,omitempty"` + Verification *ExtensionRangeOptions_VerificationState `protobuf:"varint,3,opt,name=verification,enum=google.protobuf.ExtensionRangeOptions_VerificationState,def=1" json:"verification,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for ExtensionRangeOptions fields. @@ -1613,10 +1607,7 @@ func (x *ExtensionRangeOptions) GetVerification() ExtensionRangeOptions_Verifica // Describes a field within a message. type FieldDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` Number *int32 `protobuf:"varint,3,opt,name=number" json:"number,omitempty"` Label *FieldDescriptorProto_Label `protobuf:"varint,4,opt,name=label,enum=google.protobuf.FieldDescriptorProto_Label" json:"label,omitempty"` @@ -1668,6 +1659,8 @@ type FieldDescriptorProto struct { // Proto2 optional fields do not set this flag, because they already indicate // optional with `LABEL_OPTIONAL`. Proto3Optional *bool `protobuf:"varint,17,opt,name=proto3_optional,json=proto3Optional" json:"proto3_optional,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FieldDescriptorProto) Reset() { @@ -1779,12 +1772,11 @@ func (x *FieldDescriptorProto) GetProto3Optional() bool { // Describes a oneof. type OneofDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` unknownFields protoimpl.UnknownFields - - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Options *OneofOptions `protobuf:"bytes,2,opt,name=options" json:"options,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OneofDescriptorProto) Reset() { @@ -1833,10 +1825,7 @@ func (x *OneofDescriptorProto) GetOptions() *OneofOptions { // Describes an enum type. type EnumDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` Value []*EnumValueDescriptorProto `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` Options *EnumOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` @@ -1846,7 +1835,9 @@ type EnumDescriptorProto struct { ReservedRange []*EnumDescriptorProto_EnumReservedRange `protobuf:"bytes,4,rep,name=reserved_range,json=reservedRange" json:"reserved_range,omitempty"` // Reserved enum value names, which may not be reused. A given name may only // be reserved once. - ReservedName []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + ReservedName []string `protobuf:"bytes,5,rep,name=reserved_name,json=reservedName" json:"reserved_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *EnumDescriptorProto) Reset() { @@ -1916,13 +1907,12 @@ func (x *EnumDescriptorProto) GetReservedName() []string { // Describes a value within an enum. type EnumValueDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` + Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` unknownFields protoimpl.UnknownFields - - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Number *int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"` - Options *EnumValueOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + sizeCache protoimpl.SizeCache } func (x *EnumValueDescriptorProto) Reset() { @@ -1978,13 +1968,12 @@ func (x *EnumValueDescriptorProto) GetOptions() *EnumValueOptions { // Describes a service. type ServiceDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` + Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` unknownFields protoimpl.UnknownFields - - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Method []*MethodDescriptorProto `protobuf:"bytes,2,rep,name=method" json:"method,omitempty"` - Options *ServiceOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ServiceDescriptorProto) Reset() { @@ -2040,11 +2029,8 @@ func (x *ServiceDescriptorProto) GetOptions() *ServiceOptions { // Describes a method of a service. type MethodDescriptorProto struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name *string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` // Input and output type names. These are resolved in the same way as // FieldDescriptorProto.type_name, but must refer to a message type. InputType *string `protobuf:"bytes,2,opt,name=input_type,json=inputType" json:"input_type,omitempty"` @@ -2054,6 +2040,8 @@ type MethodDescriptorProto struct { ClientStreaming *bool `protobuf:"varint,5,opt,name=client_streaming,json=clientStreaming,def=0" json:"client_streaming,omitempty"` // Identifies if server streams multiple server messages ServerStreaming *bool `protobuf:"varint,6,opt,name=server_streaming,json=serverStreaming,def=0" json:"server_streaming,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for MethodDescriptorProto fields. @@ -2135,11 +2123,7 @@ func (x *MethodDescriptorProto) GetServerStreaming() bool { } type FileOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` // Sets the Java package where classes generated from this .proto will be // placed. By default, the proto package is used, but this is often // inappropriate because proto packages do not normally start with backwards @@ -2231,6 +2215,9 @@ type FileOptions struct { // The parser stores options it doesn't recognize here. // See the documentation for the "Options" section above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for FileOptions fields. @@ -2424,11 +2411,7 @@ func (x *FileOptions) GetUninterpretedOption() []*UninterpretedOption { } type MessageOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` // Set true to use the old proto1 MessageSet wire format for extensions. // This is provided for backwards-compatibility with the MessageSet wire // format. You should not use this for any other reason: It's less @@ -2501,6 +2484,9 @@ type MessageOptions struct { Features *FeatureSet `protobuf:"bytes,12,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for MessageOptions fields. @@ -2591,17 +2577,14 @@ func (x *MessageOptions) GetUninterpretedOption() []*UninterpretedOption { } type FieldOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` + // NOTE: ctype is deprecated. Use `features.(pb.cpp).string_type` instead. // The ctype option instructs the C++ code generator to use a different // representation of the field than it normally would. See the specific // options below. This option is only implemented to support use of // [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of - // type "bytes" in the open source release -- sorry, we'll try to include - // other types in a future version! + // type "bytes" in the open source release. + // TODO: make ctype actually deprecated. Ctype *FieldOptions_CType `protobuf:"varint,1,opt,name=ctype,enum=google.protobuf.FieldOptions_CType,def=0" json:"ctype,omitempty"` // The packed option can be enabled for repeated primitive fields to enable // a more efficient representation on the wire. Rather than repeatedly @@ -2668,6 +2651,9 @@ type FieldOptions struct { FeatureSupport *FieldOptions_FeatureSupport `protobuf:"bytes,22,opt,name=feature_support,json=featureSupport" json:"feature_support,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for FieldOptions fields. @@ -2810,15 +2796,14 @@ func (x *FieldOptions) GetUninterpretedOption() []*UninterpretedOption { } type OneofOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` // Any features defined in the specific edition. Features *FeatureSet `protobuf:"bytes,1,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OneofOptions) Reset() { @@ -2866,11 +2851,7 @@ func (x *OneofOptions) GetUninterpretedOption() []*UninterpretedOption { } type EnumOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` // Set this option to true to allow mapping different tag names to the same // value. AllowAlias *bool `protobuf:"varint,2,opt,name=allow_alias,json=allowAlias" json:"allow_alias,omitempty"` @@ -2892,6 +2873,9 @@ type EnumOptions struct { Features *FeatureSet `protobuf:"bytes,7,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for EnumOptions fields. @@ -2966,11 +2950,7 @@ func (x *EnumOptions) GetUninterpretedOption() []*UninterpretedOption { } type EnumValueOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` // Is this enum value deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the enum value, or it will be completely ignored; in the very least, @@ -2986,6 +2966,9 @@ type EnumValueOptions struct { FeatureSupport *FieldOptions_FeatureSupport `protobuf:"bytes,4,opt,name=feature_support,json=featureSupport" json:"feature_support,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for EnumValueOptions fields. @@ -3060,11 +3043,7 @@ func (x *EnumValueOptions) GetUninterpretedOption() []*UninterpretedOption { } type ServiceOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` // Any features defined in the specific edition. Features *FeatureSet `protobuf:"bytes,34,opt,name=features" json:"features,omitempty"` // Is this service deprecated? @@ -3074,6 +3053,9 @@ type ServiceOptions struct { Deprecated *bool `protobuf:"varint,33,opt,name=deprecated,def=0" json:"deprecated,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for ServiceOptions fields. @@ -3133,11 +3115,7 @@ func (x *ServiceOptions) GetUninterpretedOption() []*UninterpretedOption { } type MethodOptions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` // Is this method deprecated? // Depending on the target platform, this can emit Deprecated annotations // for the method, or it will be completely ignored; in the very least, @@ -3148,6 +3126,9 @@ type MethodOptions struct { Features *FeatureSet `protobuf:"bytes,35,opt,name=features" json:"features,omitempty"` // The parser stores options it doesn't recognize here. See above. UninterpretedOption []*UninterpretedOption `protobuf:"bytes,999,rep,name=uninterpreted_option,json=uninterpretedOption" json:"uninterpreted_option,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Default values for MethodOptions fields. @@ -3221,11 +3202,8 @@ func (x *MethodOptions) GetUninterpretedOption() []*UninterpretedOption { // or produced by Descriptor::CopyTo()) will never have UninterpretedOptions // in them. type UninterpretedOption struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name []*UninterpretedOption_NamePart `protobuf:"bytes,2,rep,name=name" json:"name,omitempty"` // The value of the uninterpreted option, in whatever type the tokenizer // identified it as during parsing. Exactly one of these should be set. IdentifierValue *string `protobuf:"bytes,3,opt,name=identifier_value,json=identifierValue" json:"identifier_value,omitempty"` @@ -3234,6 +3212,8 @@ type UninterpretedOption struct { DoubleValue *float64 `protobuf:"fixed64,6,opt,name=double_value,json=doubleValue" json:"double_value,omitempty"` StringValue []byte `protobuf:"bytes,7,opt,name=string_value,json=stringValue" json:"string_value,omitempty"` AggregateValue *string `protobuf:"bytes,8,opt,name=aggregate_value,json=aggregateValue" json:"aggregate_value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UninterpretedOption) Reset() { @@ -3322,17 +3302,16 @@ func (x *UninterpretedOption) GetAggregateValue() string { // be designed and implemented to handle this, hopefully before we ever hit a // conflict here. type FeatureSet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - extensionFields protoimpl.ExtensionFields - + state protoimpl.MessageState `protogen:"open.v1"` FieldPresence *FeatureSet_FieldPresence `protobuf:"varint,1,opt,name=field_presence,json=fieldPresence,enum=google.protobuf.FeatureSet_FieldPresence" json:"field_presence,omitempty"` EnumType *FeatureSet_EnumType `protobuf:"varint,2,opt,name=enum_type,json=enumType,enum=google.protobuf.FeatureSet_EnumType" json:"enum_type,omitempty"` RepeatedFieldEncoding *FeatureSet_RepeatedFieldEncoding `protobuf:"varint,3,opt,name=repeated_field_encoding,json=repeatedFieldEncoding,enum=google.protobuf.FeatureSet_RepeatedFieldEncoding" json:"repeated_field_encoding,omitempty"` Utf8Validation *FeatureSet_Utf8Validation `protobuf:"varint,4,opt,name=utf8_validation,json=utf8Validation,enum=google.protobuf.FeatureSet_Utf8Validation" json:"utf8_validation,omitempty"` MessageEncoding *FeatureSet_MessageEncoding `protobuf:"varint,5,opt,name=message_encoding,json=messageEncoding,enum=google.protobuf.FeatureSet_MessageEncoding" json:"message_encoding,omitempty"` JsonFormat *FeatureSet_JsonFormat `protobuf:"varint,6,opt,name=json_format,json=jsonFormat,enum=google.protobuf.FeatureSet_JsonFormat" json:"json_format,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FeatureSet) Reset() { @@ -3412,10 +3391,7 @@ func (x *FeatureSet) GetJsonFormat() FeatureSet_JsonFormat { // feature resolution. The resolution with this object becomes a simple search // for the closest matching edition, followed by proto merges. type FeatureSetDefaults struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Defaults []*FeatureSetDefaults_FeatureSetEditionDefault `protobuf:"bytes,1,rep,name=defaults" json:"defaults,omitempty"` // The minimum supported edition (inclusive) when this was constructed. // Editions before this will not have defaults. @@ -3423,6 +3399,8 @@ type FeatureSetDefaults struct { // The maximum known edition (inclusive) when this was constructed. Editions // after this will not have reliable defaults. MaximumEdition *Edition `protobuf:"varint,5,opt,name=maximum_edition,json=maximumEdition,enum=google.protobuf.Edition" json:"maximum_edition,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FeatureSetDefaults) Reset() { @@ -3479,10 +3457,7 @@ func (x *FeatureSetDefaults) GetMaximumEdition() Edition { // Encapsulates information about the original source file from which a // FileDescriptorProto was generated. type SourceCodeInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A Location identifies a piece of source code in a .proto file which // corresponds to a particular definition. This information is intended // to be useful to IDEs, code indexers, documentation generators, and similar @@ -3531,7 +3506,10 @@ type SourceCodeInfo struct { // - Code which tries to interpret locations should probably be designed to // ignore those that it doesn't understand, as more types of locations could // be recorded in the future. - Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + Location []*SourceCodeInfo_Location `protobuf:"bytes,1,rep,name=location" json:"location,omitempty"` + extensionFields protoimpl.ExtensionFields + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SourceCodeInfo) Reset() { @@ -3575,13 +3553,12 @@ func (x *SourceCodeInfo) GetLocation() []*SourceCodeInfo_Location { // file. A GeneratedCodeInfo message is associated with only one generated // source file, but may contain references to different source .proto files. type GeneratedCodeInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // An Annotation connects some span of text in generated code to an element // of its generating .proto file. - Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` + Annotation []*GeneratedCodeInfo_Annotation `protobuf:"bytes,1,rep,name=annotation" json:"annotation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GeneratedCodeInfo) Reset() { @@ -3622,13 +3599,12 @@ func (x *GeneratedCodeInfo) GetAnnotation() []*GeneratedCodeInfo_Annotation { } type DescriptorProto_ExtensionRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` // Inclusive. + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` // Exclusive. + Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` unknownFields protoimpl.UnknownFields - - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` // Inclusive. - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` // Exclusive. - Options *ExtensionRangeOptions `protobuf:"bytes,3,opt,name=options" json:"options,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DescriptorProto_ExtensionRange) Reset() { @@ -3686,12 +3662,11 @@ func (x *DescriptorProto_ExtensionRange) GetOptions() *ExtensionRangeOptions { // fields or extension ranges in the same message. Reserved ranges may // not overlap. type DescriptorProto_ReservedRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` // Inclusive. + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` // Exclusive. unknownFields protoimpl.UnknownFields - - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` // Inclusive. - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` // Exclusive. + sizeCache protoimpl.SizeCache } func (x *DescriptorProto_ReservedRange) Reset() { @@ -3739,10 +3714,7 @@ func (x *DescriptorProto_ReservedRange) GetEnd() int32 { } type ExtensionRangeOptions_Declaration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The extension number declared within the extension range. Number *int32 `protobuf:"varint,1,opt,name=number" json:"number,omitempty"` // The fully-qualified name of the extension field. There must be a leading @@ -3758,7 +3730,9 @@ type ExtensionRangeOptions_Declaration struct { Reserved *bool `protobuf:"varint,5,opt,name=reserved" json:"reserved,omitempty"` // If true, indicates that the extension must be defined as repeated. // Otherwise the extension must be defined as optional. - Repeated *bool `protobuf:"varint,6,opt,name=repeated" json:"repeated,omitempty"` + Repeated *bool `protobuf:"varint,6,opt,name=repeated" json:"repeated,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExtensionRangeOptions_Declaration) Reset() { @@ -3833,12 +3807,11 @@ func (x *ExtensionRangeOptions_Declaration) GetRepeated() bool { // is inclusive such that it can appropriately represent the entire int32 // domain. type EnumDescriptorProto_EnumReservedRange struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` // Inclusive. + End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` // Inclusive. unknownFields protoimpl.UnknownFields - - Start *int32 `protobuf:"varint,1,opt,name=start" json:"start,omitempty"` // Inclusive. - End *int32 `protobuf:"varint,2,opt,name=end" json:"end,omitempty"` // Inclusive. + sizeCache protoimpl.SizeCache } func (x *EnumDescriptorProto_EnumReservedRange) Reset() { @@ -3886,12 +3859,11 @@ func (x *EnumDescriptorProto_EnumReservedRange) GetEnd() int32 { } type FieldOptions_EditionDefault struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Edition *Edition `protobuf:"varint,3,opt,name=edition,enum=google.protobuf.Edition" json:"edition,omitempty"` + Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` // Textproto value. unknownFields protoimpl.UnknownFields - - Edition *Edition `protobuf:"varint,3,opt,name=edition,enum=google.protobuf.Edition" json:"edition,omitempty"` - Value *string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` // Textproto value. + sizeCache protoimpl.SizeCache } func (x *FieldOptions_EditionDefault) Reset() { @@ -3940,10 +3912,7 @@ func (x *FieldOptions_EditionDefault) GetValue() string { // Information about the support window of a feature. type FieldOptions_FeatureSupport struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The edition that this feature was first available in. In editions // earlier than this one, the default assigned to EDITION_LEGACY will be // used, and proto files will not be able to override it. @@ -3958,6 +3927,8 @@ type FieldOptions_FeatureSupport struct { // this one, the last default assigned will be used, and proto files will // not be able to override it. EditionRemoved *Edition `protobuf:"varint,4,opt,name=edition_removed,json=editionRemoved,enum=google.protobuf.Edition" json:"edition_removed,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FieldOptions_FeatureSupport) Reset() { @@ -4024,12 +3995,11 @@ func (x *FieldOptions_FeatureSupport) GetEditionRemoved() Edition { // E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents // "foo.(bar.baz).moo". type UninterpretedOption_NamePart struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` + IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` unknownFields protoimpl.UnknownFields - - NamePart *string `protobuf:"bytes,1,req,name=name_part,json=namePart" json:"name_part,omitempty"` - IsExtension *bool `protobuf:"varint,2,req,name=is_extension,json=isExtension" json:"is_extension,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UninterpretedOption_NamePart) Reset() { @@ -4081,15 +4051,14 @@ func (x *UninterpretedOption_NamePart) GetIsExtension() bool { // the defaults at the closest matching edition ordered at or before it should // be used. This field must be in strict ascending order by edition. type FeatureSetDefaults_FeatureSetEditionDefault struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Edition *Edition `protobuf:"varint,3,opt,name=edition,enum=google.protobuf.Edition" json:"edition,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Edition *Edition `protobuf:"varint,3,opt,name=edition,enum=google.protobuf.Edition" json:"edition,omitempty"` // Defaults of features that can be overridden in this edition. OverridableFeatures *FeatureSet `protobuf:"bytes,4,opt,name=overridable_features,json=overridableFeatures" json:"overridable_features,omitempty"` // Defaults of features that can't be overridden in this edition. FixedFeatures *FeatureSet `protobuf:"bytes,5,opt,name=fixed_features,json=fixedFeatures" json:"fixed_features,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FeatureSetDefaults_FeatureSetEditionDefault) Reset() { @@ -4144,10 +4113,7 @@ func (x *FeatureSetDefaults_FeatureSetEditionDefault) GetFixedFeatures() *Featur } type SourceCodeInfo_Location struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Identifies which part of the FileDescriptorProto was defined at this // location. // @@ -4239,6 +4205,8 @@ type SourceCodeInfo_Location struct { LeadingComments *string `protobuf:"bytes,3,opt,name=leading_comments,json=leadingComments" json:"leading_comments,omitempty"` TrailingComments *string `protobuf:"bytes,4,opt,name=trailing_comments,json=trailingComments" json:"trailing_comments,omitempty"` LeadingDetachedComments []string `protobuf:"bytes,6,rep,name=leading_detached_comments,json=leadingDetachedComments" json:"leading_detached_comments,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SourceCodeInfo_Location) Reset() { @@ -4307,10 +4275,7 @@ func (x *SourceCodeInfo_Location) GetLeadingDetachedComments() []string { } type GeneratedCodeInfo_Annotation struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Identifies the element in the original source .proto file. This field // is formatted the same as SourceCodeInfo.Location.path. Path []int32 `protobuf:"varint,1,rep,packed,name=path" json:"path,omitempty"` @@ -4322,8 +4287,10 @@ type GeneratedCodeInfo_Annotation struct { // Identifies the ending offset in bytes in the generated code that // relates to the identified object. The end offset should be one past // the last relevant byte (so the length of the text = end - begin). - End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` - Semantic *GeneratedCodeInfo_Annotation_Semantic `protobuf:"varint,5,opt,name=semantic,enum=google.protobuf.GeneratedCodeInfo_Annotation_Semantic" json:"semantic,omitempty"` + End *int32 `protobuf:"varint,4,opt,name=end" json:"end,omitempty"` + Semantic *GeneratedCodeInfo_Annotation_Semantic `protobuf:"varint,5,opt,name=semantic,enum=google.protobuf.GeneratedCodeInfo_Annotation_Semantic" json:"semantic,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GeneratedCodeInfo_Annotation) Reset() { @@ -4397,494 +4364,474 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x0a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x22, 0x4d, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x62, 0x75, 0x66, 0x22, 0x5b, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x04, 0x66, 0x69, - 0x6c, 0x65, 0x22, 0x98, 0x05, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, - 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, - 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x5f, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x05, 0x52, 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x44, 0x65, 0x70, 0x65, 0x6e, - 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x65, 0x61, 0x6b, 0x5f, 0x64, 0x65, - 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0e, - 0x77, 0x65, 0x61, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x43, - 0x0a, 0x0c, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, - 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, - 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x06, - 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, - 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, - 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x6c, 0x65, 0x2a, 0x0c, 0x08, 0x80, 0xec, 0xca, 0xff, 0x01, 0x10, 0x81, 0xec, 0xca, 0xff, 0x01, + 0x22, 0x98, 0x05, 0x0a, 0x13, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, + 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x5f, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x05, 0x52, 0x10, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, + 0x6e, 0x63, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x65, 0x61, 0x6b, 0x5f, 0x64, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0e, 0x77, 0x65, + 0x61, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x43, 0x0a, 0x0c, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x07, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, - 0x0f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, - 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, - 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x52, 0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x49, 0x0a, 0x10, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, - 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x1a, 0x37, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xcc, 0x04, 0x0a, 0x15, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, - 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0x88, 0x01, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x63, - 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x6d, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x3a, 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x42, 0x03, 0x88, - 0x01, 0x02, 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x1a, 0x94, 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x34, 0x0a, 0x11, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, - 0x44, 0x45, 0x43, 0x4c, 0x41, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, - 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x09, 0x08, - 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, + 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x06, 0x0a, 0x0f, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x12, 0x43, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0b, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x0a, 0x6e, 0x65, + 0x73, 0x74, 0x65, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, + 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, + 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x64, + 0x65, 0x63, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, + 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x52, 0x09, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x63, 0x6c, 0x12, 0x39, 0x0a, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x1a, 0x7a, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x40, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x37, + 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xcc, 0x04, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, + 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x0b, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0x88, 0x01, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x6d, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3a, + 0x0a, 0x55, 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x42, 0x03, 0x88, 0x01, 0x02, + 0x52, 0x0c, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x94, + 0x01, 0x0a, 0x0b, 0x44, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x4a, + 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x34, 0x0a, 0x11, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, + 0x43, 0x4c, 0x41, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x55, + 0x4e, 0x56, 0x45, 0x52, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x09, 0x08, 0xe8, 0x07, + 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xc1, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x41, 0x0a, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, + 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x3e, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x1b, 0x0a, 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1b, 0x0a, + 0x09, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, 0x02, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, + 0x55, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, + 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, + 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, + 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, 0x0e, 0x0a, + 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, 0x0f, 0x0a, + 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, 0x12, 0x0d, + 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, 0x11, 0x0a, + 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x0f, + 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, + 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x54, + 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, + 0x54, 0x36, 0x34, 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x12, + 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, + 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, 0x50, 0x45, + 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, + 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x22, 0x63, 0x0a, 0x14, 0x4f, 0x6e, + 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0xe3, 0x02, 0x0a, 0x13, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, + 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x5f, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb6, - 0x02, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x36, 0x34, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, 0x10, 0x07, 0x12, 0x0d, 0x0a, - 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x0e, 0x0a, - 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x10, 0x0a, 0x12, 0x10, 0x0a, - 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x0b, 0x12, - 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x59, 0x54, 0x45, 0x53, 0x10, 0x0c, 0x12, - 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x33, 0x32, 0x10, 0x0d, - 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x0e, 0x12, - 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, 0x44, 0x33, 0x32, - 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x46, 0x49, 0x58, 0x45, - 0x44, 0x36, 0x34, 0x10, 0x10, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, - 0x4e, 0x54, 0x33, 0x32, 0x10, 0x11, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, - 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x12, 0x22, 0x43, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, - 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, 0x4c, 0x5f, 0x52, 0x45, - 0x50, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x4c, 0x41, 0x42, 0x45, - 0x4c, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x02, 0x22, 0x63, 0x0a, 0x14, - 0x4f, 0x6e, 0x65, 0x6f, 0x66, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4f, 0x6e, 0x65, 0x6f, - 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xe3, 0x02, 0x0a, 0x13, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, + 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5d, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, + 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, 0x75, 0x6d, + 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5d, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x3b, 0x0a, 0x11, 0x45, 0x6e, - 0x75, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x75, 0x6d, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, - 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, - 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x21, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xa7, 0x01, 0x0a, 0x16, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, + 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x89, 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, + 0x10, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, + 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x12, + 0x30, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, + 0x67, 0x22, 0xad, 0x09, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6a, 0x61, 0x76, 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, 0x76, 0x61, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x44, 0x0a, + 0x1d, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x65, + 0x71, 0x75, 0x61, 0x6c, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, 0x64, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x16, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, 0x1b, 0x20, + 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, 0x38, 0x12, + 0x53, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, + 0x3a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, + 0x65, 0x46, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, + 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, 0x6a, 0x61, + 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, 0x6e, 0x65, + 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0a, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x04, 0x74, + 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x72, 0x65, + 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x63, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, + 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x73, 0x68, 0x61, 0x72, + 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x77, + 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x27, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, + 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x68, 0x70, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x68, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x16, + 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x68, + 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x62, 0x79, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, + 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x89, 0x02, 0x0a, 0x15, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x30, 0x0a, 0x10, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, - 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, - 0x67, 0x12, 0x30, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x0f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x69, 0x6e, 0x67, 0x22, 0xad, 0x09, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6a, 0x61, 0x76, 0x61, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6a, 0x61, 0x76, 0x61, 0x4f, 0x75, 0x74, 0x65, 0x72, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x6a, 0x61, 0x76, 0x61, - 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x6a, 0x61, - 0x76, 0x61, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x44, 0x0a, 0x1d, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x19, 0x6a, 0x61, 0x76, 0x61, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x41, 0x6e, - 0x64, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3a, 0x0a, 0x16, 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x74, 0x66, 0x38, 0x18, - 0x1b, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, - 0x76, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x74, 0x66, - 0x38, 0x12, 0x53, 0x0a, 0x0c, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x5f, 0x66, 0x6f, - 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, - 0x64, 0x65, 0x3a, 0x05, 0x53, 0x50, 0x45, 0x45, 0x44, 0x52, 0x0b, 0x6f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x6f, 0x5f, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x6f, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x13, 0x63, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x65, - 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x63, 0x63, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x15, - 0x6a, 0x61, 0x76, 0x61, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, - 0x73, 0x65, 0x52, 0x13, 0x6a, 0x61, 0x76, 0x61, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x13, 0x70, 0x79, 0x5f, 0x67, 0x65, - 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x12, - 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x11, 0x70, 0x79, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x25, - 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x10, 0x63, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x3a, - 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x63, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, - 0x72, 0x65, 0x6e, 0x61, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x62, 0x6a, 0x63, 0x5f, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x63, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x73, 0x68, 0x61, 0x72, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x73, 0x68, - 0x61, 0x72, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x77, 0x69, 0x66, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x27, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x66, 0x74, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, - 0x28, 0x0a, 0x10, 0x70, 0x68, 0x70, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x18, 0x28, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x68, 0x70, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x68, 0x70, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x70, 0x68, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x34, - 0x0a, 0x16, 0x70, 0x68, 0x70, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x70, 0x68, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x75, 0x62, 0x79, 0x5f, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x75, 0x62, 0x79, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, - 0x45, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, - 0x5a, 0x45, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, - 0x54, 0x49, 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, - 0x02, 0x4a, 0x04, 0x08, 0x2a, 0x10, 0x2b, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x52, 0x14, 0x70, - 0x68, 0x70, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x22, 0xf4, 0x03, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0x4c, 0x0a, 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, - 0x61, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x52, 0x1c, 0x6e, 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, - 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, - 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, - 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x37, - 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x04, - 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, - 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0x9d, 0x0d, 0x0a, 0x0c, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x05, 0x63, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x3a, - 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, 0x4a, 0x53, - 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x19, 0x0a, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x2e, 0x0a, 0x0f, 0x75, 0x6e, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x75, 0x6e, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x19, 0x0a, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, - 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x28, 0x0a, 0x0c, - 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, - 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x12, 0x4b, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x13, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, + 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, + 0x6d, 0x69, 0x7a, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x50, 0x45, 0x45, + 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x5a, 0x45, + 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x49, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, + 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, + 0x04, 0x08, 0x2a, 0x10, 0x2b, 0x4a, 0x04, 0x08, 0x26, 0x10, 0x27, 0x52, 0x14, 0x70, 0x68, 0x70, + 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x22, 0xf4, 0x03, 0x0a, 0x0e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x17, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x14, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x57, 0x69, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x4c, 0x0a, 0x1f, 0x6e, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, + 0x64, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x52, 0x1c, 0x6e, 0x6f, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x70, 0x5f, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, + 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, + 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, + 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x08, + 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0x9d, 0x0d, 0x0a, 0x0c, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x05, 0x63, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x06, 0x53, + 0x54, 0x52, 0x49, 0x4e, 0x47, 0x52, 0x05, 0x63, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x61, + 0x63, 0x6b, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x57, 0x0a, - 0x10, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x6f, 0x6e, 0x73, 0x2e, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, + 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x52, 0x06, 0x6a, 0x73, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, + 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x52, 0x04, 0x6c, 0x61, 0x7a, 0x79, 0x12, 0x2e, 0x0a, 0x0f, 0x75, 0x6e, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x6c, 0x61, 0x7a, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0e, 0x75, 0x6e, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x4c, 0x61, 0x7a, 0x79, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x19, 0x0a, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x52, 0x04, 0x77, 0x65, 0x61, 0x6b, 0x12, 0x28, 0x0a, 0x0c, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, + 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x52, 0x65, + 0x64, 0x61, 0x63, 0x74, 0x12, 0x4b, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x0f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, - 0x55, 0x0a, 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, - 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, - 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, - 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x1a, 0x5a, 0x0a, 0x0e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x65, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x96, 0x02, 0x0a, - 0x0e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x47, 0x0a, 0x12, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x12, 0x65, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, - 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, - 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, - 0x52, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, - 0x49, 0x45, 0x43, 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x22, 0x55, 0x0a, - 0x0f, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, - 0x0a, 0x10, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x10, 0x02, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, - 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, - 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, - 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x45, 0x4f, 0x46, 0x10, 0x05, - 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x45, 0x4e, 0x55, 0x4d, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, - 0x10, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x54, - 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, - 0x44, 0x10, 0x09, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, - 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x12, 0x10, 0x13, 0x22, 0xac, 0x01, 0x0a, 0x0c, 0x4f, - 0x6e, 0x65, 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x48, 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, + 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x57, 0x0a, 0x10, 0x65, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x0f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x55, 0x0a, + 0x0f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, - 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xd1, 0x02, 0x0a, 0x0b, 0x45, 0x6e, - 0x75, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, - 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x5a, + 0x0a, 0x0e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x12, 0x32, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x96, 0x02, 0x0a, 0x0e, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, + 0x12, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x12, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x65, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x2f, 0x0a, 0x13, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x64, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x12, 0x41, 0x0a, 0x0f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x64, 0x22, 0x2f, 0x0a, 0x05, 0x43, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, + 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x52, 0x44, + 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x49, 0x45, + 0x43, 0x45, 0x10, 0x02, 0x22, 0x35, 0x0a, 0x06, 0x4a, 0x53, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, + 0x0a, 0x09, 0x4a, 0x53, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x4a, 0x53, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x4a, 0x53, 0x5f, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x22, 0x55, 0x0a, 0x0f, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x15, + 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, + 0x52, 0x45, 0x54, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x10, 0x02, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x14, 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x46, 0x49, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x5f, + 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x03, + 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x41, 0x52, 0x47, 0x45, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x4e, 0x45, 0x4f, 0x46, 0x10, 0x05, 0x12, 0x14, + 0x0a, 0x10, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, + 0x55, 0x4d, 0x10, 0x06, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x10, 0x07, + 0x12, 0x17, 0x0a, 0x13, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x08, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x41, 0x52, + 0x47, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x10, + 0x09, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x04, + 0x10, 0x05, 0x4a, 0x04, 0x08, 0x12, 0x10, 0x13, 0x22, 0xac, 0x01, 0x0a, 0x0c, 0x4f, 0x6e, 0x65, + 0x6f, 0x66, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, @@ -4893,274 +4840,296 @@ var file_google_protobuf_descriptor_proto_rawDesc = []byte{ 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, - 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0xd8, 0x02, - 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, - 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, + 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xd1, 0x02, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x56, 0x0a, 0x26, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x4c, + 0x65, 0x67, 0x61, 0x63, 0x79, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, + 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, + 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, + 0x80, 0x80, 0x80, 0x80, 0x02, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0xd8, 0x02, 0x0a, 0x10, + 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x12, 0x28, 0x0a, 0x0c, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, 0x63, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0b, 0x64, + 0x65, 0x62, 0x75, 0x67, 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x12, 0x55, 0x0a, 0x0f, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, + 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, + 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, + 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xd5, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0c, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x72, 0x65, 0x64, 0x61, - 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, - 0x0b, 0x64, 0x65, 0x62, 0x75, 0x67, 0x52, 0x65, 0x64, 0x61, 0x63, 0x74, 0x12, 0x55, 0x0a, 0x0f, - 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x52, 0x0e, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, + 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, + 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x99, + 0x03, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x21, + 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x70, + 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, 0x11, 0x69, 0x64, 0x65, 0x6d, 0x70, + 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x22, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, + 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, - 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0xd5, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, + 0x10, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x43, 0x59, + 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4e, 0x4f, + 0x5f, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, 0x01, 0x12, + 0x0e, 0x0a, 0x0a, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x2a, + 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, 0x13, 0x55, + 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2c, + 0x0a, 0x12, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, 0x08, 0x4e, + 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, + 0x50, 0x61, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x0a, 0x0a, 0x0a, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, 0x91, 0x01, 0x0a, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x3f, 0x88, 0x01, 0x01, 0x98, + 0x01, 0x04, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x45, 0x58, 0x50, 0x4c, 0x49, 0x43, + 0x49, 0x54, 0x18, 0x84, 0x07, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, + 0x49, 0x54, 0x18, 0xe7, 0x07, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x45, 0x58, 0x50, 0x4c, 0x49, 0x43, + 0x49, 0x54, 0x18, 0xe8, 0x07, 0xb2, 0x01, 0x03, 0x08, 0xe8, 0x07, 0x52, 0x0d, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x6c, 0x0a, 0x09, 0x65, 0x6e, + 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, - 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x14, 0x75, - 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, - 0x22, 0x99, 0x03, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x0a, 0x64, - 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x71, 0x0a, 0x11, 0x69, 0x64, 0x65, - 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x22, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x3a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, - 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x52, 0x10, 0x69, 0x64, 0x65, 0x6d, - 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x37, 0x0a, 0x08, - 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x08, 0x66, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x14, 0x75, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0xe7, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x75, 0x6e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x50, 0x0a, 0x10, 0x49, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x12, 0x17, 0x0a, 0x13, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, - 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, - 0x4e, 0x4f, 0x5f, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x53, 0x10, - 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x44, 0x45, 0x4d, 0x50, 0x4f, 0x54, 0x45, 0x4e, 0x54, 0x10, - 0x02, 0x2a, 0x09, 0x08, 0xe8, 0x07, 0x10, 0x80, 0x80, 0x80, 0x80, 0x02, 0x22, 0x9a, 0x03, 0x0a, - 0x13, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x6e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x65, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, - 0x74, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, - 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x65, 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x69, 0x6e, 0x74, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x76, 0x65, 0x49, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, - 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x4a, 0x0a, - 0x08, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x61, 0x6d, - 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x61, - 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x02, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x0a, 0x0a, 0x0a, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x12, 0x91, 0x01, 0x0a, 0x0e, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x3f, 0x88, 0x01, - 0x01, 0x98, 0x01, 0x04, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x45, 0x58, 0x50, 0x4c, - 0x49, 0x43, 0x49, 0x54, 0x18, 0xe6, 0x07, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x49, 0x4d, 0x50, 0x4c, - 0x49, 0x43, 0x49, 0x54, 0x18, 0xe7, 0x07, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x45, 0x58, 0x50, 0x4c, - 0x49, 0x43, 0x49, 0x54, 0x18, 0xe8, 0x07, 0xb2, 0x01, 0x03, 0x08, 0xe8, 0x07, 0x52, 0x0d, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x6c, 0x0a, 0x09, - 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x75, - 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x29, 0x88, 0x01, 0x01, 0x98, 0x01, 0x06, 0x98, 0x01, 0x01, - 0xa2, 0x01, 0x0b, 0x12, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x18, 0xe6, 0x07, 0xa2, 0x01, - 0x09, 0x12, 0x04, 0x4f, 0x50, 0x45, 0x4e, 0x18, 0xe7, 0x07, 0xb2, 0x01, 0x03, 0x08, 0xe8, 0x07, - 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x17, 0x72, - 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x65, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x42, - 0x2d, 0x88, 0x01, 0x01, 0x98, 0x01, 0x04, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x45, - 0x58, 0x50, 0x41, 0x4e, 0x44, 0x45, 0x44, 0x18, 0xe6, 0x07, 0xa2, 0x01, 0x0b, 0x12, 0x06, 0x50, - 0x41, 0x43, 0x4b, 0x45, 0x44, 0x18, 0xe7, 0x07, 0xb2, 0x01, 0x03, 0x08, 0xe8, 0x07, 0x52, 0x15, - 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x7e, 0x0a, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x55, 0x74, 0x66, 0x38, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x29, 0x88, 0x01, 0x01, 0x98, - 0x01, 0x04, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x09, 0x12, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x18, 0xe6, - 0x07, 0xa2, 0x01, 0x0b, 0x12, 0x06, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x18, 0xe7, 0x07, 0xb2, - 0x01, 0x03, 0x08, 0xe8, 0x07, 0x52, 0x0e, 0x75, 0x74, 0x66, 0x38, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x7e, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x26, 0x88, 0x01, - 0x01, 0x98, 0x01, 0x04, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x14, 0x12, 0x0f, 0x4c, 0x45, 0x4e, 0x47, - 0x54, 0x48, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x45, 0x44, 0x18, 0xe6, 0x07, 0xb2, 0x01, - 0x03, 0x08, 0xe8, 0x07, 0x52, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x82, 0x01, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x42, 0x39, 0x88, 0x01, 0x01, 0x98, 0x01, 0x03, 0x98, 0x01, 0x06, 0x98, 0x01, - 0x01, 0xa2, 0x01, 0x17, 0x12, 0x12, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x42, 0x45, 0x53, - 0x54, 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 0x18, 0xe6, 0x07, 0xa2, 0x01, 0x0a, 0x12, 0x05, - 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x18, 0xe7, 0x07, 0xb2, 0x01, 0x03, 0x08, 0xe8, 0x07, 0x52, 0x0a, - 0x6a, 0x73, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x5c, 0x0a, 0x0d, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x46, - 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x50, 0x4c, 0x49, - 0x43, 0x49, 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, 0x49, - 0x54, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x52, 0x45, - 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x03, 0x22, 0x37, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4f, - 0x50, 0x45, 0x4e, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, - 0x02, 0x22, 0x56, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, - 0x50, 0x45, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x45, 0x4e, 0x43, - 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x45, - 0x58, 0x50, 0x41, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x02, 0x22, 0x49, 0x0a, 0x0e, 0x55, 0x74, 0x66, - 0x38, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x55, - 0x54, 0x46, 0x38, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x56, 0x45, 0x52, 0x49, - 0x46, 0x59, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x03, 0x22, 0x04, - 0x08, 0x01, 0x10, 0x01, 0x22, 0x53, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x45, 0x53, 0x53, 0x41, - 0x47, 0x45, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x5f, - 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x45, - 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, 0x02, 0x22, 0x48, 0x0a, 0x0a, 0x4a, 0x73, 0x6f, - 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x17, 0x0a, 0x13, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, - 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, - 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, - 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, - 0x54, 0x10, 0x02, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0x8b, 0x4e, 0x2a, 0x06, 0x08, 0x8b, 0x4e, - 0x10, 0x90, 0x4e, 0x2a, 0x06, 0x08, 0x90, 0x4e, 0x10, 0x91, 0x4e, 0x4a, 0x06, 0x08, 0xe7, 0x07, - 0x10, 0xe8, 0x07, 0x22, 0xef, 0x03, 0x0a, 0x12, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x08, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x42, 0x29, 0x88, 0x01, 0x01, 0x98, 0x01, 0x06, 0x98, 0x01, 0x01, 0xa2, 0x01, + 0x0b, 0x12, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x18, 0x84, 0x07, 0xa2, 0x01, 0x09, 0x12, + 0x04, 0x4f, 0x50, 0x45, 0x4e, 0x18, 0xe7, 0x07, 0xb2, 0x01, 0x03, 0x08, 0xe8, 0x07, 0x52, 0x08, + 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x98, 0x01, 0x0a, 0x17, 0x72, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x2d, 0x88, + 0x01, 0x01, 0x98, 0x01, 0x04, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x0d, 0x12, 0x08, 0x45, 0x58, 0x50, + 0x41, 0x4e, 0x44, 0x45, 0x44, 0x18, 0x84, 0x07, 0xa2, 0x01, 0x0b, 0x12, 0x06, 0x50, 0x41, 0x43, + 0x4b, 0x45, 0x44, 0x18, 0xe7, 0x07, 0xb2, 0x01, 0x03, 0x08, 0xe8, 0x07, 0x52, 0x15, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x12, 0x7e, 0x0a, 0x0f, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x45, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, - 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x55, 0x74, 0x66, 0x38, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x29, 0x88, 0x01, 0x01, 0x98, 0x01, 0x04, + 0x98, 0x01, 0x01, 0xa2, 0x01, 0x09, 0x12, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x18, 0x84, 0x07, 0xa2, + 0x01, 0x0b, 0x12, 0x06, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, 0x18, 0xe7, 0x07, 0xb2, 0x01, 0x03, + 0x08, 0xe8, 0x07, 0x52, 0x0e, 0x75, 0x74, 0x66, 0x38, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x7e, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, - 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x69, - 0x6d, 0x75, 0x6d, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xf8, 0x01, 0x0a, 0x18, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x14, 0x6f, - 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x26, 0x88, 0x01, 0x01, 0x98, + 0x01, 0x04, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x14, 0x12, 0x0f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, + 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x45, 0x44, 0x18, 0x84, 0x07, 0xb2, 0x01, 0x03, 0x08, + 0xe8, 0x07, 0x52, 0x0f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x12, 0x82, 0x01, 0x0a, 0x0b, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x13, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, - 0x62, 0x6c, 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, - 0x52, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x4a, - 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x08, 0x66, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0xa7, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, - 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, - 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, - 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, - 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, - 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xd0, 0x02, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xeb, 0x01, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, - 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x65, 0x6e, 0x64, 0x12, 0x52, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x52, 0x08, - 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x22, 0x28, 0x0a, 0x08, 0x53, 0x65, 0x6d, 0x61, - 0x6e, 0x74, 0x69, 0x63, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, - 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x49, 0x41, 0x53, - 0x10, 0x02, 0x2a, 0xa7, 0x02, 0x0a, 0x07, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, - 0x0a, 0x0f, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0e, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, - 0x45, 0x47, 0x41, 0x43, 0x59, 0x10, 0x84, 0x07, 0x12, 0x13, 0x0a, 0x0e, 0x45, 0x44, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x32, 0x10, 0xe6, 0x07, 0x12, 0x13, 0x0a, - 0x0e, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x33, 0x10, - 0xe7, 0x07, 0x12, 0x11, 0x0a, 0x0c, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x32, 0x30, - 0x32, 0x33, 0x10, 0xe8, 0x07, 0x12, 0x11, 0x0a, 0x0c, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x32, 0x30, 0x32, 0x34, 0x10, 0xe9, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x44, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x31, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, - 0x01, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x32, 0x5f, 0x54, - 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x17, 0x45, 0x44, - 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x39, 0x39, 0x39, 0x39, 0x37, 0x5f, 0x54, 0x45, 0x53, 0x54, - 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x9d, 0x8d, 0x06, 0x12, 0x1d, 0x0a, 0x17, 0x45, 0x44, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x39, 0x39, 0x39, 0x39, 0x38, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, - 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x9e, 0x8d, 0x06, 0x12, 0x1d, 0x0a, 0x17, 0x45, 0x44, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x39, 0x39, 0x39, 0x39, 0x39, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, - 0x4e, 0x4c, 0x59, 0x10, 0x9f, 0x8d, 0x06, 0x12, 0x13, 0x0a, 0x0b, 0x45, 0x44, 0x49, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0xff, 0xff, 0xff, 0xff, 0x07, 0x42, 0x7e, 0x0a, 0x13, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x42, 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x48, 0x01, 0x5a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x70, 0x62, 0xf8, 0x01, 0x01, 0xa2, 0x02, 0x03, 0x47, 0x50, 0x42, 0xaa, - 0x02, 0x1a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x52, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x2e, 0x4a, 0x73, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x42, 0x39, 0x88, 0x01, 0x01, 0x98, 0x01, 0x03, 0x98, 0x01, 0x06, 0x98, 0x01, 0x01, 0xa2, + 0x01, 0x17, 0x12, 0x12, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, + 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 0x18, 0x84, 0x07, 0xa2, 0x01, 0x0a, 0x12, 0x05, 0x41, 0x4c, + 0x4c, 0x4f, 0x57, 0x18, 0xe7, 0x07, 0xb2, 0x01, 0x03, 0x08, 0xe8, 0x07, 0x52, 0x0a, 0x6a, 0x73, + 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x5c, 0x0a, 0x0d, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x46, 0x49, 0x45, + 0x4c, 0x44, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x50, 0x4c, 0x49, 0x43, 0x49, + 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x43, 0x49, 0x54, 0x10, + 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x5f, 0x52, 0x45, 0x51, 0x55, + 0x49, 0x52, 0x45, 0x44, 0x10, 0x03, 0x22, 0x37, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4f, 0x50, 0x45, + 0x4e, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x02, 0x22, + 0x56, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x50, 0x45, + 0x41, 0x54, 0x45, 0x44, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, + 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x50, + 0x41, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x02, 0x22, 0x49, 0x0a, 0x0e, 0x55, 0x74, 0x66, 0x38, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x54, 0x46, + 0x38, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x56, 0x45, 0x52, 0x49, 0x46, 0x59, + 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x03, 0x22, 0x04, 0x08, 0x01, + 0x10, 0x01, 0x22, 0x53, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, + 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x5f, 0x50, 0x52, + 0x45, 0x46, 0x49, 0x58, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x45, 0x4c, 0x49, + 0x4d, 0x49, 0x54, 0x45, 0x44, 0x10, 0x02, 0x22, 0x48, 0x0a, 0x0a, 0x4a, 0x73, 0x6f, 0x6e, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x17, 0x0a, 0x13, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, + 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x45, 0x47, + 0x41, 0x43, 0x59, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 0x10, + 0x02, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0x8b, 0x4e, 0x2a, 0x06, 0x08, 0x8b, 0x4e, 0x10, 0x90, + 0x4e, 0x2a, 0x06, 0x08, 0x90, 0x4e, 0x10, 0x91, 0x4e, 0x4a, 0x06, 0x08, 0xe7, 0x07, 0x10, 0xe8, + 0x07, 0x22, 0xef, 0x03, 0x0a, 0x12, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x2e, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x65, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x45, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x5f, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xf8, 0x01, 0x0a, 0x18, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x07, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x14, 0x6f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x53, 0x65, 0x74, 0x52, 0x13, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x61, 0x62, 0x6c, + 0x65, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0d, + 0x66, 0x69, 0x78, 0x65, 0x64, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x4a, 0x04, 0x08, + 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x0e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, + 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x44, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xce, 0x01, 0x0a, + 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x42, + 0x02, 0x10, 0x01, 0x52, 0x04, 0x73, 0x70, 0x61, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x6c, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x74, + 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x74, + 0x61, 0x63, 0x68, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0x0c, 0x08, + 0x80, 0xec, 0xca, 0xff, 0x01, 0x10, 0x81, 0xec, 0xca, 0xff, 0x01, 0x22, 0xd0, 0x02, 0x0a, 0x11, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x4d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x1a, 0xeb, 0x01, 0x0a, 0x0a, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x16, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x10, + 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x65, 0x67, 0x69, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x10, + 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x65, 0x6e, 0x64, + 0x12, 0x52, 0x0a, 0x08, 0x73, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6f, + 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, 0x52, 0x08, 0x73, 0x65, 0x6d, 0x61, + 0x6e, 0x74, 0x69, 0x63, 0x22, 0x28, 0x0a, 0x08, 0x53, 0x65, 0x6d, 0x61, 0x6e, 0x74, 0x69, 0x63, + 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, + 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x4c, 0x49, 0x41, 0x53, 0x10, 0x02, 0x2a, 0xa7, + 0x02, 0x0a, 0x07, 0x45, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x44, + 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x13, 0x0a, 0x0e, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x47, 0x41, 0x43, + 0x59, 0x10, 0x84, 0x07, 0x12, 0x13, 0x0a, 0x0e, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x32, 0x10, 0xe6, 0x07, 0x12, 0x13, 0x0a, 0x0e, 0x45, 0x44, 0x49, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x33, 0x10, 0xe7, 0x07, 0x12, 0x11, + 0x0a, 0x0c, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x32, 0x30, 0x32, 0x33, 0x10, 0xe8, + 0x07, 0x12, 0x11, 0x0a, 0x0c, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x32, 0x30, 0x32, + 0x34, 0x10, 0xe9, 0x07, 0x12, 0x17, 0x0a, 0x13, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x31, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x17, 0x0a, + 0x13, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x32, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, + 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x17, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x39, 0x39, 0x39, 0x39, 0x37, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, + 0x59, 0x10, 0x9d, 0x8d, 0x06, 0x12, 0x1d, 0x0a, 0x17, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x39, 0x39, 0x39, 0x39, 0x38, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, + 0x10, 0x9e, 0x8d, 0x06, 0x12, 0x1d, 0x0a, 0x17, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x39, 0x39, 0x39, 0x39, 0x39, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, + 0x9f, 0x8d, 0x06, 0x12, 0x13, 0x0a, 0x0b, 0x45, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, + 0x41, 0x58, 0x10, 0xff, 0xff, 0xff, 0xff, 0x07, 0x42, 0x7e, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x42, + 0x10, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x48, 0x01, 0x5a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, + 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, + 0x70, 0x62, 0xf8, 0x01, 0x01, 0xa2, 0x02, 0x03, 0x47, 0x50, 0x42, 0xaa, 0x02, 0x1a, 0x47, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x52, 0x65, + 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, } var ( diff --git a/vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go b/vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go index 5067b89e90..e0b72eaf92 100644 --- a/vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go +++ b/vendor/google.golang.org/protobuf/types/gofeaturespb/go_features.pb.go @@ -18,6 +18,71 @@ import ( sync "sync" ) +type GoFeatures_APILevel int32 + +const ( + // API_LEVEL_UNSPECIFIED results in selecting the OPEN API, + // but needs to be a separate value to distinguish between + // an explicitly set api level or a missing api level. + GoFeatures_API_LEVEL_UNSPECIFIED GoFeatures_APILevel = 0 + GoFeatures_API_OPEN GoFeatures_APILevel = 1 + GoFeatures_API_HYBRID GoFeatures_APILevel = 2 + GoFeatures_API_OPAQUE GoFeatures_APILevel = 3 +) + +// Enum value maps for GoFeatures_APILevel. +var ( + GoFeatures_APILevel_name = map[int32]string{ + 0: "API_LEVEL_UNSPECIFIED", + 1: "API_OPEN", + 2: "API_HYBRID", + 3: "API_OPAQUE", + } + GoFeatures_APILevel_value = map[string]int32{ + "API_LEVEL_UNSPECIFIED": 0, + "API_OPEN": 1, + "API_HYBRID": 2, + "API_OPAQUE": 3, + } +) + +func (x GoFeatures_APILevel) Enum() *GoFeatures_APILevel { + p := new(GoFeatures_APILevel) + *p = x + return p +} + +func (x GoFeatures_APILevel) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GoFeatures_APILevel) Descriptor() protoreflect.EnumDescriptor { + return file_google_protobuf_go_features_proto_enumTypes[0].Descriptor() +} + +func (GoFeatures_APILevel) Type() protoreflect.EnumType { + return &file_google_protobuf_go_features_proto_enumTypes[0] +} + +func (x GoFeatures_APILevel) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *GoFeatures_APILevel) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = GoFeatures_APILevel(num) + return nil +} + +// Deprecated: Use GoFeatures_APILevel.Descriptor instead. +func (GoFeatures_APILevel) EnumDescriptor() ([]byte, []int) { + return file_google_protobuf_go_features_proto_rawDescGZIP(), []int{0, 0} +} + type GoFeatures_StripEnumPrefix int32 const ( @@ -54,11 +119,11 @@ func (x GoFeatures_StripEnumPrefix) String() string { } func (GoFeatures_StripEnumPrefix) Descriptor() protoreflect.EnumDescriptor { - return file_google_protobuf_go_features_proto_enumTypes[0].Descriptor() + return file_google_protobuf_go_features_proto_enumTypes[1].Descriptor() } func (GoFeatures_StripEnumPrefix) Type() protoreflect.EnumType { - return &file_google_protobuf_go_features_proto_enumTypes[0] + return &file_google_protobuf_go_features_proto_enumTypes[1] } func (x GoFeatures_StripEnumPrefix) Number() protoreflect.EnumNumber { @@ -77,17 +142,19 @@ func (x *GoFeatures_StripEnumPrefix) UnmarshalJSON(b []byte) error { // Deprecated: Use GoFeatures_StripEnumPrefix.Descriptor instead. func (GoFeatures_StripEnumPrefix) EnumDescriptor() ([]byte, []int) { - return file_google_protobuf_go_features_proto_rawDescGZIP(), []int{0, 0} + return file_google_protobuf_go_features_proto_rawDescGZIP(), []int{0, 1} } type GoFeatures struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Whether or not to generate the deprecated UnmarshalJSON method for enums. - LegacyUnmarshalJsonEnum *bool `protobuf:"varint,1,opt,name=legacy_unmarshal_json_enum,json=legacyUnmarshalJsonEnum" json:"legacy_unmarshal_json_enum,omitempty"` - StripEnumPrefix *GoFeatures_StripEnumPrefix `protobuf:"varint,3,opt,name=strip_enum_prefix,json=stripEnumPrefix,enum=pb.GoFeatures_StripEnumPrefix" json:"strip_enum_prefix,omitempty"` + // Can only be true for proto using the Open Struct api. + LegacyUnmarshalJsonEnum *bool `protobuf:"varint,1,opt,name=legacy_unmarshal_json_enum,json=legacyUnmarshalJsonEnum" json:"legacy_unmarshal_json_enum,omitempty"` + // One of OPEN, HYBRID or OPAQUE. + ApiLevel *GoFeatures_APILevel `protobuf:"varint,2,opt,name=api_level,json=apiLevel,enum=pb.GoFeatures_APILevel" json:"api_level,omitempty"` + StripEnumPrefix *GoFeatures_StripEnumPrefix `protobuf:"varint,3,opt,name=strip_enum_prefix,json=stripEnumPrefix,enum=pb.GoFeatures_StripEnumPrefix" json:"strip_enum_prefix,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GoFeatures) Reset() { @@ -127,6 +194,13 @@ func (x *GoFeatures) GetLegacyUnmarshalJsonEnum() bool { return false } +func (x *GoFeatures) GetApiLevel() GoFeatures_APILevel { + if x != nil && x.ApiLevel != nil { + return *x.ApiLevel + } + return GoFeatures_API_LEVEL_UNSPECIFIED +} + func (x *GoFeatures) GetStripEnumPrefix() GoFeatures_StripEnumPrefix { if x != nil && x.StripEnumPrefix != nil { return *x.StripEnumPrefix @@ -158,7 +232,7 @@ var file_google_protobuf_go_features_proto_rawDesc = []byte{ 0x66, 0x2f, 0x67, 0x6f, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x02, 0x70, 0x62, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe0, 0x03, 0x0a, 0x0a, 0x47, 0x6f, + 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x05, 0x0a, 0x0a, 0x47, 0x6f, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0xbe, 0x01, 0x0a, 0x1a, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x75, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x42, 0x80, 0x01, @@ -171,31 +245,44 @@ var file_google_protobuf_go_features_proto_rawDesc = []byte{ 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x20, 0x65, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x17, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, - 0x6c, 0x4a, 0x73, 0x6f, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x7c, 0x0a, 0x11, 0x73, 0x74, 0x72, - 0x69, 0x70, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6f, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x70, 0x45, 0x6e, 0x75, 0x6d, 0x50, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x42, 0x30, 0x88, 0x01, 0x01, 0x98, 0x01, 0x06, 0x98, 0x01, 0x07, 0x98, - 0x01, 0x01, 0xa2, 0x01, 0x1b, 0x12, 0x16, 0x53, 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, - 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, 0x4b, 0x45, 0x45, 0x50, 0x18, 0x84, 0x07, - 0xb2, 0x01, 0x03, 0x08, 0xe9, 0x07, 0x52, 0x0f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x45, 0x6e, 0x75, - 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x92, 0x01, 0x0a, 0x0f, 0x53, 0x74, 0x72, 0x69, - 0x70, 0x45, 0x6e, 0x75, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x0a, 0x1d, 0x53, - 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, - 0x0a, 0x16, 0x53, 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, - 0x46, 0x49, 0x58, 0x5f, 0x4b, 0x45, 0x45, 0x50, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x54, + 0x6c, 0x4a, 0x73, 0x6f, 0x6e, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x74, 0x0a, 0x09, 0x61, 0x70, 0x69, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, + 0x62, 0x2e, 0x47, 0x6f, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x41, 0x50, 0x49, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x42, 0x3e, 0x88, 0x01, 0x01, 0x98, 0x01, 0x03, 0x98, 0x01, 0x01, + 0xa2, 0x01, 0x1a, 0x12, 0x15, 0x41, 0x50, 0x49, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x18, 0x84, 0x07, 0xa2, 0x01, 0x0f, + 0x12, 0x0a, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, 0x18, 0xe9, 0x07, 0xb2, + 0x01, 0x03, 0x08, 0xe8, 0x07, 0x52, 0x08, 0x61, 0x70, 0x69, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, + 0x7c, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x70, 0x62, 0x2e, + 0x47, 0x6f, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x70, + 0x45, 0x6e, 0x75, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x42, 0x30, 0x88, 0x01, 0x01, 0x98, + 0x01, 0x06, 0x98, 0x01, 0x07, 0x98, 0x01, 0x01, 0xa2, 0x01, 0x1b, 0x12, 0x16, 0x53, 0x54, 0x52, + 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, 0x4b, + 0x45, 0x45, 0x50, 0x18, 0x84, 0x07, 0xb2, 0x01, 0x03, 0x08, 0xe9, 0x07, 0x52, 0x0f, 0x73, 0x74, + 0x72, 0x69, 0x70, 0x45, 0x6e, 0x75, 0x6d, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x53, 0x0a, + 0x08, 0x41, 0x50, 0x49, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x50, 0x49, + 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x45, 0x4e, + 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x5f, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, + 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x50, 0x49, 0x5f, 0x4f, 0x50, 0x41, 0x51, 0x55, 0x45, + 0x10, 0x03, 0x22, 0x92, 0x01, 0x0a, 0x0f, 0x53, 0x74, 0x72, 0x69, 0x70, 0x45, 0x6e, 0x75, 0x6d, + 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x52, 0x49, 0x50, 0x5f, + 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x54, 0x52, + 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, 0x4b, + 0x45, 0x45, 0x50, 0x10, 0x01, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, + 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, + 0x41, 0x54, 0x45, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, - 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x54, 0x45, 0x5f, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x02, 0x12, - 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x52, 0x49, 0x50, 0x5f, 0x45, 0x4e, 0x55, 0x4d, 0x5f, 0x50, 0x52, - 0x45, 0x46, 0x49, 0x58, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x50, 0x10, 0x03, 0x3a, 0x3c, 0x0a, 0x02, - 0x67, 0x6f, 0x12, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x18, - 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6f, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x02, 0x67, 0x6f, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x67, - 0x6f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x70, 0x62, + 0x53, 0x54, 0x52, 0x49, 0x50, 0x10, 0x03, 0x3a, 0x3c, 0x0a, 0x02, 0x67, 0x6f, 0x12, 0x1b, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x53, 0x65, 0x74, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x6f, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x52, 0x02, 0x67, 0x6f, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x67, 0x6f, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x70, 0x62, } var ( @@ -210,22 +297,24 @@ func file_google_protobuf_go_features_proto_rawDescGZIP() []byte { return file_google_protobuf_go_features_proto_rawDescData } -var file_google_protobuf_go_features_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_google_protobuf_go_features_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_google_protobuf_go_features_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_google_protobuf_go_features_proto_goTypes = []any{ - (GoFeatures_StripEnumPrefix)(0), // 0: pb.GoFeatures.StripEnumPrefix - (*GoFeatures)(nil), // 1: pb.GoFeatures - (*descriptorpb.FeatureSet)(nil), // 2: google.protobuf.FeatureSet + (GoFeatures_APILevel)(0), // 0: pb.GoFeatures.APILevel + (GoFeatures_StripEnumPrefix)(0), // 1: pb.GoFeatures.StripEnumPrefix + (*GoFeatures)(nil), // 2: pb.GoFeatures + (*descriptorpb.FeatureSet)(nil), // 3: google.protobuf.FeatureSet } var file_google_protobuf_go_features_proto_depIdxs = []int32{ - 0, // 0: pb.GoFeatures.strip_enum_prefix:type_name -> pb.GoFeatures.StripEnumPrefix - 2, // 1: pb.go:extendee -> google.protobuf.FeatureSet - 1, // 2: pb.go:type_name -> pb.GoFeatures - 3, // [3:3] is the sub-list for method output_type - 3, // [3:3] is the sub-list for method input_type - 2, // [2:3] is the sub-list for extension type_name - 1, // [1:2] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 0, // 0: pb.GoFeatures.api_level:type_name -> pb.GoFeatures.APILevel + 1, // 1: pb.GoFeatures.strip_enum_prefix:type_name -> pb.GoFeatures.StripEnumPrefix + 3, // 2: pb.go:extendee -> google.protobuf.FeatureSet + 2, // 3: pb.go:type_name -> pb.GoFeatures + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 3, // [3:4] is the sub-list for extension type_name + 2, // [2:3] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } func init() { file_google_protobuf_go_features_proto_init() } @@ -238,7 +327,7 @@ func file_google_protobuf_go_features_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_google_protobuf_go_features_proto_rawDesc, - NumEnums: 1, + NumEnums: 2, NumMessages: 1, NumExtensions: 1, NumServices: 0, diff --git a/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go index 87da199a38..191552cce0 100644 --- a/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/anypb/any.pb.go @@ -210,10 +210,7 @@ import ( // "value": "1.212s" // } type Any struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // A URL/resource name that uniquely identifies the type of the serialized // protocol buffer message. This string must contain at least // one "/" character. The last segment of the URL's path must represent @@ -244,7 +241,9 @@ type Any struct { // used with implementation specific semantics. TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl,proto3" json:"type_url,omitempty"` // Must be a valid serialized protocol buffer of the above specified type. - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // New marshals src into a new Any instance. diff --git a/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go b/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go index b99d4d2410..34d76e6cd9 100644 --- a/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/durationpb/duration.pb.go @@ -141,10 +141,7 @@ import ( // be expressed in JSON format as "3.000000001s", and 3 seconds and 1 // microsecond should be expressed in JSON format as "3.000001s". type Duration struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Signed seconds of the span of time. Must be from -315,576,000,000 // to +315,576,000,000 inclusive. Note: these bounds are computed from: // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years @@ -155,7 +152,9 @@ type Duration struct { // of one second or more, a non-zero value for the `nanos` field must be // of the same sign as the `seconds` field. Must be from -999,999,999 // to +999,999,999 inclusive. - Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // New constructs a new Duration from the provided time.Duration. diff --git a/vendor/google.golang.org/protobuf/types/known/emptypb/empty.pb.go b/vendor/google.golang.org/protobuf/types/known/emptypb/empty.pb.go index 1761bc9c69..7fcdd382cc 100644 --- a/vendor/google.golang.org/protobuf/types/known/emptypb/empty.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/emptypb/empty.pb.go @@ -48,9 +48,9 @@ import ( // rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); // } type Empty struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Empty) Reset() { diff --git a/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go b/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go index 19de8d371f..e5d7da38c2 100644 --- a/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/fieldmaskpb/field_mask.pb.go @@ -284,12 +284,11 @@ import ( // request should verify the included field paths, and return an // `INVALID_ARGUMENT` error if any path is unmappable. type FieldMask struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The set of field mask paths. - Paths []string `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"` + Paths []string `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // New constructs a field mask from a list of paths and verifies that diff --git a/vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go b/vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go index 8f206a6611..f2c53ea337 100644 --- a/vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/structpb/struct.pb.go @@ -187,12 +187,11 @@ func (NullValue) EnumDescriptor() ([]byte, []int) { // // The JSON representation for `Struct` is JSON object. type Struct struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Unordered map of dynamically typed values. - Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Fields map[string]*Value `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // NewStruct constructs a Struct from a general-purpose Go map. @@ -276,13 +275,10 @@ func (x *Struct) GetFields() map[string]*Value { // // The JSON representation for `Value` is JSON value. type Value struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The kind of value. // - // Types that are assignable to Kind: + // Types that are valid to be assigned to Kind: // // *Value_NullValue // *Value_NumberValue @@ -290,7 +286,9 @@ type Value struct { // *Value_BoolValue // *Value_StructValue // *Value_ListValue - Kind isValue_Kind `protobuf_oneof:"kind"` + Kind isValue_Kind `protobuf_oneof:"kind"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // NewValue constructs a Value from a general-purpose Go interface. @@ -483,51 +481,63 @@ func (*Value) Descriptor() ([]byte, []int) { return file_google_protobuf_struct_proto_rawDescGZIP(), []int{1} } -func (m *Value) GetKind() isValue_Kind { - if m != nil { - return m.Kind +func (x *Value) GetKind() isValue_Kind { + if x != nil { + return x.Kind } return nil } func (x *Value) GetNullValue() NullValue { - if x, ok := x.GetKind().(*Value_NullValue); ok { - return x.NullValue + if x != nil { + if x, ok := x.Kind.(*Value_NullValue); ok { + return x.NullValue + } } return NullValue_NULL_VALUE } func (x *Value) GetNumberValue() float64 { - if x, ok := x.GetKind().(*Value_NumberValue); ok { - return x.NumberValue + if x != nil { + if x, ok := x.Kind.(*Value_NumberValue); ok { + return x.NumberValue + } } return 0 } func (x *Value) GetStringValue() string { - if x, ok := x.GetKind().(*Value_StringValue); ok { - return x.StringValue + if x != nil { + if x, ok := x.Kind.(*Value_StringValue); ok { + return x.StringValue + } } return "" } func (x *Value) GetBoolValue() bool { - if x, ok := x.GetKind().(*Value_BoolValue); ok { - return x.BoolValue + if x != nil { + if x, ok := x.Kind.(*Value_BoolValue); ok { + return x.BoolValue + } } return false } func (x *Value) GetStructValue() *Struct { - if x, ok := x.GetKind().(*Value_StructValue); ok { - return x.StructValue + if x != nil { + if x, ok := x.Kind.(*Value_StructValue); ok { + return x.StructValue + } } return nil } func (x *Value) GetListValue() *ListValue { - if x, ok := x.GetKind().(*Value_ListValue); ok { - return x.ListValue + if x != nil { + if x, ok := x.Kind.(*Value_ListValue); ok { + return x.ListValue + } } return nil } @@ -582,12 +592,11 @@ func (*Value_ListValue) isValue_Kind() {} // // The JSON representation for `ListValue` is JSON array. type ListValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Repeated field of dynamically typed values. - Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` + Values []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // NewList constructs a ListValue from a general-purpose Go slice. diff --git a/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go b/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go index 0d20722d70..9550109aa3 100644 --- a/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/timestamppb/timestamp.pb.go @@ -170,10 +170,7 @@ import ( // http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() // ) to obtain a formatter capable of generating timestamps in this format. type Timestamp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // Represents seconds of UTC time since Unix epoch // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to // 9999-12-31T23:59:59Z inclusive. @@ -182,7 +179,9 @@ type Timestamp struct { // second values with fractions must still have non-negative nanos values // that count forward in time. Must be from 0 to 999,999,999 // inclusive. - Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Now constructs a new Timestamp from the current time. diff --git a/vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go b/vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go index 006060e569..15b424ec12 100644 --- a/vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go +++ b/vendor/google.golang.org/protobuf/types/known/wrapperspb/wrappers.pb.go @@ -54,12 +54,11 @@ import ( // // The JSON representation for `DoubleValue` is JSON number. type DoubleValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The double value. - Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` + Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Double stores v in a new DoubleValue and returns a pointer to it. @@ -108,12 +107,11 @@ func (x *DoubleValue) GetValue() float64 { // // The JSON representation for `FloatValue` is JSON number. type FloatValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The float value. - Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` + Value float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Float stores v in a new FloatValue and returns a pointer to it. @@ -162,12 +160,11 @@ func (x *FloatValue) GetValue() float32 { // // The JSON representation for `Int64Value` is JSON string. type Int64Value struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The int64 value. - Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Int64 stores v in a new Int64Value and returns a pointer to it. @@ -216,12 +213,11 @@ func (x *Int64Value) GetValue() int64 { // // The JSON representation for `UInt64Value` is JSON string. type UInt64Value struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The uint64 value. - Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + Value uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // UInt64 stores v in a new UInt64Value and returns a pointer to it. @@ -270,12 +266,11 @@ func (x *UInt64Value) GetValue() uint64 { // // The JSON representation for `Int32Value` is JSON number. type Int32Value struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The int32 value. - Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + Value int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Int32 stores v in a new Int32Value and returns a pointer to it. @@ -324,12 +319,11 @@ func (x *Int32Value) GetValue() int32 { // // The JSON representation for `UInt32Value` is JSON number. type UInt32Value struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The uint32 value. - Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + Value uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // UInt32 stores v in a new UInt32Value and returns a pointer to it. @@ -378,12 +372,11 @@ func (x *UInt32Value) GetValue() uint32 { // // The JSON representation for `BoolValue` is JSON `true` and `false`. type BoolValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The bool value. - Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + Value bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Bool stores v in a new BoolValue and returns a pointer to it. @@ -432,12 +425,11 @@ func (x *BoolValue) GetValue() bool { // // The JSON representation for `StringValue` is JSON string. type StringValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The string value. - Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // String stores v in a new StringValue and returns a pointer to it. @@ -486,12 +478,11 @@ func (x *StringValue) GetValue() string { // // The JSON representation for `BytesValue` is JSON string. type BytesValue struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // The bytes value. - Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } // Bytes stores v in a new BytesValue and returns a pointer to it. diff --git a/vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go b/vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go index bd291a8c91..653aa78409 100644 --- a/vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go +++ b/vendor/k8s.io/kubectl/pkg/cmd/util/helpers.go @@ -243,7 +243,7 @@ func statusCausesToAggrError(scs []metav1.StatusCause) utilerrors.Aggregate { // commands. func StandardErrorMessage(err error) (string, bool) { if debugErr, ok := err.(debugError); ok { - klog.V(4).Infof(debugErr.DebugError()) + klog.V(4).Info(debugErr.DebugError()) } status, isStatus := err.(apierrors.APIStatus) switch { @@ -430,7 +430,8 @@ const ( OpenAPIV3Patch FeatureGate = "KUBECTL_OPENAPIV3_PATCH" RemoteCommandWebsockets FeatureGate = "KUBECTL_REMOTE_COMMAND_WEBSOCKETS" PortForwardWebsockets FeatureGate = "KUBECTL_PORT_FORWARD_WEBSOCKETS" - DebugCustomProfile FeatureGate = "KUBECTL_DEBUG_CUSTOM_PROFILE" + // DebugCustomProfile should be dropped in 1.34 + DebugCustomProfile FeatureGate = "KUBECTL_DEBUG_CUSTOM_PROFILE" ) // IsEnabled returns true iff environment variable is set to true. @@ -451,10 +452,7 @@ func AddValidateFlags(cmd *cobra.Command) { cmd.Flags().String( "validate", "strict", - `Must be one of: strict (or true), warn, ignore (or false). - "true" or "strict" will use a schema to validate the input and fail the request if invalid. It will perform server side validation if ServerSideFieldValidation is enabled on the api-server, but will fall back to less reliable client-side validation if not. - "warn" will warn about unknown or duplicate fields without blocking the request if server-side field validation is enabled on the API server, and behave as "ignore" otherwise. - "false" or "ignore" will not perform any schema validation, silently dropping any unknown or duplicate fields.`, + `Must be one of: strict (or true), warn, ignore (or false). "true" or "strict" will use a schema to validate the input and fail the request if invalid. It will perform server side validation if ServerSideFieldValidation is enabled on the api-server, but will fall back to less reliable client-side validation if not. "warn" will warn about unknown or duplicate fields without blocking the request if server-side field validation is enabled on the API server, and behave as "ignore" otherwise. "false" or "ignore" will not perform any schema validation, silently dropping any unknown or duplicate fields.`, ) cmd.Flags().Lookup("validate").NoOptDefVal = "strict" @@ -539,10 +537,11 @@ func AddPruningFlags(cmd *cobra.Command, prune *bool, pruneAllowlist *[]string, } } -func AddSubresourceFlags(cmd *cobra.Command, subresource *string, usage string, allowedSubresources ...string) { - cmd.Flags().StringVar(subresource, "subresource", "", fmt.Sprintf("%s Must be one of %v. This flag is beta and may change in the future.", usage, allowedSubresources)) +func AddSubresourceFlags(cmd *cobra.Command, subresource *string, usage string) { + cmd.Flags().StringVar(subresource, "subresource", "", fmt.Sprintf("%s This flag is beta and may change in the future.", usage)) CheckErr(cmd.RegisterFlagCompletionFunc("subresource", func(*cobra.Command, []string, string) ([]string, cobra.ShellCompDirective) { - return allowedSubresources, cobra.ShellCompDirectiveNoFileComp + var commonSubresources = []string{"status", "scale", "resize"} + return commonSubresources, cobra.ShellCompDirectiveNoFileComp })) } diff --git a/vendor/k8s.io/kubectl/pkg/util/i18n/translations/README.md b/vendor/k8s.io/kubectl/pkg/util/i18n/translations/README.md index 6318ffe627..a97180466a 100644 --- a/vendor/k8s.io/kubectl/pkg/util/i18n/translations/README.md +++ b/vendor/k8s.io/kubectl/pkg/util/i18n/translations/README.md @@ -72,7 +72,7 @@ import pkg/i18n translated := i18n.T("Your message in english here") // Get a translated plural string -translated := i18n.T("You had % items", items) +translated := i18n.T("You had %d items", items) // Translated error return i18n.Error("Something bad happened") diff --git a/vendor/k8s.io/kubectl/pkg/util/podutils/podutils.go b/vendor/k8s.io/kubectl/pkg/util/podutils/podutils.go index 642a6d47a7..dfefdef456 100644 --- a/vendor/k8s.io/kubectl/pkg/util/podutils/podutils.go +++ b/vendor/k8s.io/kubectl/pkg/util/podutils/podutils.go @@ -21,6 +21,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/sets" ) // IsPodAvailable returns true if a pod is available; false otherwise. @@ -113,8 +114,8 @@ func (s ByLogging) Less(i, j int) bool { return afterOrZero(podReadyTime(s[j]), podReadyTime(s[i])) } // 5. Pods with containers with higher restart counts < lower restart counts - if maxContainerRestarts(s[i]) != maxContainerRestarts(s[j]) { - return maxContainerRestarts(s[i]) > maxContainerRestarts(s[j]) + if res := compareMaxContainerRestarts(s[i], s[j]); res != nil { + return *res } // 6. older pods < newer pods < empty timestamp pods if !s[i].CreationTimestamp.Equal(&s[j].CreationTimestamp) { @@ -161,8 +162,8 @@ func (s ActivePods) Less(i, j int) bool { return afterOrZero(podReadyTime(s[i]), podReadyTime(s[j])) } // 7. Pods with containers with higher restart counts < lower restart counts - if maxContainerRestarts(s[i]) != maxContainerRestarts(s[j]) { - return maxContainerRestarts(s[i]) > maxContainerRestarts(s[j]) + if res := compareMaxContainerRestarts(s[i], s[j]); res != nil { + return *res } // 8. Empty creation time pods < newer pods < older pods if !s[i].CreationTimestamp.Equal(&s[j].CreationTimestamp) { @@ -190,12 +191,41 @@ func podReadyTime(pod *corev1.Pod) *metav1.Time { return &metav1.Time{} } -func maxContainerRestarts(pod *corev1.Pod) int { - maxRestarts := 0 +func maxContainerRestarts(pod *corev1.Pod) (regularRestarts, sidecarRestarts int) { for _, c := range pod.Status.ContainerStatuses { - maxRestarts = max(maxRestarts, int(c.RestartCount)) + regularRestarts = max(regularRestarts, int(c.RestartCount)) } - return maxRestarts + names := sets.New[string]() + for _, c := range pod.Spec.InitContainers { + if c.RestartPolicy != nil && *c.RestartPolicy == corev1.ContainerRestartPolicyAlways { + names.Insert(c.Name) + } + } + for _, c := range pod.Status.InitContainerStatuses { + if names.Has(c.Name) { + sidecarRestarts = max(sidecarRestarts, int(c.RestartCount)) + } + } + return +} + +// We use *bool here to determine equality: +// true: pi has a higher container restart count. +// false: pj has a higher container restart count. +// nil: Both have the same container restart count. +func compareMaxContainerRestarts(pi *corev1.Pod, pj *corev1.Pod) *bool { + regularRestartsI, sidecarRestartsI := maxContainerRestarts(pi) + regularRestartsJ, sidecarRestartsJ := maxContainerRestarts(pj) + if regularRestartsI != regularRestartsJ { + res := regularRestartsI > regularRestartsJ + return &res + } + // If pods have the same restart count, an attempt is made to compare the restart counts of sidecar containers. + if sidecarRestartsI != sidecarRestartsJ { + res := sidecarRestartsI > sidecarRestartsJ + return &res + } + return nil } // ContainerType and VisitContainers are taken from diff --git a/vendor/k8s.io/kubectl/pkg/util/templates/help_flags_printer.go b/vendor/k8s.io/kubectl/pkg/util/templates/help_flags_printer.go index fdfdf08eeb..b7e1bf00f8 100644 --- a/vendor/k8s.io/kubectl/pkg/util/templates/help_flags_printer.go +++ b/vendor/k8s.io/kubectl/pkg/util/templates/help_flags_printer.go @@ -62,7 +62,7 @@ func (p *HelpFlagPrinter) PrintHelpFlag(flag *flag.Flag) { } appendTabStr := strings.ReplaceAll(wrappedStr, "\n", "\n\t") - fmt.Fprintf(p.out, appendTabStr+"\n\n") + fmt.Fprint(p.out, appendTabStr+"\n\n") } // writeFlag will output the help flag based diff --git a/vendor/k8s.io/utils/clock/testing/fake_clock.go b/vendor/k8s.io/utils/clock/testing/fake_clock.go index 79e11deb65..462c40c2c8 100644 --- a/vendor/k8s.io/utils/clock/testing/fake_clock.go +++ b/vendor/k8s.io/utils/clock/testing/fake_clock.go @@ -48,7 +48,6 @@ type fakeClockWaiter struct { stepInterval time.Duration skipIfBlocked bool destChan chan time.Time - fired bool afterFunc func() } @@ -198,12 +197,10 @@ func (f *FakeClock) setTimeLocked(t time.Time) { if w.skipIfBlocked { select { case w.destChan <- t: - w.fired = true default: } } else { w.destChan <- t - w.fired = true } if w.afterFunc != nil { @@ -305,44 +302,48 @@ func (f *fakeTimer) C() <-chan time.Time { return f.waiter.destChan } -// Stop stops the timer and returns true if the timer has not yet fired, or false otherwise. +// Stop prevents the Timer from firing. It returns true if the call stops the +// timer, false if the timer has already expired or been stopped. func (f *fakeTimer) Stop() bool { f.fakeClock.lock.Lock() defer f.fakeClock.lock.Unlock() + active := false newWaiters := make([]*fakeClockWaiter, 0, len(f.fakeClock.waiters)) for i := range f.fakeClock.waiters { w := f.fakeClock.waiters[i] if w != &f.waiter { newWaiters = append(newWaiters, w) + continue } + // If timer is found, it has not been fired yet. + active = true } f.fakeClock.waiters = newWaiters - return !f.waiter.fired + return active } -// Reset resets the timer to the fake clock's "now" + d. It returns true if the timer has not yet -// fired, or false otherwise. +// Reset changes the timer to expire after duration d. It returns true if the +// timer had been active, false if the timer had expired or been stopped. func (f *fakeTimer) Reset(d time.Duration) bool { f.fakeClock.lock.Lock() defer f.fakeClock.lock.Unlock() - active := !f.waiter.fired + active := false - f.waiter.fired = false f.waiter.targetTime = f.fakeClock.time.Add(d) - var isWaiting bool for i := range f.fakeClock.waiters { w := f.fakeClock.waiters[i] if w == &f.waiter { - isWaiting = true + // If timer is found, it has not been fired yet. + active = true break } } - if !isWaiting { + if !active { f.fakeClock.waiters = append(f.fakeClock.waiters, &f.waiter) } diff --git a/vendor/modules.txt b/vendor/modules.txt index 66401d64cd..196dcaf4be 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -52,10 +52,10 @@ github.com/chai2010/gettext-go github.com/chai2010/gettext-go/mo github.com/chai2010/gettext-go/plural github.com/chai2010/gettext-go/po -# github.com/cilium/charts v0.0.0-20241202171727-5ceb3f5006f9 +# github.com/cilium/charts v0.0.0-20241218153829-9518b30a2027 ## explicit; go 1.17 github.com/cilium/charts -# github.com/cilium/cilium v1.17.0-pre.3.0.20241210085346-6db21de11e49 +# github.com/cilium/cilium v1.17.0-pre.3.0.20250108154004-47bb433883b2 ## explicit; go 1.23.0 github.com/cilium/cilium/api/v1/client github.com/cilium/cilium/api/v1/client/bgp @@ -248,7 +248,7 @@ github.com/cilium/cilium/pkg/u8proto github.com/cilium/cilium/pkg/version github.com/cilium/cilium/pkg/versioncheck github.com/cilium/cilium/pkg/wireguard/types -# github.com/cilium/ebpf v0.16.1-0.20241205185900-f0eec7efba9d +# github.com/cilium/ebpf v0.17.1 ## explicit; go 1.22 github.com/cilium/ebpf github.com/cilium/ebpf/asm @@ -264,7 +264,7 @@ github.com/cilium/ebpf/internal/testutils/fdtrace github.com/cilium/ebpf/internal/tracefs github.com/cilium/ebpf/internal/unix github.com/cilium/ebpf/link -# github.com/cilium/hive v0.0.0-20241205140635-d02f07f3d452 +# github.com/cilium/hive v0.0.0-20241213121623-605c1412b9b3 ## explicit; go 1.21.3 github.com/cilium/hive github.com/cilium/hive/cell @@ -272,7 +272,7 @@ github.com/cilium/hive/internal github.com/cilium/hive/job github.com/cilium/hive/script github.com/cilium/hive/script/internal/diff -# github.com/cilium/proxy v0.0.0-20241115112946-fb67566cbd95 +# github.com/cilium/proxy v0.0.0-20241219105110-b2e1bb5839df ## explicit; go 1.23 github.com/cilium/proxy/go/cilium/api github.com/cilium/proxy/go/envoy/admin/v3 @@ -374,6 +374,7 @@ github.com/cilium/proxy/go/envoy/extensions/filters/http/lua/v3 github.com/cilium/proxy/go/envoy/extensions/filters/http/oauth2/v3 github.com/cilium/proxy/go/envoy/extensions/filters/http/on_demand/v3 github.com/cilium/proxy/go/envoy/extensions/filters/http/original_src/v3 +github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_extraction/v3 github.com/cilium/proxy/go/envoy/extensions/filters/http/proto_message_logging/v3 github.com/cilium/proxy/go/envoy/extensions/filters/http/rate_limit_quota/v3 github.com/cilium/proxy/go/envoy/extensions/filters/http/ratelimit/v3 @@ -398,6 +399,12 @@ github.com/cilium/proxy/go/envoy/extensions/filters/network/dubbo_proxy/router/v github.com/cilium/proxy/go/envoy/extensions/filters/network/dubbo_proxy/v3 github.com/cilium/proxy/go/envoy/extensions/filters/network/echo/v3 github.com/cilium/proxy/go/envoy/extensions/filters/network/ext_authz/v3 +github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/action/v3 +github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3 +github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3 +github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/matcher/v3 +github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/router/v3 +github.com/cilium/proxy/go/envoy/extensions/filters/network/generic_proxy/v3 github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3 github.com/cilium/proxy/go/envoy/extensions/filters/network/local_ratelimit/v3 github.com/cilium/proxy/go/envoy/extensions/filters/network/mongo_proxy/v3 @@ -460,6 +467,7 @@ github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/network/v3 github.com/cilium/proxy/go/envoy/extensions/matching/common_inputs/ssl/v3 github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/consistent_hashing/v3 github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/ip/v3 +github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/metadata/v3 github.com/cilium/proxy/go/envoy/extensions/matching/input_matchers/runtime_fraction/v3 github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/apple/v3 github.com/cilium/proxy/go/envoy/extensions/network/dns_resolver/cares/v3 @@ -479,6 +487,7 @@ github.com/cilium/proxy/go/envoy/extensions/rbac/audit_loggers/stream/v3 github.com/cilium/proxy/go/envoy/extensions/rbac/matchers/upstream_ip_port/v3 github.com/cilium/proxy/go/envoy/extensions/regex_engines/v3 github.com/cilium/proxy/go/envoy/extensions/request_id/uuid/v3 +github.com/cilium/proxy/go/envoy/extensions/resource_monitors/cpu_utilization/v3 github.com/cilium/proxy/go/envoy/extensions/resource_monitors/downstream_connections/v3 github.com/cilium/proxy/go/envoy/extensions/resource_monitors/fixed_heap/v3 github.com/cilium/proxy/go/envoy/extensions/resource_monitors/injected_resource/v3 @@ -528,6 +537,7 @@ github.com/cilium/proxy/go/envoy/service/load_stats/v3 github.com/cilium/proxy/go/envoy/service/metrics/v3 github.com/cilium/proxy/go/envoy/service/rate_limit_quota/v3 github.com/cilium/proxy/go/envoy/service/ratelimit/v3 +github.com/cilium/proxy/go/envoy/service/redis_auth/v3 github.com/cilium/proxy/go/envoy/service/route/v3 github.com/cilium/proxy/go/envoy/service/runtime/v3 github.com/cilium/proxy/go/envoy/service/secret/v3 @@ -543,7 +553,7 @@ github.com/cilium/proxy/go/envoy/type/tracing/v3 github.com/cilium/proxy/go/envoy/type/v3 github.com/cilium/proxy/go/envoy/watchdog/v3 github.com/cilium/proxy/pkg/policy/api/kafka -# github.com/cilium/statedb v0.3.4 +# github.com/cilium/statedb v0.3.5 ## explicit; go 1.23 github.com/cilium/statedb github.com/cilium/statedb/index @@ -578,7 +588,7 @@ github.com/cloudflare/cfssl/signer github.com/cloudflare/cfssl/signer/local github.com/cloudflare/cfssl/signer/remote github.com/cloudflare/cfssl/signer/universal -# github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 +# github.com/cncf/xds/go v0.0.0-20241213214725-57cfbe6fad57 ## explicit; go 1.19 github.com/cncf/xds/go/udpa/annotations github.com/cncf/xds/go/xds/annotations/v3 @@ -646,7 +656,7 @@ github.com/docker/distribution/registry/client/auth/challenge github.com/docker/distribution/registry/client/transport github.com/docker/distribution/registry/storage/cache github.com/docker/distribution/registry/storage/cache/memory -# github.com/docker/docker v27.3.1+incompatible +# github.com/docker/docker v27.4.1+incompatible ## explicit github.com/docker/docker/api/types/filters github.com/docker/docker/api/types/registry @@ -675,8 +685,8 @@ github.com/envoyproxy/protoc-gen-validate/validate # github.com/evanphx/json-patch v5.9.0+incompatible ## explicit github.com/evanphx/json-patch -# github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d -## explicit +# github.com/exponent-io/jsonpath v0.0.0-20210407135951-1de76d718b3f +## explicit; go 1.15 github.com/exponent-io/jsonpath # github.com/fatih/color v1.18.0 ## explicit; go 1.17 @@ -968,7 +978,7 @@ github.com/opencontainers/image-spec/specs-go/v1 github.com/opentracing/opentracing-go github.com/opentracing/opentracing-go/ext github.com/opentracing/opentracing-go/log -# github.com/osrg/gobgp/v3 v3.32.0 +# github.com/osrg/gobgp/v3 v3.33.0 ## explicit; go 1.22.7 github.com/osrg/gobgp/v3/pkg/packet/bgp # github.com/pelletier/go-toml v1.9.5 @@ -1050,7 +1060,7 @@ github.com/sourcegraph/conc/panics github.com/spf13/afero github.com/spf13/afero/internal/common github.com/spf13/afero/mem -# github.com/spf13/cast v1.7.0 +# github.com/spf13/cast v1.7.1 ## explicit; go 1.19 github.com/spf13/cast # github.com/spf13/cobra v1.8.1 @@ -1074,7 +1084,7 @@ github.com/spf13/viper/internal/features # github.com/subosito/gotenv v1.6.0 ## explicit; go 1.18 github.com/subosito/gotenv -# github.com/vishvananda/netlink v1.3.1-0.20241022031324-976bd8de7d81 +# github.com/vishvananda/netlink v1.3.1-0.20241227191253-26ee0e2abe2d ## explicit; go 1.12 github.com/vishvananda/netlink github.com/vishvananda/netlink/nl @@ -1154,13 +1164,17 @@ go.mongodb.org/mongo-driver/bson/bsonrw go.mongodb.org/mongo-driver/bson/bsontype go.mongodb.org/mongo-driver/bson/primitive go.mongodb.org/mongo-driver/x/bsonx/bsoncore +# go.opentelemetry.io/auto/sdk v1.1.0 +## explicit; go 1.22.0 +go.opentelemetry.io/auto/sdk +go.opentelemetry.io/auto/sdk/internal/telemetry # go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 ## explicit; go 1.21 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconvutil -# go.opentelemetry.io/otel v1.32.0 -## explicit; go 1.22 +# go.opentelemetry.io/otel v1.33.0 +## explicit; go 1.22.0 go.opentelemetry.io/otel go.opentelemetry.io/otel/attribute go.opentelemetry.io/otel/baggage @@ -1176,16 +1190,18 @@ go.opentelemetry.io/otel/semconv/v1.17.0/httpconv go.opentelemetry.io/otel/semconv/v1.20.0 go.opentelemetry.io/otel/semconv/v1.21.0 go.opentelemetry.io/otel/semconv/v1.24.0 -# go.opentelemetry.io/otel/metric v1.32.0 -## explicit; go 1.22 +go.opentelemetry.io/otel/semconv/v1.26.0 +# go.opentelemetry.io/otel/metric v1.33.0 +## explicit; go 1.22.0 go.opentelemetry.io/otel/metric go.opentelemetry.io/otel/metric/embedded -# go.opentelemetry.io/otel/trace v1.32.0 -## explicit; go 1.22 +# go.opentelemetry.io/otel/trace v1.33.0 +## explicit; go 1.22.0 go.opentelemetry.io/otel/trace go.opentelemetry.io/otel/trace/embedded -# go.opentelemetry.io/proto/otlp v1.3.1 -## explicit; go 1.17 +go.opentelemetry.io/otel/trace/noop +# go.opentelemetry.io/proto/otlp v1.4.0 +## explicit; go 1.22.7 go.opentelemetry.io/proto/otlp/common/v1 # go.uber.org/dig v1.17.1 ## explicit; go 1.20 @@ -1212,7 +1228,7 @@ go.uber.org/zap/zapgrpc # go4.org/netipx v0.0.0-20231129151722-fdeea329fbba ## explicit; go 1.18 go4.org/netipx -# golang.org/x/crypto v0.31.0 +# golang.org/x/crypto v0.32.0 ## explicit; go 1.20 golang.org/x/crypto/bcrypt golang.org/x/crypto/blowfish @@ -1239,7 +1255,7 @@ golang.org/x/exp/slices golang.org/x/exp/slog golang.org/x/exp/slog/internal golang.org/x/exp/slog/internal/buffer -# golang.org/x/net v0.33.0 +# golang.org/x/net v0.34.0 ## explicit; go 1.18 golang.org/x/net/context/ctxhttp golang.org/x/net/html @@ -1262,13 +1278,13 @@ golang.org/x/oauth2/internal golang.org/x/sync/errgroup golang.org/x/sync/semaphore golang.org/x/sync/singleflight -# golang.org/x/sys v0.28.0 +# golang.org/x/sys v0.29.0 ## explicit; go 1.18 golang.org/x/sys/execabs golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows -# golang.org/x/term v0.27.0 +# golang.org/x/term v0.28.0 ## explicit; go 1.18 golang.org/x/term # golang.org/x/text v0.21.0 @@ -1283,21 +1299,21 @@ golang.org/x/text/secure/bidirule golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm -# golang.org/x/time v0.8.0 +# golang.org/x/time v0.9.0 ## explicit; go 1.18 golang.org/x/time/rate -# golang.org/x/tools v0.28.0 +# golang.org/x/tools v0.29.0 ## explicit; go 1.22.0 golang.org/x/tools/txtar -# google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 +# google.golang.org/genproto/googleapis/api v0.0.0-20241216192217-9240e9c98484 ## explicit; go 1.21 google.golang.org/genproto/googleapis/api google.golang.org/genproto/googleapis/api/annotations google.golang.org/genproto/googleapis/api/expr/v1alpha1 -# google.golang.org/genproto/googleapis/rpc v0.0.0-20241206012308-a4fef0638583 -## explicit; go 1.21 +# google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422 +## explicit; go 1.22 google.golang.org/genproto/googleapis/rpc/status -# google.golang.org/grpc v1.68.1 +# google.golang.org/grpc v1.69.2 ## explicit; go 1.22 google.golang.org/grpc google.golang.org/grpc/attributes @@ -1357,7 +1373,7 @@ google.golang.org/grpc/serviceconfig google.golang.org/grpc/stats google.golang.org/grpc/status google.golang.org/grpc/tap -# google.golang.org/protobuf v1.35.2 +# google.golang.org/protobuf v1.36.2 ## explicit; go 1.21 google.golang.org/protobuf/encoding/protodelim google.golang.org/protobuf/encoding/protojson @@ -1381,6 +1397,7 @@ google.golang.org/protobuf/internal/genid google.golang.org/protobuf/internal/impl google.golang.org/protobuf/internal/order google.golang.org/protobuf/internal/pragma +google.golang.org/protobuf/internal/protolazy google.golang.org/protobuf/internal/set google.golang.org/protobuf/internal/strs google.golang.org/protobuf/internal/version @@ -1412,7 +1429,7 @@ gopkg.in/ini.v1 # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 -# helm.sh/helm/v3 v3.16.3 +# helm.sh/helm/v3 v3.16.4 ## explicit; go 1.22.0 helm.sh/helm/v3/internal/fileutil helm.sh/helm/v3/internal/resolver @@ -1454,7 +1471,7 @@ helm.sh/helm/v3/pkg/strvals helm.sh/helm/v3/pkg/time helm.sh/helm/v3/pkg/time/ctime helm.sh/helm/v3/pkg/uploader -# k8s.io/api v0.32.0-rc.2 +# k8s.io/api v0.32.0 ## explicit; go 1.23.0 k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 @@ -1515,7 +1532,7 @@ k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 k8s.io/api/storagemigration/v1alpha1 -# k8s.io/apiextensions-apiserver v0.32.0-rc.2 +# k8s.io/apiextensions-apiserver v0.32.0 ## explicit; go 1.23.0 k8s.io/apiextensions-apiserver/pkg/apis/apiextensions k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1 @@ -1531,7 +1548,7 @@ k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextension k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1/fake k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1 k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1/fake -# k8s.io/apimachinery v0.32.0-rc.2 +# k8s.io/apimachinery v0.32.0 ## explicit; go 1.23.0 k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/errors @@ -1596,16 +1613,16 @@ k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json k8s.io/apimachinery/third_party/forked/golang/netutil k8s.io/apimachinery/third_party/forked/golang/reflect -# k8s.io/apiserver v0.32.0-rc.2 +# k8s.io/apiserver v0.32.0 ## explicit; go 1.23.0 k8s.io/apiserver/pkg/endpoints/deprecation -# k8s.io/cli-runtime v0.32.0-rc.2 +# k8s.io/cli-runtime v0.32.0 ## explicit; go 1.23.0 k8s.io/cli-runtime/pkg/genericclioptions k8s.io/cli-runtime/pkg/genericiooptions k8s.io/cli-runtime/pkg/printers k8s.io/cli-runtime/pkg/resource -# k8s.io/client-go v0.32.0-rc.2 +# k8s.io/client-go v0.32.0 ## explicit; go 1.23.0 k8s.io/client-go/applyconfigurations k8s.io/client-go/applyconfigurations/admissionregistration/v1 @@ -1832,7 +1849,7 @@ k8s.io/client-go/util/jsonpath k8s.io/client-go/util/keyutil k8s.io/client-go/util/watchlist k8s.io/client-go/util/workqueue -# k8s.io/component-base v0.32.0-rc.2 +# k8s.io/component-base v0.32.0 ## explicit; go 1.23.0 k8s.io/component-base/version # k8s.io/klog/v2 v2.130.1 @@ -1856,8 +1873,8 @@ k8s.io/kube-openapi/pkg/spec3 k8s.io/kube-openapi/pkg/util/proto k8s.io/kube-openapi/pkg/util/proto/validation k8s.io/kube-openapi/pkg/validation/spec -# k8s.io/kubectl v0.31.3 -## explicit; go 1.22.0 +# k8s.io/kubectl v0.32.0 +## explicit; go 1.23.0 k8s.io/kubectl/pkg/cmd/util k8s.io/kubectl/pkg/scheme k8s.io/kubectl/pkg/util @@ -1868,7 +1885,7 @@ k8s.io/kubectl/pkg/util/podutils k8s.io/kubectl/pkg/util/templates k8s.io/kubectl/pkg/util/term k8s.io/kubectl/pkg/validation -# k8s.io/utils v0.0.0-20241104163129-6fe5fd82f078 +# k8s.io/utils v0.0.0-20241210054802-24370beab758 ## explicit; go 1.18 k8s.io/utils/buffer k8s.io/utils/clock @@ -1896,7 +1913,7 @@ oras.land/oras-go/pkg/target # sigs.k8s.io/controller-runtime v0.19.3 ## explicit; go 1.22.0 sigs.k8s.io/controller-runtime/pkg/client/apiutil -# sigs.k8s.io/gateway-api v1.2.0 +# sigs.k8s.io/gateway-api v1.2.1 ## explicit; go 1.22.0 sigs.k8s.io/gateway-api/apis/v1 sigs.k8s.io/gateway-api/apis/v1alpha2 @@ -1983,7 +2000,7 @@ sigs.k8s.io/kustomize/kyaml/yaml/internal/k8sgen/pkg/util/validation/field sigs.k8s.io/kustomize/kyaml/yaml/merge2 sigs.k8s.io/kustomize/kyaml/yaml/schema sigs.k8s.io/kustomize/kyaml/yaml/walk -# sigs.k8s.io/mcs-api v0.1.1-0.20241206165000-e2cb6dc0c753 +# sigs.k8s.io/mcs-api v0.1.1-0.20241217092652-fede3192824f ## explicit; go 1.22.0 sigs.k8s.io/mcs-api/pkg/apis/v1alpha1 sigs.k8s.io/mcs-api/pkg/client/clientset/versioned @@ -2003,5 +2020,4 @@ sigs.k8s.io/structured-merge-diff/v4/value sigs.k8s.io/yaml sigs.k8s.io/yaml/goyaml.v2 sigs.k8s.io/yaml/goyaml.v3 -# go.universe.tf/metallb => github.com/cilium/metallb v0.1.1-0.20220829170633-5d7dfb1129f7 -# sigs.k8s.io/controller-tools => github.com/cilium/controller-tools v0.8.0-2 +# sigs.k8s.io/controller-tools => github.com/cilium/controller-tools v0.16.5-1 diff --git a/vendor/sigs.k8s.io/gateway-api/apis/v1/gatewayclass_types_overrides.go b/vendor/sigs.k8s.io/gateway-api/apis/v1/gatewayclass_types_overrides.go new file mode 100644 index 0000000000..f635084782 --- /dev/null +++ b/vendor/sigs.k8s.io/gateway-api/apis/v1/gatewayclass_types_overrides.go @@ -0,0 +1,59 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "encoding/json" + "errors" +) + +// Below code handles the experimental field breaking change introduced in +// https://github.com/kubernetes-sigs/gateway-api/pull/3200/. +// We are overriding the UnmarshalJSON function to be able to handle cases where +// users had the old version of the GatewayClass CRD applied with SupportedFeatures +// as a list of strings and not list of objects. +// See https://github.com/kubernetes-sigs/gateway-api/issues/3464 +// for more information. + +func (s *SupportedFeature) UnmarshalJSON(data []byte) error { + var oldSupportedFeature oldSupportedFeature + var unmarshalTypeErr *json.UnmarshalTypeError + if err := json.Unmarshal(data, &oldSupportedFeature); err == nil { + s.Name = FeatureName(oldSupportedFeature) + return nil + } else if !errors.As(err, &unmarshalTypeErr) { + // If the error is not a type error, return it + return err + } + + var si supportedFeatureInternal + if err := json.Unmarshal(data, &si); err != nil { + return err + } + s.Name = si.Name + return nil +} + +// This is solely for the purpose of ensuring backward compatibility and +// SHOULD NOT be used elsewhere. +type supportedFeatureInternal struct { + Name FeatureName `json:"name"` +} + +// This is solely for the purpose of ensuring backward compatibility and +// SHOULD NOT be used elsewhere. +type oldSupportedFeature string diff --git a/vendor/sigs.k8s.io/mcs-api/pkg/apis/v1alpha1/serviceexport.go b/vendor/sigs.k8s.io/mcs-api/pkg/apis/v1alpha1/serviceexport.go index 15e4d7ba83..7a0ccee71a 100644 --- a/vendor/sigs.k8s.io/mcs-api/pkg/apis/v1alpha1/serviceexport.go +++ b/vendor/sigs.k8s.io/mcs-api/pkg/apis/v1alpha1/serviceexport.go @@ -29,6 +29,9 @@ type ServiceExport struct { metav1.TypeMeta `json:",inline"` // +optional metav1.ObjectMeta `json:"metadata,omitempty"` + // spec defines the behavior of a ServiceExport. + // +optional + Spec ServiceExportSpec `json:"spec,omitempty"` // status describes the current state of an exported service. // Service configuration comes from the Service that had the same // name and namespace as this ServiceExport. @@ -37,6 +40,16 @@ type ServiceExport struct { Status ServiceExportStatus `json:"status,omitempty"` } +// ServiceExportSpec describes an exported service extra information +type ServiceExportSpec struct { + // exportedLabels describes the labels exported. It is optional for implementation. + // +optional + ExportedLabels map[string]string `json:"exportedLabels,omitempty"` + // exportedAnnotations describes the annotations exported. It is optional for implementation. + // +optional + ExportedAnnotations map[string]string `json:"exportedAnnotations,omitempty"` +} + // ServiceExportStatus contains the current status of an export. type ServiceExportStatus struct { // +optional diff --git a/vendor/sigs.k8s.io/mcs-api/pkg/apis/v1alpha1/zz_generated.deepcopy.go b/vendor/sigs.k8s.io/mcs-api/pkg/apis/v1alpha1/zz_generated.deepcopy.go index 8798548d20..4e6fd4d49f 100644 --- a/vendor/sigs.k8s.io/mcs-api/pkg/apis/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/sigs.k8s.io/mcs-api/pkg/apis/v1alpha1/zz_generated.deepcopy.go @@ -46,6 +46,7 @@ func (in *ServiceExport) DeepCopyInto(out *ServiceExport) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) in.Status.DeepCopyInto(&out.Status) } @@ -99,6 +100,35 @@ func (in *ServiceExportList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ServiceExportSpec) DeepCopyInto(out *ServiceExportSpec) { + *out = *in + if in.ExportedLabels != nil { + in, out := &in.ExportedLabels, &out.ExportedLabels + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.ExportedAnnotations != nil { + in, out := &in.ExportedAnnotations, &out.ExportedAnnotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ServiceExportSpec. +func (in *ServiceExportSpec) DeepCopy() *ServiceExportSpec { + if in == nil { + return nil + } + out := new(ServiceExportSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ServiceExportStatus) DeepCopyInto(out *ServiceExportStatus) { *out = *in

  • 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 z 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%0AR(;3v0GZOdnaqpQi*_Gt!h1;fISFXj5H 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Å|9*J|uzA?LWcm5K|%Ul(8Q{`m8y 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/cilium/charts/cilium-1.15.12.tgz b/vendor/github.com/cilium/charts/cilium-1.15.12.tgz new file mode 100644 index 0000000000000000000000000000000000000000..40563f3fcdfcbb3ba309076f0db150411ba17fb6 GIT binary patch literal 180768 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