name: Report a bug
about: Create a report to help us improve
labels: kind/bug, priority/P2
-assignees: donnadionne
+assignees: veblush
---
name: Request a cleanup
about: Suggest a cleanup in our repository
labels: kind/internal cleanup, priority/P2
-assignees: donnadionne
+assignees: veblush
---
name: Request a feature
about: Suggest an idea for this project
labels: kind/enhancement, priority/P2
-assignees: donnadionne
+assignees: veblush
---
name: Ask a question
about: Ask a question
labels: kind/question, priority/P3
-assignees: donnadionne
+assignees: veblush
---
-->
-@donnadionne
+@veblush
no-else-return,
# NOTE(lidiz): Python 3 make object inheritance default, but not PY2
useless-object-inheritance,
+ # NOTE(sergiitk): yapf compatibility, ref #25071
+ bad-continuation,
no-else-return,
# NOTE(lidiz): Python 3 make object inheritance default, but not PY2
useless-object-inheritance,
+ # NOTE(sergiitk): yapf compatibility, ref #25071
+ bad-continuation,
no-else-return,
# NOTE(lidiz): Python 3 make object inheritance default, but not PY2
useless-object-inheritance,
+ # NOTE(sergiitk): yapf compatibility, ref #25071
+ bad-continuation,
values = {"cpu": "darwin"},
)
+config_setting(
+ name = "use_strict_warning",
+ values = {"define": "use_strict_warning=true"},
+)
+
python_config_settings()
# This should be updated along with build_handwritten.yaml
-g_stands_for = "gecko"
+g_stands_for = "gummybear" # @unused
-core_version = "14.0.0"
+core_version = "15.0.0" # @unused
-version = "1.35.0"
+version = "1.36.0" # @unused
GPR_PUBLIC_HDRS = [
"include/grpc/support/alloc.h",
"grpc_lb_policy_xds_cluster_manager",
"grpc_lb_policy_xds_cluster_resolver",
"grpc_resolver_xds",
+ "grpc_resolver_c2p",
"grpc_xds_server_config_fetcher",
],
},
standalone = True,
deps = [
- "grpc_authorization_engine",
"grpc_common",
"grpc_lb_policy_grpclb_secure",
"grpc_secure",
standalone = True,
deps = [
"grpc++",
- "//src/proto/grpc/status:status_proto",
],
)
"src/core/lib/gprpp/stat_windows.cc",
"src/core/lib/gprpp/thd_posix.cc",
"src/core/lib/gprpp/thd_windows.cc",
+ "src/core/lib/gprpp/time_util.cc",
"src/core/lib/profiling/basic_timers.cc",
"src/core/lib/profiling/stap_timers.cc",
],
"src/core/lib/gprpp/stat.h",
"src/core/lib/gprpp/sync.h",
"src/core/lib/gprpp/thd.h",
+ "src/core/lib/gprpp/time_util.h",
"src/core/lib/profiling/timers.h",
],
external_deps = [
"src/core/lib/iomgr/iomgr.h",
"src/core/lib/iomgr/iomgr_custom.h",
"src/core/lib/iomgr/iomgr_internal.h",
- "src/core/lib/iomgr/iomgr_posix.h",
"src/core/lib/iomgr/is_epollexclusive_available.h",
"src/core/lib/iomgr/load_file.h",
"src/core/lib/iomgr/lockfree_event.h",
deps = [
"envoy_ads_upb",
"envoy_ads_upbdefs",
+ "grpc_authorization_engine",
"grpc_base",
"grpc_client_channel",
"grpc_secure",
"grpc_base",
"grpc_client_channel",
"grpc_lb_address_filtering",
+ "grpc_lb_xds_channel_args",
"grpc_lb_xds_common",
+ "grpc_resolver_fake",
"grpc_xds_client",
],
)
)
grpc_cc_library(
+ name = "grpc_resolver_c2p",
+ srcs = [
+ "src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc",
+ ],
+ language = "c++",
+ deps = [
+ "grpc_base",
+ "grpc_client_channel",
+ "grpc_xds_client",
+ ],
+)
+
+grpc_cc_library(
name = "grpc_secure",
srcs = [
"src/core/lib/http/httpcli_security_connector.cc",
srcs = [
"src/core/lib/security/authorization/authorization_engine.cc",
"src/core/lib/security/authorization/evaluate_args.cc",
+ "src/core/lib/security/authorization/matchers.cc",
],
hdrs = [
"src/core/lib/security/authorization/authorization_engine.h",
"src/core/lib/security/authorization/evaluate_args.h",
+ "src/core/lib/security/authorization/matchers.h",
],
external_deps = [
"absl/container:flat_hash_set",
+ "re2",
],
language = "c++",
deps = [
"src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c",
"src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c",
"src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c",
+ "src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c",
"src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c",
"src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c",
"src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c",
"src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h",
"src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h",
"src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h",
+ "src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h",
"src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h",
"src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h",
"src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h",
":google_api_upb",
":proto_gen_validate_upb",
":udpa_annotations_upb",
- ":udpa_core_upb",
+ ":xds_core_upb",
],
)
"src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c",
+ "src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h",
+ "src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h",
],
external_deps = [
"upb_lib",
- "upb_lib_descriptor",
+ "upb_lib_descriptor_reflection",
"upb_textformat_lib",
],
language = "c++",
":google_api_upbdefs",
":proto_gen_validate_upbdefs",
":udpa_annotations_upbdefs",
- ":udpa_core_upbdefs",
+ ":xds_core_upbdefs",
],
)
],
external_deps = [
"upb_lib",
- "upb_lib_descriptor",
+ "upb_lib_descriptor_reflection",
"upb_textformat_lib",
],
language = "c++",
":google_api_upb",
":proto_gen_validate_upb",
":udpa_annotations_upb",
- ":udpa_core_upb",
+ ":xds_core_upb",
],
)
],
external_deps = [
"upb_lib",
- "upb_lib_descriptor",
+ "upb_lib_descriptor_reflection",
"upb_textformat_lib",
],
language = "c++",
],
external_deps = [
"upb_lib",
- "upb_lib_descriptor",
+ "upb_lib_descriptor_reflection",
"upb_textformat_lib",
],
language = "c++",
],
external_deps = [
"upb_lib",
- "upb_lib_descriptor",
+ "upb_lib_descriptor_reflection",
"upb_textformat_lib",
],
language = "c++",
],
external_deps = [
"upb_lib",
- "upb_lib_descriptor",
+ "upb_lib_descriptor_reflection",
"upb_textformat_lib",
],
language = "c++",
)
grpc_cc_library(
- name = "udpa_core_upb",
+ name = "xds_core_upb",
srcs = [
- "src/core/ext/upb-generated/udpa/core/v1/authority.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/resource.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/authority.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/context_params.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/resource.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c",
],
hdrs = [
- "src/core/ext/upb-generated/udpa/core/v1/authority.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/resource.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/authority.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/context_params.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/resource.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h",
],
external_deps = [
"upb_lib",
)
grpc_cc_library(
- name = "udpa_core_upbdefs",
+ name = "xds_core_upbdefs",
srcs = [
- "src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c",
],
hdrs = [
- "src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h",
],
external_deps = [
"upb_lib",
- "upb_lib_descriptor",
+ "upb_lib_descriptor_reflection",
"upb_textformat_lib",
],
language = "c++",
":google_api_upbdefs",
":proto_gen_validate_upbdefs",
":udpa_annotations_upbdefs",
- ":udpa_core_upb",
+ ":xds_core_upb",
],
)
"src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c",
"src/core/ext/upbdefs-generated/google/api/http.upbdefs.c",
"src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c",
"src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c",
"src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c",
"src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c",
"src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h",
"src/core/ext/upbdefs-generated/google/api/http.upbdefs.h",
"src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h",
"src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h",
"src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h",
"src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h",
],
external_deps = [
"upb_lib",
- "upb_lib_descriptor",
+ "upb_lib_descriptor_reflection",
"upb_textformat_lib",
],
language = "c++",
"src/core/lib/gprpp/thd.h",
"src/core/lib/gprpp/thd_posix.cc",
"src/core/lib/gprpp/thd_windows.cc",
+ "src/core/lib/gprpp/time_util.cc",
+ "src/core/lib/gprpp/time_util.h",
"src/core/lib/profiling/basic_timers.cc",
"src/core/lib/profiling/stap_timers.cc",
"src/core/lib/profiling/timers.h",
"src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc",
"src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc",
"src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h",
+ "src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc",
"src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc",
"src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc",
"src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h",
"src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h",
"src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c",
"src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h",
+ "src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c",
+ "src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h",
"src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c",
"src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h",
"src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c",
"src/core/ext/upb-generated/udpa/annotations/status.upb.h",
"src/core/ext/upb-generated/udpa/annotations/versioning.upb.c",
"src/core/ext/upb-generated/udpa/annotations/versioning.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/authority.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/authority.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/resource.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/resource.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h",
- "src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c",
- "src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h",
"src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c",
"src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h",
"src/core/ext/upb-generated/validate/validate.upb.c",
"src/core/ext/upb-generated/validate/validate.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/authority.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/authority.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/context_params.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/context_params.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/resource.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/resource.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h",
+ "src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c",
+ "src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h",
"src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h",
+ "src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c",
+ "src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c",
"src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h",
"src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c",
"src/core/ext/upbdefs-generated/google/api/http.upbdefs.h",
"src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c",
"src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h",
"src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c",
"src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h",
"src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c",
"src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h",
"src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c",
"src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c",
- "src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h",
"src/core/ext/upbdefs-generated/validate/validate.upbdefs.c",
"src/core/ext/upbdefs-generated/validate/validate.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c",
+ "src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h",
"src/core/ext/xds/certificate_provider_factory.h",
"src/core/ext/xds/certificate_provider_registry.cc",
"src/core/ext/xds/certificate_provider_registry.h",
"src/core/lib/iomgr/iomgr_internal.cc",
"src/core/lib/iomgr/iomgr_internal.h",
"src/core/lib/iomgr/iomgr_posix.cc",
- "src/core/lib/iomgr/iomgr_posix.h",
"src/core/lib/iomgr/iomgr_posix_cfstream.cc",
"src/core/lib/iomgr/iomgr_uv.cc",
"src/core/lib/iomgr/iomgr_windows.cc",
"src/core/lib/security/authorization/authorization_engine.h",
"src/core/lib/security/authorization/evaluate_args.cc",
"src/core/lib/security/authorization/evaluate_args.h",
+ "src/core/lib/security/authorization/matchers.cc",
+ "src/core/lib/security/authorization/matchers.h",
"src/core/lib/security/authorization/mock_cel/activation.h",
"src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h",
"src/core/lib/security/authorization/mock_cel/cel_expression.h",
> cmake --build . --config Release
```
-If you want to build DLLs, run `cmake` with `-DBUILD_SHARED_LIBS=ON`.
+Using gRPC C++ as a DLL is not recommended, but you can still enable it by running `cmake` with `-DBUILD_SHARED_LIBS=ON`.
### Windows, Using Ninja (faster build).
> cmake --build .
```
-If you want to build DLLs, run `cmake` with `-DBUILD_SHARED_LIBS=ON`.
+Using gRPC C++ as a DLL is not recommended, but you can still enable it by running `cmake` with `-DBUILD_SHARED_LIBS=ON`.
+
+### Windows: A note on building shared libs (DLLs)
+
+Windows DLL build is supported at a "best effort" basis and we don't recommend using gRPC C++ as a DLL as there are some known drawbacks around how C++ DLLs work on Windows. For example, there is no stable C++ ABI and you can't safely allocate memory in one DLL, and free it in another etc.
+
+That said, we don't actively prohibit building DLLs on windows (it can be enabled in cmake with `-DBUILD_SHARED_LIBS=ON`), and are free to use the DLL builds
+at your own risk.
+- you've been warned that there are some important drawbacks and some things might not work at all or will be broken in interesting ways.
+- we don't have extensive testing for DLL builds in place (to avoid maintenance costs, increased test duration etc.) so regressions / build breakages might occur
### Dependency management
cmake_minimum_required(VERSION 3.5.1)
set(PACKAGE_NAME "grpc")
-set(PACKAGE_VERSION "1.35.0")
-set(gRPC_CORE_VERSION "14.0.0")
-set(gRPC_CORE_SOVERSION "14")
-set(gRPC_CPP_VERSION "1.35.0")
+set(PACKAGE_VERSION "1.36.0")
+set(gRPC_CORE_VERSION "15.0.0")
+set(gRPC_CORE_SOVERSION "15")
+set(gRPC_CPP_VERSION "1.36.0")
set(gRPC_CPP_SOVERSION "1")
-set(gRPC_CSHARP_VERSION "2.35.0")
+set(gRPC_CSHARP_VERSION "2.36.0")
set(gRPC_CSHARP_SOVERSION "2")
set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}")
src/proto/grpc/testing/xds/v3/ads.proto
)
protobuf_generate_grpc_cpp(
+ src/proto/grpc/testing/xds/v3/aggregate_cluster.proto
+)
+protobuf_generate_grpc_cpp(
src/proto/grpc/testing/xds/v3/base.proto
)
protobuf_generate_grpc_cpp(
add_dependencies(buildtests_cxx codegen_test_minimal)
add_dependencies(buildtests_cxx connection_prefix_bad_client_test)
add_dependencies(buildtests_cxx connectivity_state_test)
+ add_dependencies(buildtests_cxx context_allocator_end2end_test)
add_dependencies(buildtests_cxx context_list_test)
add_dependencies(buildtests_cxx delegating_channel_test)
add_dependencies(buildtests_cxx destroy_grpclb_channel_with_active_connect_stress_test)
add_dependencies(buildtests_cxx lb_load_data_store_test)
add_dependencies(buildtests_cxx linux_system_roots_test)
add_dependencies(buildtests_cxx log_test)
+ add_dependencies(buildtests_cxx matchers_test)
add_dependencies(buildtests_cxx message_allocator_end2end_test)
add_dependencies(buildtests_cxx mock_test)
add_dependencies(buildtests_cxx nonblocking_test)
if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX)
add_dependencies(buildtests_cxx time_jump_test)
endif()
+ add_dependencies(buildtests_cxx time_util_test)
add_dependencies(buildtests_cxx timer_test)
add_dependencies(buildtests_cxx tls_security_connector_test)
add_dependencies(buildtests_cxx too_many_pings_test)
src/core/lib/gprpp/stat_windows.cc
src/core/lib/gprpp/thd_posix.cc
src/core/lib/gprpp/thd_windows.cc
+ src/core/lib/gprpp/time_util.cc
src/core/lib/profiling/basic_timers.cc
src/core/lib/profiling/stap_timers.cc
)
src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc
src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc
+ src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc
src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc
src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc
src/core/ext/filters/client_channel/resolver_registry.cc
src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c
src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c
src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c
+ src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c
src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c
src/core/ext/upb-generated/udpa/annotations/status.upb.c
src/core/ext/upb-generated/udpa/annotations/versioning.upb.c
- src/core/ext/upb-generated/udpa/core/v1/authority.upb.c
- src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c
- src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c
- src/core/ext/upb-generated/udpa/core/v1/resource.upb.c
- src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c
- src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c
src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
src/core/ext/upb-generated/validate/validate.upb.c
+ src/core/ext/upb-generated/xds/core/v3/authority.upb.c
+ src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c
+ src/core/ext/upb-generated/xds/core/v3/context_params.upb.c
+ src/core/ext/upb-generated/xds/core/v3/resource.upb.c
+ src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c
+ src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c
src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c
src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c
src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c
+ src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c
src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c
src/core/ext/upbdefs-generated/google/api/http.upbdefs.c
src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c
src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c
src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c
src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c
src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c
src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c
src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c
- src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c
- src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c
- src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c
- src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c
- src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c
- src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c
src/core/ext/upbdefs-generated/validate/validate.upbdefs.c
+ src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c
+ src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c
+ src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c
+ src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c
+ src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c
+ src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c
src/core/ext/xds/certificate_provider_registry.cc
src/core/ext/xds/certificate_provider_store.cc
src/core/ext/xds/file_watcher_certificate_provider_factory.cc
src/core/lib/json/json_writer.cc
src/core/lib/security/authorization/authorization_engine.cc
src/core/lib/security/authorization/evaluate_args.cc
+ src/core/lib/security/authorization/matchers.cc
src/core/lib/security/context/security_context.cc
src/core/lib/security/credentials/alts/alts_credentials.cc
src/core/lib/security/credentials/alts/check_gcp_environment.cc
endif()
-if(gRPC_BUILD_CODEGEN)
add_library(grpc++_error_details
- ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.pb.cc
- ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.grpc.pb.cc
- ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.pb.h
- ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.grpc.pb.h
src/cpp/util/error_details.cc
)
DESTINATION "${gRPC_INSTALL_INCLUDEDIR}/${_path}"
)
endforeach()
-endif()
-if(gRPC_BUILD_CODEGEN)
if(gRPC_INSTALL)
install(TARGETS grpc++_error_details EXPORT gRPCTargets
)
endif()
-endif()
if(gRPC_BUILD_CODEGEN)
add_library(grpc++_reflection
third_party/upb/upb/table.c
third_party/upb/upb/text_encode.c
third_party/upb/upb/upb.c
- src/core/ext/upb-generated/google/protobuf/any.upb.c
src/core/ext/upb-generated/google/protobuf/descriptor.upb.c
- src/core/ext/upb-generated/google/protobuf/duration.upb.c
- src/core/ext/upb-generated/google/protobuf/empty.upb.c
- src/core/ext/upb-generated/google/protobuf/struct.upb.c
- src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
- src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
- src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c
src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c
)
set_target_properties(upb PROPERTIES
endif()
if(gRPC_BUILD_TESTS)
+add_executable(context_allocator_end2end_test
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/simple_messages.grpc.pb.h
+ test/cpp/end2end/context_allocator_end2end_test.cc
+ test/cpp/end2end/test_service_impl.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(context_allocator_end2end_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(context_allocator_end2end_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ grpc++_test_util
+ grpc_test_util
+ grpc++
+ grpc
+ gpr
+ address_sorting
+ upb
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
add_executable(context_list_test
test/core/transport/chttp2/context_list_test.cc
third_party/googletest/googletest/src/gtest-all.cc
if(gRPC_BUILD_TESTS)
add_executable(error_details_test
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/status/status.grpc.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo_messages.pb.h
endif()
if(gRPC_BUILD_TESTS)
+add_executable(matchers_test
+ test/core/security/matchers_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(matchers_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(matchers_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ grpc_test_util
+ grpc
+ gpr
+ address_sorting
+ upb
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
add_executable(message_allocator_end2end_test
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/echo.grpc.pb.cc
endif()
if(gRPC_BUILD_TESTS)
+add_executable(time_util_test
+ test/core/gprpp/time_util_test.cc
+ third_party/googletest/googletest/src/gtest-all.cc
+ third_party/googletest/googlemock/src/gmock-all.cc
+)
+
+target_include_directories(time_util_test
+ PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
+ ${_gRPC_RE2_INCLUDE_DIR}
+ ${_gRPC_SSL_INCLUDE_DIR}
+ ${_gRPC_UPB_GENERATED_DIR}
+ ${_gRPC_UPB_GRPC_GENERATED_DIR}
+ ${_gRPC_UPB_INCLUDE_DIR}
+ ${_gRPC_ZLIB_INCLUDE_DIR}
+ third_party/googletest/googletest/include
+ third_party/googletest/googletest
+ third_party/googletest/googlemock/include
+ third_party/googletest/googlemock
+ ${_gRPC_PROTO_GENS_DIR}
+)
+
+target_link_libraries(time_util_test
+ ${_gRPC_PROTOBUF_LIBRARIES}
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ grpc_test_util
+ grpc
+ gpr
+ address_sorting
+ upb
+)
+
+
+endif()
+if(gRPC_BUILD_TESTS)
+
add_executable(timer_test
test/cpp/common/timer_test.cc
third_party/googletest/googletest/src/gtest-all.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ads.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ads.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/ads.grpc.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/aggregate_cluster.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/aggregate_cluster.grpc.pb.cc
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/aggregate_cluster.pb.h
+ ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/aggregate_cluster.grpc.pb.h
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.grpc.pb.cc
${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/base.pb.h
Q = @
endif
-CORE_VERSION = 14.0.0
-CPP_VERSION = 1.35.0
-CSHARP_VERSION = 2.35.0
+CORE_VERSION = 15.0.0
+CPP_VERSION = 1.36.0
+CSHARP_VERSION = 2.36.0
CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
SHARED_EXT_CPP = dll
SHARED_EXT_CSHARP = dll
SHARED_PREFIX =
-SHARED_VERSION_CORE = -14
+SHARED_VERSION_CORE = -15
SHARED_VERSION_CPP = -1
SHARED_VERSION_CSHARP = -2
else ifeq ($(SYSTEM),Darwin)
ifeq ($(SYSTEM),Darwin)
$(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBADDRESS_SORTING_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
else
- $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libaddress_sorting.so.14 -o $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBADDRESS_SORTING_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
- $(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).so.14
+ $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libaddress_sorting.so.15 -o $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBADDRESS_SORTING_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+ $(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).so.15
$(Q) ln -sf $(SHARED_PREFIX)address_sorting$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libaddress_sorting$(SHARED_VERSION_CORE).so
endif
endif
src/core/lib/gprpp/stat_windows.cc \
src/core/lib/gprpp/thd_posix.cc \
src/core/lib/gprpp/thd_windows.cc \
+ src/core/lib/gprpp/time_util.cc \
src/core/lib/profiling/basic_timers.cc \
src/core/lib/profiling/stap_timers.cc \
ifeq ($(SYSTEM),Darwin)
$(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGPR_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
else
- $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgpr.so.14 -o $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGPR_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
- $(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).so.14
+ $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgpr.so.15 -o $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGPR_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+ $(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).so.15
$(Q) ln -sf $(SHARED_PREFIX)gpr$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgpr$(SHARED_VERSION_CORE).so
endif
endif
src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc \
src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc \
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \
+ src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc \
src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \
src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc \
src/core/ext/filters/client_channel/resolver_registry.cc \
src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c \
src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c \
src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \
src/core/ext/upb-generated/udpa/annotations/status.upb.c \
src/core/ext/upb-generated/udpa/annotations/versioning.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/authority.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/resource.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c \
src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
src/core/ext/upb-generated/validate/validate.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/authority.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/context_params.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/resource.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c \
src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c \
src/core/ext/upbdefs-generated/google/api/http.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
- src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c \
src/core/ext/upbdefs-generated/validate/validate.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c \
src/core/ext/xds/certificate_provider_registry.cc \
src/core/ext/xds/certificate_provider_store.cc \
src/core/ext/xds/file_watcher_certificate_provider_factory.cc \
src/core/lib/json/json_writer.cc \
src/core/lib/security/authorization/authorization_engine.cc \
src/core/lib/security/authorization/evaluate_args.cc \
+ src/core/lib/security/authorization/matchers.cc \
src/core/lib/security/context/security_context.cc \
src/core/lib/security/credentials/alts/alts_credentials.cc \
src/core/lib/security/credentials/alts/check_gcp_environment.cc \
ifeq ($(SYSTEM),Darwin)
$(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
else
- $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc.so.14 -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
- $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so.14
+ $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc.so.15 -o $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OPENSSL_MERGE_LIBS) $(LDLIBS_SECURE) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+ $(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so.15
$(Q) ln -sf $(SHARED_PREFIX)grpc$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc$(SHARED_VERSION_CORE).so
endif
endif
ifeq ($(SYSTEM),Darwin)
$(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_CSHARP_EXT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
else
- $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_csharp_ext.so.14 -o $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_CSHARP_EXT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
- $(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).so.14
+ $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_csharp_ext.so.15 -o $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_CSHARP_EXT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+ $(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).so.15
$(Q) ln -sf $(SHARED_PREFIX)grpc_csharp_ext$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_csharp_ext$(SHARED_VERSION_CORE).so
endif
endif
ifeq ($(SYSTEM),Darwin)
$(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
else
- $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_unsecure.so.14 -o $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
- $(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).so.14
+ $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libgrpc_unsecure.so.15 -o $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBGRPC_UNSECURE_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+ $(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).so.15
$(Q) ln -sf $(SHARED_PREFIX)grpc_unsecure$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libgrpc_unsecure$(SHARED_VERSION_CORE).so
endif
endif
third_party/boringssl-with-bazel/src/crypto/bio/printf.c \
third_party/boringssl-with-bazel/src/crypto/bio/socket.c \
third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c \
+ third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c \
third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c \
third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c \
third_party/boringssl-with-bazel/src/crypto/buf/buf.c \
third_party/boringssl-with-bazel/src/crypto/conf/conf.c \
third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c \
third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c \
+ third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c \
third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c \
third_party/boringssl-with-bazel/src/crypto/cpu-arm.c \
third_party/boringssl-with-bazel/src/crypto/cpu-intel.c \
third_party/boringssl-with-bazel/src/crypto/crypto.c \
third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c \
third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \
- third_party/boringssl-with-bazel/src/crypto/dh/check.c \
- third_party/boringssl-with-bazel/src/crypto/dh/dh.c \
- third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c \
- third_party/boringssl-with-bazel/src/crypto/dh/params.c \
+ third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c \
+ third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c \
third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \
third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c \
third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c \
+ third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c \
third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c \
third_party/upb/upb/table.c \
third_party/upb/upb/text_encode.c \
third_party/upb/upb/upb.c \
- src/core/ext/upb-generated/google/protobuf/any.upb.c \
src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \
- src/core/ext/upb-generated/google/protobuf/duration.upb.c \
- src/core/ext/upb-generated/google/protobuf/empty.upb.c \
- src/core/ext/upb-generated/google/protobuf/struct.upb.c \
- src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \
- src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \
- src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
- src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
- src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
- src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c \
- src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c \
- src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c \
PUBLIC_HEADERS_C += \
ifeq ($(SYSTEM),Darwin)
$(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -install_name $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) -dynamiclib -o $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBUPB_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
else
- $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libupb.so.14 -o $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBUPB_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
- $(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).so.14
+ $(Q) $(LDXX) $(LDFLAGS) -L$(LIBDIR)/$(CONFIG) -shared -Wl,-soname,libupb.so.15 -o $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBUPB_OBJS) $(ZLIB_MERGE_LIBS) $(CARES_MERGE_LIBS) $(ADDRESS_SORTING_MERGE_LIBS) $(RE2_MERGE_LIBS) $(UPB_MERGE_LIBS) $(GRPC_ABSEIL_MERGE_LIBS) $(LDLIBS)
+ $(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).so.15
$(Q) ln -sf $(SHARED_PREFIX)upb$(SHARED_VERSION_CORE).$(SHARED_EXT_CORE) $(LIBDIR)/$(CONFIG)/libupb$(SHARED_VERSION_CORE).so
endif
endif
src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc: $(OPENSSL_DEP)
src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc: $(OPENSSL_DEP)
src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc: $(OPENSSL_DEP)
+src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc: $(OPENSSL_DEP)
src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc: $(OPENSSL_DEP)
src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc: $(OPENSSL_DEP)
src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/udpa/annotations/status.upb.c: $(OPENSSL_DEP)
src/core/ext/upb-generated/udpa/annotations/versioning.upb.c: $(OPENSSL_DEP)
-src/core/ext/upb-generated/udpa/core/v1/authority.upb.c: $(OPENSSL_DEP)
-src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c: $(OPENSSL_DEP)
-src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c: $(OPENSSL_DEP)
-src/core/ext/upb-generated/udpa/core/v1/resource.upb.c: $(OPENSSL_DEP)
-src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c: $(OPENSSL_DEP)
-src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/xds/core/v3/authority.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/xds/core/v3/context_params.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/xds/core/v3/resource.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/google/api/http.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c: $(OPENSSL_DEP)
-src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c: $(OPENSSL_DEP)
-src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c: $(OPENSSL_DEP)
-src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c: $(OPENSSL_DEP)
-src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c: $(OPENSSL_DEP)
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c: $(OPENSSL_DEP)
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/upbdefs-generated/validate/validate.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c: $(OPENSSL_DEP)
+src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c: $(OPENSSL_DEP)
src/core/ext/xds/certificate_provider_registry.cc: $(OPENSSL_DEP)
src/core/ext/xds/certificate_provider_store.cc: $(OPENSSL_DEP)
src/core/ext/xds/file_watcher_certificate_provider_factory.cc: $(OPENSSL_DEP)
src/core/lib/http/httpcli_security_connector.cc: $(OPENSSL_DEP)
src/core/lib/security/authorization/authorization_engine.cc: $(OPENSSL_DEP)
src/core/lib/security/authorization/evaluate_args.cc: $(OPENSSL_DEP)
+src/core/lib/security/authorization/matchers.cc: $(OPENSSL_DEP)
src/core/lib/security/context/security_context.cc: $(OPENSSL_DEP)
src/core/lib/security/credentials/alts/alts_credentials.cc: $(OPENSSL_DEP)
src/core/lib/security/credentials/alts/check_gcp_environment.cc: $(OPENSSL_DEP)
.headerSearchPath("src/core/ext/upb-generated/"),
.headerSearchPath("src/core/ext/upbdefs-generated/"),
.define("GRPC_ARES", to: "0"),
+ .unsafeFlags(["-Wno-module-import-in-extern-c"]),
]
),
.target(
"src/cpp/server/load_reporter/",
"src/cpp/util/core_stats.cc",
"src/cpp/util/core_stats.h",
- "src/cpp/util/error_details.cc",
],
sources: [
"src/cpp/",
.headerSearchPath("include/"),
.headerSearchPath("third_party/upb/"),
.headerSearchPath("src/core/ext/upb-generated"),
+ .unsafeFlags(["-Wno-module-import-in-extern-c"]),
]
),
],
verbose = ENV['V'] || '0'
grpc_config = ENV['GRPC_CONFIG'] || 'opt'
- ruby_cc_versions = ['3.0.0', '2.7.0', '2.6.0', '2.5.0', '2.4.0', '2.3.0'].join(':')
+ ruby_cc_versions = ['3.0.0', '2.7.0', '2.6.0', '2.5.0', '2.4.0'].join(':')
if RUBY_PLATFORM =~ /darwin/
FileUtils.touch 'grpc_c.32.ruby'
--- /dev/null
+# Security Policy
+
+For information on gRPC Security Policy and reporting potentional security issues, please see [gRPC CVE Process](https://github.com/grpc/proposal/blob/master/P4-grpc-cve-process.md).
--- /dev/null
+# Copyright 2021 the 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.
+
+# This is a list of llvm flags to be used when being built with use_strict_warning=1
+GRPC_LLVM_WARNING_FLAGS = [
+ # Enable all & extra waninrgs
+ "-Wall",
+ "-Wextra",
+ # Consider warnings as errors
+ "-Werror",
+ # Ignore unknown warning flags
+ "-Wno-unknown-warning-option",
+ # A list of flags coming from internal build system
+ "-Wc++20-extensions",
+ "-Wctad-maybe-unsupported",
+ "-Wdeprecated-increment-bool",
+ "-Wfloat-overflow-conversion",
+ "-Wfloat-zero-conversion",
+ "-Wfor-loop-analysis",
+ "-Wformat-security",
+ "-Wgnu-redeclared-enum",
+ "-Winfinite-recursion",
+ "-Wliteral-conversion",
+ "-Wnon-virtual-dtor",
+ "-Woverloaded-virtual",
+ "-Wself-assign",
+ "-Wstring-conversion",
+ "-Wtautological-overlap-compare",
+ "-Wthread-safety-analysis",
+ "-Wthread-safety-beta",
+ "-Wunused-comparison",
+ "-Wvla",
+ # Exceptions but will be removed
+ "-Wno-deprecated-declarations",
+ "-Wno-unused-function",
+]
+
+GRPC_DEFAULT_COPTS = select({
+ "//:use_strict_warning": GRPC_LLVM_WARNING_FLAGS,
+ "//conditions:default": [],
+})
#
load("//bazel:cc_grpc_library.bzl", "cc_grpc_library")
+load("//bazel:copts.bzl", "GRPC_DEFAULT_COPTS")
load("@upb//bazel:upb_proto_library.bzl", "upb_proto_library")
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test")
}),
hdrs = hdrs + public_hdrs,
deps = deps + _get_external_deps(external_deps),
- copts = copts,
+ copts = GRPC_DEFAULT_COPTS + copts,
visibility = visibility,
testonly = testonly,
linkopts = linkopts,
"args": args,
"data": data,
"deps": deps + _get_external_deps(external_deps),
- "copts": copts,
+ "copts": GRPC_DEFAULT_COPTS + copts,
"linkopts": if_not_windows(["-pthread"]),
"size": size,
"timeout": timeout,
testonly = testonly,
linkshared = linkshared,
deps = deps + _get_external_deps(external_deps),
- copts = copts,
+ copts = GRPC_DEFAULT_COPTS + copts,
linkopts = if_not_windows(["-pthread"]) + linkopts,
tags = tags,
features = features,
)
native.bind(
+ name = "upb_lib_descriptor_reflection",
+ actual = "@upb//:descriptor_upb_proto_reflection",
+ )
+
+ native.bind(
name = "upb_textformat_lib",
actual = "@upb//:textformat",
)
name = "boringssl",
# Use github mirror instead of https://boringssl.googlesource.com/boringssl
# to obtain a boringssl archive with consistent sha256
- sha256 = "e8c02bb7043644dc138e422a9a3412108732b6ff30590db4a05664476b209c03",
- strip_prefix = "boringssl-29c6e0e27268f5a43e039cd2ed4e849d6b736fc1",
+ sha256 = "6312f3785ccbbb45f190c1c8877d1b10f41420e3bb65ca5d14b8061621431136",
+ strip_prefix = "boringssl-067cfd92f4d7da0edfa073b096d090b98a83b860",
urls = [
- "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/29c6e0e27268f5a43e039cd2ed4e849d6b736fc1.tar.gz",
- "https://github.com/google/boringssl/archive/29c6e0e27268f5a43e039cd2ed4e849d6b736fc1.tar.gz",
+ "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/067cfd92f4d7da0edfa073b096d090b98a83b860.tar.gz",
+ "https://github.com/google/boringssl/archive/067cfd92f4d7da0edfa073b096d090b98a83b860.tar.gz",
],
)
if "com_google_absl" not in native.existing_rules():
http_archive(
name = "com_google_absl",
- sha256 = "3d74cdc98b42fd4257d91f652575206de195e2c824fcd8d6e6d227f85cb143ef",
- strip_prefix = "abseil-cpp-0f3bb466b868b523cf1dc9b2aaaed65c77b28862",
+ sha256 = "62c27e7a633e965a2f40ff16b487c3b778eae440bab64cad83b34ef1cbe3aa93",
+ strip_prefix = "abseil-cpp-6f9d96a1f41439ac172ee2ef7ccd8edf0e5d068c",
urls = [
- "https://storage.googleapis.com/grpc-bazel-mirror/github.com/abseil/abseil-cpp/archive/0f3bb466b868b523cf1dc9b2aaaed65c77b28862.tar.gz",
- "https://github.com/abseil/abseil-cpp/archive/0f3bb466b868b523cf1dc9b2aaaed65c77b28862.tar.gz",
+ "https://storage.googleapis.com/grpc-bazel-mirror/github.com/abseil/abseil-cpp/archive/6f9d96a1f41439ac172ee2ef7ccd8edf0e5d068c.tar.gz",
+ "https://github.com/abseil/abseil-cpp/archive/6f9d96a1f41439ac172ee2ef7ccd8edf0e5d068c.tar.gz",
],
)
if "envoy_api" not in native.existing_rules():
http_archive(
name = "envoy_api",
- sha256 = "466585f253471259ce17641348149f458270316e81ec6702fdd8bf0b1b681256",
- strip_prefix = "data-plane-api-9997e1137cdb59e622af13e57ca915a2f3c9f84f",
+ sha256 = "6b6376fa5a6e03c617ed029b669013ecf88e7f8b42474436343cbf2540b207ae",
+ strip_prefix = "data-plane-api-9edfeb841b0f8e54816f0b81949f79104072072c",
urls = [
- "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/9997e1137cdb59e622af13e57ca915a2f3c9f84f.tar.gz",
- "https://github.com/envoyproxy/data-plane-api/archive/9997e1137cdb59e622af13e57ca915a2f3c9f84f.tar.gz",
+ "https://github.com/envoyproxy/data-plane-api/archive/9edfeb841b0f8e54816f0b81949f79104072072c.tar.gz",
],
)
sha256 = "aa96a691d3a8177f3215b14b0edc9641787abaaa30363a080165d06ab65e1161",
)
- if "rules_python" not in native.existing_rules():
- http_archive(
- name = "rules_python",
- url = "https://github.com/bazelbuild/rules_python/archive/9d68f24659e8ce8b736590ba1e4418af06ec2552.zip",
- sha256 = "f7402f11691d657161f871e11968a984e5b48b023321935f5a55d7e56cf4758a",
- strip_prefix = "rules_python-9d68f24659e8ce8b736590ba1e4418af06ec2552",
- )
-
python_configure(name = "local_config_python")
native.bind(
http_archive(
name = "cython",
build_file = "@com_github_grpc_grpc//third_party:cython.BUILD",
- sha256 = "d68138a2381afbdd0876c3cb2a22389043fa01c4badede1228ee073032b07a27",
- strip_prefix = "cython-c2b80d87658a8525ce091cbe146cb7eaa29fed5c",
+ sha256 = "e2e38e1f0572ca54d6085df3dec8b607d20e81515fb80215aed19c81e8fe2079",
+ strip_prefix = "cython-0.29.21",
urls = [
- "https://github.com/cython/cython/archive/c2b80d87658a8525ce091cbe146cb7eaa29fed5c.tar.gz",
+ "https://github.com/cython/cython/archive/0.29.21.tar.gz",
],
)
function upload {
local file="$1"
- echo "Downloading https://${file}"
- curl -L --fail --output "${tmpdir}/archive" "https://${file}"
+ if gsutil stat "gs://grpc-bazel-mirror/${file}" > /dev/null
+ then
+ echo "Skipping ${file}"
+ else
+ echo "Downloading https://${file}"
+ curl -L --fail --output "${tmpdir}/archive" "https://${file}"
- echo "Uploading https://${file} to https://storage.googleapis.com/grpc-bazel-mirror/${file}"
- gsutil cp -n "${tmpdir}/archive" "gs://grpc-bazel-mirror/${file}" # "-n" will skip existing files
+ echo "Uploading https://${file} to https://storage.googleapis.com/grpc-bazel-mirror/${file}"
+ gsutil cp "${tmpdir}/archive" "gs://grpc-bazel-mirror/${file}"
- rm -rf "${tmpdir}/archive"
+ rm -rf "${tmpdir}/archive"
+ fi
}
# How to check that all mirror URLs work:
- src/core/lib/gprpp/stat.h
- src/core/lib/gprpp/sync.h
- src/core/lib/gprpp/thd.h
+ - src/core/lib/gprpp/time_util.h
- src/core/lib/profiling/timers.h
src:
- src/core/lib/gpr/alloc.cc
- src/core/lib/gprpp/stat_windows.cc
- src/core/lib/gprpp/thd_posix.cc
- src/core/lib/gprpp/thd_windows.cc
+ - src/core/lib/gprpp/time_util.cc
- src/core/lib/profiling/basic_timers.cc
- src/core/lib/profiling/stap_timers.cc
deps:
- src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h
- src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h
- src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h
+ - src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h
- src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h
- src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h
- src/core/ext/upb-generated/udpa/annotations/status.upb.h
- src/core/ext/upb-generated/udpa/annotations/versioning.upb.h
- - src/core/ext/upb-generated/udpa/core/v1/authority.upb.h
- - src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h
- - src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h
- - src/core/ext/upb-generated/udpa/core/v1/resource.upb.h
- - src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h
- - src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h
- src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h
- src/core/ext/upb-generated/validate/validate.upb.h
+ - src/core/ext/upb-generated/xds/core/v3/authority.upb.h
+ - src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h
+ - src/core/ext/upb-generated/xds/core/v3/context_params.upb.h
+ - src/core/ext/upb-generated/xds/core/v3/resource.upb.h
+ - src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h
+ - src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h
- src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h
+ - src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h
- src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h
- src/core/ext/upbdefs-generated/google/api/http.upbdefs.h
- src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h
- - src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h
- src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h
- src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h
- src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h
- src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h
- src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h
- src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h
- - src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h
- - src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h
- - src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h
- - src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h
- - src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h
- - src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h
- src/core/ext/upbdefs-generated/validate/validate.upbdefs.h
+ - src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h
+ - src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h
+ - src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h
+ - src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h
+ - src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h
+ - src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h
- src/core/ext/xds/certificate_provider_factory.h
- src/core/ext/xds/certificate_provider_registry.h
- src/core/ext/xds/certificate_provider_store.h
- src/core/lib/iomgr/iomgr.h
- src/core/lib/iomgr/iomgr_custom.h
- src/core/lib/iomgr/iomgr_internal.h
- - src/core/lib/iomgr/iomgr_posix.h
- src/core/lib/iomgr/is_epollexclusive_available.h
- src/core/lib/iomgr/load_file.h
- src/core/lib/iomgr/lockfree_event.h
- src/core/lib/json/json_util.h
- src/core/lib/security/authorization/authorization_engine.h
- src/core/lib/security/authorization/evaluate_args.h
+ - src/core/lib/security/authorization/matchers.h
- src/core/lib/security/authorization/mock_cel/activation.h
- src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h
- src/core/lib/security/authorization/mock_cel/cel_expression.h
- src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc
- src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc
- src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc
+ - src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc
- src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc
- src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc
- src/core/ext/filters/client_channel/resolver_registry.cc
- src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c
- src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c
- src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c
+ - src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c
- src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c
- src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c
- src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c
- src/core/ext/upb-generated/udpa/annotations/status.upb.c
- src/core/ext/upb-generated/udpa/annotations/versioning.upb.c
- - src/core/ext/upb-generated/udpa/core/v1/authority.upb.c
- - src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c
- - src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c
- - src/core/ext/upb-generated/udpa/core/v1/resource.upb.c
- - src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c
- - src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c
- src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c
- src/core/ext/upb-generated/validate/validate.upb.c
+ - src/core/ext/upb-generated/xds/core/v3/authority.upb.c
+ - src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c
+ - src/core/ext/upb-generated/xds/core/v3/context_params.upb.c
+ - src/core/ext/upb-generated/xds/core/v3/resource.upb.c
+ - src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c
+ - src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c
- src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c
+ - src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c
- src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c
- src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c
- src/core/ext/upbdefs-generated/google/api/http.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c
- - src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c
- src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c
- src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c
- src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c
- src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c
- - src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c
- - src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c
- - src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c
- - src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c
- - src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c
- - src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c
- src/core/ext/upbdefs-generated/validate/validate.upbdefs.c
+ - src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c
+ - src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c
+ - src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c
+ - src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c
+ - src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c
+ - src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c
- src/core/ext/xds/certificate_provider_registry.cc
- src/core/ext/xds/certificate_provider_store.cc
- src/core/ext/xds/file_watcher_certificate_provider_factory.cc
- src/core/lib/json/json_writer.cc
- src/core/lib/security/authorization/authorization_engine.cc
- src/core/lib/security/authorization/evaluate_args.cc
+ - src/core/lib/security/authorization/matchers.cc
- src/core/lib/security/context/security_context.cc
- src/core/lib/security/credentials/alts/alts_credentials.cc
- src/core/lib/security/credentials/alts/check_gcp_environment.cc
- src/core/lib/iomgr/iomgr.h
- src/core/lib/iomgr/iomgr_custom.h
- src/core/lib/iomgr/iomgr_internal.h
- - src/core/lib/iomgr/iomgr_posix.h
- src/core/lib/iomgr/is_epollexclusive_available.h
- src/core/lib/iomgr/load_file.h
- src/core/lib/iomgr/lockfree_event.h
- include/grpcpp/support/error_details.h
headers: []
src:
- - src/proto/grpc/status/status.proto
- src/cpp/util/error_details.cc
deps:
- grpc++
- gpr
- address_sorting
- upb
+- name: context_allocator_end2end_test
+ gtest: true
+ build: test
+ language: c++
+ headers:
+ - test/cpp/end2end/test_service_impl.h
+ src:
+ - src/proto/grpc/testing/echo.proto
+ - src/proto/grpc/testing/echo_messages.proto
+ - src/proto/grpc/testing/simple_messages.proto
+ - test/cpp/end2end/context_allocator_end2end_test.cc
+ - test/cpp/end2end/test_service_impl.cc
+ deps:
+ - grpc++_test_util
+ - grpc_test_util
+ - grpc++
+ - grpc
+ - gpr
+ - address_sorting
+ - upb
- name: context_list_test
gtest: true
build: test
language: c++
headers: []
src:
+ - src/proto/grpc/status/status.proto
- src/proto/grpc/testing/echo_messages.proto
- test/cpp/util/error_details_test.cc
deps:
- address_sorting
- upb
uses_polling: false
+- name: matchers_test
+ gtest: true
+ build: test
+ language: c++
+ headers: []
+ src:
+ - test/core/security/matchers_test.cc
+ deps:
+ - grpc_test_util
+ - grpc
+ - gpr
+ - address_sorting
+ - upb
- name: message_allocator_end2end_test
gtest: true
build: test
- linux
- posix
- mac
+- name: time_util_test
+ gtest: true
+ build: test
+ language: c++
+ headers: []
+ src:
+ - test/core/gprpp/time_util_test.cc
+ deps:
+ - grpc_test_util
+ - grpc
+ - gpr
+ - address_sorting
+ - upb
+ uses_polling: false
- name: timer_test
gtest: true
build: test
- src/proto/grpc/testing/xds/lrs_for_test.proto
- src/proto/grpc/testing/xds/v3/address.proto
- src/proto/grpc/testing/xds/v3/ads.proto
+ - src/proto/grpc/testing/xds/v3/aggregate_cluster.proto
- src/proto/grpc/testing/xds/v3/base.proto
- src/proto/grpc/testing/xds/v3/cluster.proto
- src/proto/grpc/testing/xds/v3/config_source.proto
# limitations under the License.
module GrpcBuildConfig
- CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-14.dll'
+ CORE_WINDOWS_DLL = '/tmp/libs/opt/grpc-15.dll'
end
'#08': Use "-preN" suffixes to identify pre-release versions
'#09': Per-language overrides are possible with (eg) ruby_version tag here
'#10': See the expand_version.py for all the quirks here
- core_version: 14.0.0
+ core_version: 15.0.0
csharp_major_version: 2
- g_stands_for: gecko
+ g_stands_for: gummybear
protobuf_version: 3.14.0
- version: 1.35.0
+ version: 1.36.0
targets:
- name: check_epollexclusive
build: tool
src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc \
src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc \
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \
+ src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc \
src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \
src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc \
src/core/ext/filters/client_channel/resolver_registry.cc \
src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c \
src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c \
+ src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c \
src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \
src/core/ext/upb-generated/udpa/annotations/status.upb.c \
src/core/ext/upb-generated/udpa/annotations/versioning.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/authority.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/resource.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c \
- src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c \
src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
src/core/ext/upb-generated/validate/validate.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/authority.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/context_params.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/resource.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c \
+ src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c \
src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c \
+ src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c \
- src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c \
src/core/ext/upbdefs-generated/validate/validate.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c \
+ src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c \
src/core/ext/xds/certificate_provider_registry.cc \
src/core/ext/xds/certificate_provider_store.cc \
src/core/ext/xds/file_watcher_certificate_provider_factory.cc \
src/core/lib/gprpp/stat_windows.cc \
src/core/lib/gprpp/thd_posix.cc \
src/core/lib/gprpp/thd_windows.cc \
+ src/core/lib/gprpp/time_util.cc \
src/core/lib/http/format_request.cc \
src/core/lib/http/httpcli.cc \
src/core/lib/http/httpcli_security_connector.cc \
src/core/lib/profiling/stap_timers.cc \
src/core/lib/security/authorization/authorization_engine.cc \
src/core/lib/security/authorization/evaluate_args.cc \
+ src/core/lib/security/authorization/matchers.cc \
src/core/lib/security/context/security_context.cc \
src/core/lib/security/credentials/alts/alts_credentials.cc \
src/core/lib/security/credentials/alts/check_gcp_environment.cc \
third_party/boringssl-with-bazel/src/crypto/bio/printf.c \
third_party/boringssl-with-bazel/src/crypto/bio/socket.c \
third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c \
+ third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c \
third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c \
third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c \
third_party/boringssl-with-bazel/src/crypto/buf/buf.c \
third_party/boringssl-with-bazel/src/crypto/conf/conf.c \
third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c \
third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c \
+ third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c \
third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c \
third_party/boringssl-with-bazel/src/crypto/cpu-arm.c \
third_party/boringssl-with-bazel/src/crypto/cpu-intel.c \
third_party/boringssl-with-bazel/src/crypto/crypto.c \
third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c \
third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \
- third_party/boringssl-with-bazel/src/crypto/dh/check.c \
- third_party/boringssl-with-bazel/src/crypto/dh/dh.c \
- third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c \
- third_party/boringssl-with-bazel/src/crypto/dh/params.c \
+ third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c \
+ third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c \
third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \
third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c \
third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c \
+ third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \
third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c \
third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c \
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns/c_ares)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns/native)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/fake)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/google_c2p)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/sockaddr)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/xds)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_idle)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/rbac/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/route/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/trace/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/cluster/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/health/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/lb/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/annotations)
- PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/core/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/data/orca/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/validate)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/xds/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/annotations)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/cluster/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/listener/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/route/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/config/trace/v3)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/envoy/service/cluster/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/protobuf)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/google/rpc)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/udpa/annotations)
- PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/udpa/core/v1)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/validate)
+ PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upbdefs-generated/xds/core/v3)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/xds)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/avl)
PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/backoff)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/asn1)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/base64)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bio)
+ PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/blake2)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bn_extra)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/buf)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bytestring)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/cmac)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/conf)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/curve25519)
- PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dh)
+ PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dh_extra)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/digest_extra)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dsa)
PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ec_extra)
"src\\core\\ext\\filters\\client_channel\\resolver\\dns\\dns_resolver_selection.cc " +
"src\\core\\ext\\filters\\client_channel\\resolver\\dns\\native\\dns_resolver.cc " +
"src\\core\\ext\\filters\\client_channel\\resolver\\fake\\fake_resolver.cc " +
+ "src\\core\\ext\\filters\\client_channel\\resolver\\google_c2p\\google_c2p_resolver.cc " +
"src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr\\sockaddr_resolver.cc " +
"src\\core\\ext\\filters\\client_channel\\resolver\\xds\\xds_resolver.cc " +
"src\\core\\ext\\filters\\client_channel\\resolver_registry.cc " +
"src\\core\\ext\\upb-generated\\envoy\\config\\route\\v3\\route_components.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\route\\v3\\scoped_route.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\config\\trace\\v3\\http_tracer.upb.c " +
+ "src\\core\\ext\\upb-generated\\envoy\\extensions\\clusters\\aggregate\\v3\\cluster.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3\\http_connection_manager.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\cert.upb.c " +
"src\\core\\ext\\upb-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\common.upb.c " +
"src\\core\\ext\\upb-generated\\udpa\\annotations\\sensitive.upb.c " +
"src\\core\\ext\\upb-generated\\udpa\\annotations\\status.upb.c " +
"src\\core\\ext\\upb-generated\\udpa\\annotations\\versioning.upb.c " +
- "src\\core\\ext\\upb-generated\\udpa\\core\\v1\\authority.upb.c " +
- "src\\core\\ext\\upb-generated\\udpa\\core\\v1\\collection_entry.upb.c " +
- "src\\core\\ext\\upb-generated\\udpa\\core\\v1\\context_params.upb.c " +
- "src\\core\\ext\\upb-generated\\udpa\\core\\v1\\resource.upb.c " +
- "src\\core\\ext\\upb-generated\\udpa\\core\\v1\\resource_locator.upb.c " +
- "src\\core\\ext\\upb-generated\\udpa\\core\\v1\\resource_name.upb.c " +
"src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1\\orca_load_report.upb.c " +
"src\\core\\ext\\upb-generated\\validate\\validate.upb.c " +
+ "src\\core\\ext\\upb-generated\\xds\\core\\v3\\authority.upb.c " +
+ "src\\core\\ext\\upb-generated\\xds\\core\\v3\\collection_entry.upb.c " +
+ "src\\core\\ext\\upb-generated\\xds\\core\\v3\\context_params.upb.c " +
+ "src\\core\\ext\\upb-generated\\xds\\core\\v3\\resource.upb.c " +
+ "src\\core\\ext\\upb-generated\\xds\\core\\v3\\resource_locator.upb.c " +
+ "src\\core\\ext\\upb-generated\\xds\\core\\v3\\resource_name.upb.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\annotations\\deprecation.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\annotations\\resource.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\accesslog\\v3\\accesslog.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\route\\v3\\route_components.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\route\\v3\\scoped_route.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\config\\trace\\v3\\http_tracer.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\clusters\\aggregate\\v3\\cluster.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network\\http_connection_manager\\v3\\http_connection_manager.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\cert.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\transport_sockets\\tls\\v3\\common.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\sensitive.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\status.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\udpa\\annotations\\versioning.upbdefs.c " +
- "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\authority.upbdefs.c " +
- "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\collection_entry.upbdefs.c " +
- "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\context_params.upbdefs.c " +
- "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\resource.upbdefs.c " +
- "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\resource_locator.upbdefs.c " +
- "src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1\\resource_name.upbdefs.c " +
"src\\core\\ext\\upbdefs-generated\\validate\\validate.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\xds\\core\\v3\\authority.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\xds\\core\\v3\\collection_entry.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\xds\\core\\v3\\context_params.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\xds\\core\\v3\\resource.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\xds\\core\\v3\\resource_locator.upbdefs.c " +
+ "src\\core\\ext\\upbdefs-generated\\xds\\core\\v3\\resource_name.upbdefs.c " +
"src\\core\\ext\\xds\\certificate_provider_registry.cc " +
"src\\core\\ext\\xds\\certificate_provider_store.cc " +
"src\\core\\ext\\xds\\file_watcher_certificate_provider_factory.cc " +
"src\\core\\lib\\gprpp\\stat_windows.cc " +
"src\\core\\lib\\gprpp\\thd_posix.cc " +
"src\\core\\lib\\gprpp\\thd_windows.cc " +
+ "src\\core\\lib\\gprpp\\time_util.cc " +
"src\\core\\lib\\http\\format_request.cc " +
"src\\core\\lib\\http\\httpcli.cc " +
"src\\core\\lib\\http\\httpcli_security_connector.cc " +
"src\\core\\lib\\profiling\\stap_timers.cc " +
"src\\core\\lib\\security\\authorization\\authorization_engine.cc " +
"src\\core\\lib\\security\\authorization\\evaluate_args.cc " +
+ "src\\core\\lib\\security\\authorization\\matchers.cc " +
"src\\core\\lib\\security\\context\\security_context.cc " +
"src\\core\\lib\\security\\credentials\\alts\\alts_credentials.cc " +
"src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment.cc " +
"third_party\\boringssl-with-bazel\\src\\crypto\\bio\\printf.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket_helper.c " +
+ "third_party\\boringssl-with-bazel\\src\\crypto\\blake2\\blake2.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\bn_asn1.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\convert.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\buf\\buf.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\conf\\conf.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\cpu-aarch64-fuchsia.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\cpu-aarch64-linux.c " +
+ "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-aarch64-win.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\cpu-arm-linux.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\cpu-arm.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\cpu-intel.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\crypto.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\curve25519.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\spake25519.c " +
- "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\check.c " +
- "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\dh.c " +
- "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\dh_asn1.c " +
- "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\params.c " +
+ "third_party\\boringssl-with-bazel\\src\\crypto\\dh_extra\\dh_asn1.c " +
+ "third_party\\boringssl-with-bazel\\src\\crypto\\dh_extra\\params.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra\\digest_extra.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa_asn1.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\deterministic.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\forkunsafe.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\fuchsia.c " +
+ "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\passive.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\rand_extra.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\windows.c " +
"third_party\\boringssl-with-bazel\\src\\crypto\\rc4\\rc4.c " +
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns\\native");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\fake");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\google_c2p");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\xds");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_idle");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\trace");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\trace\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\clusters");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\clusters\\aggregate");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\clusters\\aggregate\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\extensions\\filters\\network\\http_connection_manager");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\annotations");
- FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\core");
- FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\core\\v1");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\validate");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\xds");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\xds\\core");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\xds\\core\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\annotations");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\trace");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\config\\trace\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\clusters");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\clusters\\aggregate");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\clusters\\aggregate\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\envoy\\extensions\\filters\\network\\http_connection_manager");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\google\\rpc");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa\\annotations");
- FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa\\core");
- FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\udpa\\core\\v1");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\validate");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\xds");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\xds\\core");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upbdefs-generated\\xds\\core\\v3");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\xds");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\avl");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\asn1");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\base64");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bio");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\blake2");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\buf");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bytestring");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\cmac");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\conf");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\curve25519");
- FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dh");
+ FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dh_extra");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dsa");
FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra");
- 1.33 'g' stands for ['geeky'](https://github.com/grpc/grpc/tree/v1.33.x)
- 1.34 'g' stands for ['gauntlet'](https://github.com/grpc/grpc/tree/v1.34.x)
- 1.35 'g' stands for ['gecko'](https://github.com/grpc/grpc/tree/v1.35.x)
+- 1.36 'g' stands for ['gummybear'](https://github.com/grpc/grpc/tree/v1.36.x)
1. UnaryCall RPCs are sent to MIG_default
1. EmptyCall RPCs are sent to MIG_default
-The test driver adds a route for EmptyCall, routes become:
+The test driver changes route and asserts RPCs are sent to expected backends. **Note** that the default route `"/"` is always pointing to MIG_default, so all RPCs not matching the new route will be sent to MIG_default.
-1. path{“/grpc.testing.TestService/EmptyCall”}: MIG_2
-1. “/”: MIG_default
+- {path: `/grpc.testing.TestService/EmptyCall`}: MIG_2
+ - UnaryCall -> MIG_default
+ - EmptyCall -> MIG_2
-Assert:
-
-1. UnaryCall RPCs are sent to MIG_default
-1. EmptyCall RPCs are sent to MIG_2
+- {prefix: `/grpc.testing.TestService/Unary`}: MIG_2
+ - UnaryCall -> MIG_2
+ - EmptyCall -> MIG_default
-The test driver adds a route for prefix Unary, routes become:
+- {prefix: `/grpc.testing.TestService/Unary`}: MIG_default & {path: `/grpc.testing.TestService/EmptyCall`}: MIG_2
+ - UnaryCall -> MIG_default
+ - EmptyCall -> MIG_2
-1. prefix{“/grpc.testing.TestService/Unary”}: MIG_2
-1. “/”: MIG_default
+- {regex: `^\/.*\/UnaryCall$`}: MIG_2
+ - UnaryCall -> MIG_2
+ - EmptyCall -> MIG_default
-Assert:
-
-1. UnaryCall RPCs are sent to MIG_2
-1. EmptyCall RPCs are sent to MIG_default
+- {path: `/gRpC.tEsTinG.tEstseRvice/empTycaLl`, ignoreCase: `True`}: MIG_2
+ - UnaryCall -> MIG_default
+ - EmptyCall -> MIG_2
### header_matching
1. UnaryCall RPCs are sent to MIG_default
1. EmptyCall RPCs are sent to MIG_default
-The test driver adds a route for header exact match, routes become:
+The test driver changes route and asserts RPCs are sent to expected backends. **Note** that the default route `"/"` is always pointing to MIG_default, so all RPCs not matching the new route will be sent to MIG_default.
-1. header{“xds_md”, exact: “exact_match”}: MIG_2
-1. “/”: MIG_default
+- {header `xds_md`, exact: `empty_ytpme`}: MIG_2
+ - Unary -> MIG_default
+ - Empty -> MIG_2
-Assert:
+- {header `xds_md`, prefix: `un`}: MIG_2
+ - `un` is the prefix of metadata sent with UnaryCall
+ - Unary -> MIG_2
+ - Empty -> MIG_default
-1. UnaryCall RPCs are sent to MIG_default
-1. EmptyCall RPCs are sent to MIG_2
+- {header `xds_md`, suffix: `me`}: MIG_2
+ - `me` is the suffix of metadata sent with EmptyCall
+ - Unary -> MIG_default
+ - Empty to MIG_2
+
+- {header `xds_md_numeric`, present: `True`}: MIG_2
+ - Unary is sent with the metadata, so will be sent to alternative
+ - Unary -> MIG_2
+ - Empty -> MIG_default
+
+- {header `xds_md`, exact: `unary_yranu`, invert: `True`}: MIG_2
+ - Unary is sent with the metadata, so this will not match Unary, but will match Empty
+ - Unary -> MIG_default
+ - Empty to MIG_2
+
+- {header `xds_md_numeric`, range `[100,200]`}: MIG_2
+ - Unary is sent with the metadata in range
+ - Unary -> MIG_2
+ - Empty -> MIG_default
+
+- {header `xds_md`, regex: `^em.*me$`}: MIG_2
+ - EmptyCall is sent with the metadata
+ - Unary -> MIG_default
+ - Empty -> MIG_2
### gentle_failover
1. All backends in the primary locality receive at least 1 RPC.
1. No backends in the secondary locality receive RPCs.
+
+### load_based_failover
+
+This test verifies that traffic is partially diverted to a secondary locality
+when the QPS is greater than the configured RPS in the priority locality.
+
+Client parameters:
+
+1. --num_channels=1
+1. --qps=100
+
+Load balancer configuration:
+
+1. The primary MIG with 2 backends in the same zone as the client
+1. The secondary MIG with 2 backends in a different zone
+
+Test driver asserts:
+
+1. All backends in the primary locality receive at least 1 RPC.
+1. No backends in the secondary locality receive RPCs.
+
+The test driver sets `balancingMode` is `RATE`, and `maxRate` to 20 in the primary locality.
+
+Test driver asserts:
+
+1. All backends in the primary locality receive at least 1 RPC.
+1. All backends in the secondary locality receive at least 1 RPC.
+
+The test driver set `maxRate` to 120 in the primary locality.
+
+Test driver asserts:
+
+1. All backends in the primary locality receive at least 1 RPC.
+1. No backends in the secondary locality receive RPCs.
+
+
### circuit_breaking
This test verifies that the maximum number of outstanding requests is limited
Test driver asserts:
-1. After reaching steady state, there are 800 UnaryCall RPCs in-flight.
\ No newline at end of file
+1. After reaching steady state, there are 800 UnaryCall RPCs in-flight.
+
+### timeout
+
+This test verifies that traffic along a route with a `max_stream_duration` set
+will cause timeouts on streams open longer than that duration.
+
+Client parameters:
+
+1. `--num_channels=1`
+1. `--qps=100`
+
+Route Configuration:
+
+Two routes:
+
+1. Path match for `/grpc.testing.TestService/UnaryCall`, with a `route_action`
+ containing `max_stream_duration` of 3 seconds.
+1. Default route containing no `max_stream_duration` setting.
+
+There are four sub-tests:
+
+1. `app_timeout_exceeded`
+ 1. Test client configured to send UnaryCall RPCs with a 1s application
+ timeout, and metadata of `rpc-behavior: sleep-2`.
+ 1. Test driver asserts client recieves ~100% status `DEADLINE_EXCEEDED`.
+1. `timeout_not_exceeded`
+ 1. Test client configured to send UnaryCall RPCs with the default
+ application timeout (20 seconds), and no metadata.
+ 1. Test driver asserts client recieves ~100% status `OK`.
+1. `timeout_exceeded` (executed with the below test case)
+1. `timeout_different_route`
+ 1. Test client configured to send UnaryCall RPCs and EmptyCall RPCs with
+ the default application timeout (20 seconds), and metadata of
+ `rpc-behavior: sleep-4`.
+ 1. Test driver asserts client recieves ~100% status `OK` for EmptyCall
+ and ~100% status `DEADLINE_EXCEEDED` for UnaryCall.
--- /dev/null
+# Copyright 2018 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.
+#
+# cmake build file for C++ route_guide example.
+# Assumes protobuf and gRPC have been installed using cmake.
+# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build
+# that automatically builds all the dependencies before building route_guide.
+
+cmake_minimum_required(VERSION 3.5.1)
+
+set (CMAKE_CXX_STANDARD 11)
+
+if(MSVC)
+ add_definitions(-D_WIN32_WINNT=0x600)
+endif()
+
+find_package(Threads REQUIRED)
+
+if(GRPC_AS_SUBMODULE)
+ # One way to build a projects that uses gRPC is to just include the
+ # entire gRPC project tree via "add_subdirectory".
+ # This approach is very simple to use, but the are some potential
+ # disadvantages:
+ # * it includes gRPC's CMakeLists.txt directly into your build script
+ # without and that can make gRPC's internal setting interfere with your
+ # own build.
+ # * depending on what's installed on your system, the contents of submodules
+ # in gRPC's third_party/* might need to be available (and there might be
+ # additional prerequisites required to build them). Consider using
+ # the gRPC_*_PROVIDER options to fine-tune the expected behavior.
+ #
+ # A more robust approach to add dependency on gRPC is using
+ # cmake's ExternalProject_Add (see cmake_externalproject/CMakeLists.txt).
+
+ # Include the gRPC's cmake build (normally grpc source code would live
+ # in a git submodule called "third_party/grpc", but this example lives in
+ # the same repository as gRPC sources, so we just look a few directories up)
+ add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL)
+ message(STATUS "Using gRPC via add_subdirectory.")
+
+ # After using add_subdirectory, we can now use the grpc targets directly from
+ # this build.
+ set(_PROTOBUF_LIBPROTOBUF libprotobuf)
+ set(_REFLECTION grpc++_reflection)
+ if(CMAKE_CROSSCOMPILING)
+ find_program(_PROTOBUF_PROTOC protoc)
+ else()
+ set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
+ endif()
+ set(_GRPC_GRPCPP grpc++)
+ if(CMAKE_CROSSCOMPILING)
+ find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
+ else()
+ set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)
+ endif()
+elseif(GRPC_FETCHCONTENT)
+ # Another way is to use CMake's FetchContent module to clone gRPC at
+ # configure time. This makes gRPC's source code available to your project,
+ # similar to a git submodule.
+ message(STATUS "Using gRPC via add_subdirectory (FetchContent).")
+ include(FetchContent)
+ FetchContent_Declare(
+ grpc
+ GIT_REPOSITORY https://github.com/grpc/grpc.git
+ # when using gRPC, you will actually set this to an existing tag, such as
+ # v1.25.0, v1.26.0 etc..
+ # For the purpose of testing, we override the tag used to the commit
+ # that's currently under test.
+ GIT_TAG vGRPC_TAG_VERSION_OF_YOUR_CHOICE)
+ FetchContent_MakeAvailable(grpc)
+
+ # Since FetchContent uses add_subdirectory under the hood, we can use
+ # the grpc targets directly from this build.
+ set(_PROTOBUF_LIBPROTOBUF libprotobuf)
+ set(_REFLECTION grpc++_reflection)
+ set(_PROTOBUF_PROTOC $<TARGET_FILE:protoc>)
+ set(_GRPC_GRPCPP grpc++)
+ if(CMAKE_CROSSCOMPILING)
+ find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
+ else()
+ set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)
+ endif()
+else()
+ # This branch assumes that gRPC and all its dependencies are already installed
+ # on this system, so they can be located by find_package().
+
+ # Find Protobuf installation
+ # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation.
+ set(protobuf_MODULE_COMPATIBLE TRUE)
+ find_package(Protobuf CONFIG REQUIRED)
+ message(STATUS "Using protobuf ${Protobuf_VERSION}")
+
+ set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
+ set(_REFLECTION gRPC::grpc++_reflection)
+ if(CMAKE_CROSSCOMPILING)
+ find_program(_PROTOBUF_PROTOC protoc)
+ else()
+ set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
+ endif()
+
+ # Find gRPC installation
+ # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation.
+ find_package(gRPC CONFIG REQUIRED)
+ message(STATUS "Using gRPC ${gRPC_VERSION}")
+
+ set(_GRPC_GRPCPP gRPC::grpc++)
+ if(CMAKE_CROSSCOMPILING)
+ find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
+ else()
+ set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>)
+ endif()
+endif()
-# Copyright 2018 gRPC authors.\r
-#\r
-# Licensed under the Apache License, Version 2.0 (the "License");\r
-# you may not use this file except in compliance with the License.\r
-# You may obtain a copy of the License at\r
-#\r
-# http://www.apache.org/licenses/LICENSE-2.0\r
-#\r
-# Unless required by applicable law or agreed to in writing, software\r
-# distributed under the License is distributed on an "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-# See the License for the specific language governing permissions and\r
-# limitations under the License.\r
-#\r
-# cmake build file for C++ helloworld example.\r
-# Assumes protobuf and gRPC have been installed using cmake.\r
-# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build\r
-# that automatically builds all the dependencies before building helloworld.\r
-\r
-cmake_minimum_required(VERSION 3.5.1)\r
-\r
-project(HelloWorld C CXX)\r
-\r
-if(NOT MSVC)\r
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")\r
-else()\r
- add_definitions(-D_WIN32_WINNT=0x600)\r
-endif()\r
-\r
-find_package(Threads REQUIRED)\r
-\r
-if(GRPC_AS_SUBMODULE)\r
- # One way to build a projects that uses gRPC is to just include the\r
- # entire gRPC project tree via "add_subdirectory".\r
- # This approach is very simple to use, but the are some potential\r
- # disadvantages:\r
- # * it includes gRPC's CMakeLists.txt directly into your build script\r
- # without and that can make gRPC's internal setting interfere with your\r
- # own build.\r
- # * depending on what's installed on your system, the contents of submodules\r
- # in gRPC's third_party/* might need to be available (and there might be\r
- # additional prerequisites required to build them). Consider using\r
- # the gRPC_*_PROVIDER options to fine-tune the expected behavior.\r
- #\r
- # A more robust approach to add dependency on gRPC is using\r
- # cmake's ExternalProject_Add (see cmake_externalproject/CMakeLists.txt).\r
- \r
- # Include the gRPC's cmake build (normally grpc source code would live\r
- # in a git submodule called "third_party/grpc", but this example lives in\r
- # the same repository as gRPC sources, so we just look a few directories up)\r
- add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL)\r
- message(STATUS "Using gRPC via add_subdirectory.")\r
-\r
- # After using add_subdirectory, we can now use the grpc targets directly from\r
- # this build.\r
- set(_PROTOBUF_LIBPROTOBUF libprotobuf)\r
- set(_REFLECTION grpc++_reflection)\r
- if(CMAKE_CROSSCOMPILING)\r
- find_program(_PROTOBUF_PROTOC protoc)\r
- else()\r
- set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)\r
- endif()\r
- set(_GRPC_GRPCPP grpc++)\r
- if(CMAKE_CROSSCOMPILING)\r
- find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)\r
- else()\r
- set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)\r
- endif()\r
-elseif(GRPC_FETCHCONTENT)\r
- # Another way is to use CMake's FetchContent module to clone gRPC at\r
- # configure time. This makes gRPC's source code available to your project,\r
- # similar to a git submodule.\r
- message(STATUS "Using gRPC via add_subdirectory (FetchContent).")\r
- include(FetchContent)\r
- FetchContent_Declare(\r
- grpc\r
- GIT_REPOSITORY https://github.com/grpc/grpc.git\r
- # when using gRPC, you will actually set this to an existing tag, such as\r
- # v1.25.0, v1.26.0 etc..\r
- # For the purpose of testing, we override the tag used to the commit\r
- # that's currently under test.\r
- GIT_TAG vGRPC_TAG_VERSION_OF_YOUR_CHOICE)\r
- FetchContent_MakeAvailable(grpc)\r
-\r
- # Since FetchContent uses add_subdirectory under the hood, we can use\r
- # the grpc targets directly from this build.\r
- set(_PROTOBUF_LIBPROTOBUF libprotobuf)\r
- set(_REFLECTION grpc++_reflection)\r
- set(_PROTOBUF_PROTOC $<TARGET_FILE:protoc>)\r
- set(_GRPC_GRPCPP grpc++)\r
- if(CMAKE_CROSSCOMPILING)\r
- find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)\r
- else()\r
- set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)\r
- endif()\r
-else()\r
- # This branch assumes that gRPC and all its dependencies are already installed\r
- # on this system, so they can be located by find_package().\r
-\r
- # Find Protobuf installation\r
- # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation.\r
- set(protobuf_MODULE_COMPATIBLE TRUE)\r
- find_package(Protobuf CONFIG REQUIRED)\r
- message(STATUS "Using protobuf ${Protobuf_VERSION}")\r
-\r
- set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)\r
- set(_REFLECTION gRPC::grpc++_reflection)\r
- if(CMAKE_CROSSCOMPILING)\r
- find_program(_PROTOBUF_PROTOC protoc)\r
- else()\r
- set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)\r
- endif()\r
-\r
- # Find gRPC installation\r
- # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation.\r
- find_package(gRPC CONFIG REQUIRED)\r
- message(STATUS "Using gRPC ${gRPC_VERSION}")\r
-\r
- set(_GRPC_GRPCPP gRPC::grpc++)\r
- if(CMAKE_CROSSCOMPILING)\r
- find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)\r
- else()\r
- set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>)\r
- endif()\r
-endif()\r
-\r
-# Proto file\r
-get_filename_component(hw_proto "../../protos/helloworld.proto" ABSOLUTE)\r
-get_filename_component(hw_proto_path "${hw_proto}" PATH)\r
-\r
-# Generated sources\r
-set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc")\r
-set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h")\r
-set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc")\r
-set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h")\r
-add_custom_command(\r
- OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}"\r
- COMMAND ${_PROTOBUF_PROTOC}\r
- ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"\r
- --cpp_out "${CMAKE_CURRENT_BINARY_DIR}"\r
- -I "${hw_proto_path}"\r
- --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"\r
- "${hw_proto}"\r
- DEPENDS "${hw_proto}")\r
-\r
-# Include generated *.pb.h files\r
-include_directories("${CMAKE_CURRENT_BINARY_DIR}")\r
-\r
-# Targets greeter_[async_](client|server)\r
-foreach(_target\r
- greeter_client greeter_server\r
- greeter_async_client greeter_async_client2 greeter_async_server)\r
- add_executable(${_target} "${_target}.cc"\r
- ${hw_proto_srcs}\r
- ${hw_grpc_srcs})\r
- target_link_libraries(${_target}\r
- ${_REFLECTION}\r
- ${_GRPC_GRPCPP}\r
- ${_PROTOBUF_LIBPROTOBUF})\r
-endforeach()\r
+# Copyright 2018 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.
+#
+# cmake build file for C++ helloworld example.
+# Assumes protobuf and gRPC have been installed using cmake.
+# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build
+# that automatically builds all the dependencies before building helloworld.
+
+cmake_minimum_required(VERSION 3.5.1)
+
+project(HelloWorld C CXX)
+
+include(../cmake/common.cmake)
+
+# Proto file
+get_filename_component(hw_proto "../../protos/helloworld.proto" ABSOLUTE)
+get_filename_component(hw_proto_path "${hw_proto}" PATH)
+
+# Generated sources
+set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc")
+set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h")
+set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc")
+set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h")
+add_custom_command(
+ OUTPUT "${hw_proto_srcs}" "${hw_proto_hdrs}" "${hw_grpc_srcs}" "${hw_grpc_hdrs}"
+ COMMAND ${_PROTOBUF_PROTOC}
+ ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
+ --cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
+ -I "${hw_proto_path}"
+ --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
+ "${hw_proto}"
+ DEPENDS "${hw_proto}")
+
+# Include generated *.pb.h files
+include_directories("${CMAKE_CURRENT_BINARY_DIR}")
+
+# hw_grpc_proto
+add_library(hw_grpc_proto
+ ${hw_grpc_srcs}
+ ${hw_grpc_hdrs}
+ ${hw_proto_srcs}
+ ${hw_proto_hdrs})
+target_link_libraries(hw_grpc_proto
+ ${_REFLECTION}
+ ${_GRPC_GRPCPP}
+ ${_PROTOBUF_LIBPROTOBUF})
+
+# Targets greeter_[async_](client|server)
+foreach(_target
+ greeter_client greeter_server
+ greeter_async_client greeter_async_client2 greeter_async_server)
+ add_executable(${_target} "${_target}.cc")
+ target_link_libraries(${_target}
+ hw_grpc_proto
+ ${_REFLECTION}
+ ${_GRPC_GRPCPP}
+ ${_PROTOBUF_LIBPROTOBUF})
+endforeach()
--- /dev/null
+# Copyright 2018 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.
+#
+# cmake build file for C++ route_guide example.
+# Assumes protobuf and gRPC have been installed using cmake.
+# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build
+# that automatically builds all the dependencies before building route_guide.
+
+cmake_minimum_required(VERSION 3.5.1)
+
+project(RouteGuide C CXX)
+
+include(../cmake/common.cmake)
+
+# Proto file
+get_filename_component(rg_proto "../../protos/route_guide.proto" ABSOLUTE)
+get_filename_component(rg_proto_path "${rg_proto}" PATH)
+
+# Generated sources
+set(rg_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/route_guide.pb.cc")
+set(rg_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/route_guide.pb.h")
+set(rg_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/route_guide.grpc.pb.cc")
+set(rg_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/route_guide.grpc.pb.h")
+add_custom_command(
+ OUTPUT "${rg_proto_srcs}" "${rg_proto_hdrs}" "${rg_grpc_srcs}" "${rg_grpc_hdrs}"
+ COMMAND ${_PROTOBUF_PROTOC}
+ ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
+ --cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
+ -I "${rg_proto_path}"
+ --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
+ "${rg_proto}"
+ DEPENDS "${rg_proto}")
+
+# Include generated *.pb.h files
+include_directories("${CMAKE_CURRENT_BINARY_DIR}")
+
+# rg_grpc_proto
+add_library(rg_grpc_proto
+ ${rg_grpc_srcs}
+ ${rg_grpc_hdrs}
+ ${rg_proto_srcs}
+ ${rg_proto_hdrs})
+target_link_libraries(rg_grpc_proto
+ ${_REFLECTION}
+ ${_GRPC_GRPCPP}
+ ${_PROTOBUF_LIBPROTOBUF})
+
+# route_guide_helper
+add_library(route_guide_helper
+ "helper.h"
+ "helper.cc")
+target_link_libraries(route_guide_helper
+ rg_grpc_proto
+ ${_REFLECTION}
+ ${_GRPC_GRPCPP}
+ ${_PROTOBUF_LIBPROTOBUF})
+
+# Targets route_guide_(client|server)
+foreach(_target
+ route_guide_client route_guide_server)
+ add_executable(${_target}
+ "${_target}.cc")
+ target_link_libraries(${_target}
+ rg_grpc_proto
+ route_guide_helper
+ ${_REFLECTION}
+ ${_GRPC_GRPCPP}
+ ${_PROTOBUF_LIBPROTOBUF})
+endforeach()
import phone_pb2_grpc
-def create_state_response(call_state: phone_pb2.CallState.State
- ) -> phone_pb2.StreamCallResponse:
+def create_state_response(
+ call_state: phone_pb2.CallState.State) -> phone_pb2.StreamCallResponse:
response = phone_pb2.StreamCallResponse()
response.call_state.state = call_state
return response
def _clean_call_session(self, call_info: phone_pb2.CallInfo) -> None:
logging.info("Call session cleaned [%s]", MessageToJson(call_info))
- def StreamCall(self,
- request_iterator: Iterable[phone_pb2.StreamCallRequest],
- context: grpc.ServicerContext
- ) -> Iterable[phone_pb2.StreamCallResponse]:
+ def StreamCall(
+ self, request_iterator: Iterable[phone_pb2.StreamCallRequest],
+ context: grpc.ServicerContext
+ ) -> Iterable[phone_pb2.StreamCallResponse]:
try:
request = next(request_iterator)
logging.info("Received a phone call request for number [%s]",
self._abort_handler = grpc.unary_unary_rpc_method_handler(abort)
async def intercept_service(
- self, continuation: Callable[[grpc.HandlerCallDetails], Awaitable[
- grpc.RpcMethodHandler]],
+ self, continuation: Callable[[grpc.HandlerCallDetails],
+ Awaitable[grpc.RpcMethodHandler]],
handler_call_details: grpc.HandlerCallDetails
) -> grpc.RpcMethodHandler:
# Example HandlerCallDetails object:
def __init__(self, failure_rate):
self._failure_rate = failure_rate
- async def SayHello(self, request: helloworld_pb2.HelloRequest,
- context: grpc.aio.ServicerContext
- ) -> helloworld_pb2.HelloReply:
+ async def SayHello(
+ self, request: helloworld_pb2.HelloRequest,
+ context: grpc.aio.ServicerContext) -> helloworld_pb2.HelloReply:
if random.random() < self._failure_rate:
context.abort(grpc.StatusCode.UNAVAILABLE,
'Randomly injected failure.')
class Greeter(helloworld_pb2_grpc.GreeterServicer):
- async def SayHello(self, request: helloworld_pb2.HelloRequest,
- context: grpc.aio.ServicerContext
- ) -> helloworld_pb2.HelloReply:
+ async def SayHello(
+ self, request: helloworld_pb2.HelloRequest,
+ context: grpc.aio.ServicerContext) -> helloworld_pb2.HelloReply:
return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
class Greeter(helloworld_pb2_grpc.GreeterServicer):
- async def SayHello(self, request: helloworld_pb2.HelloRequest,
- context: grpc.aio.ServicerContext
- ) -> helloworld_pb2.HelloReply:
+ async def SayHello(
+ self, request: helloworld_pb2.HelloRequest,
+ context: grpc.aio.ServicerContext) -> helloworld_pb2.HelloReply:
return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
# Performs a server-streaming call
-async def guide_list_features(stub: route_guide_pb2_grpc.RouteGuideStub
- ) -> None:
+async def guide_list_features(
+ stub: route_guide_pb2_grpc.RouteGuideStub) -> None:
rectangle = route_guide_pb2.Rectangle(
lo=route_guide_pb2.Point(latitude=400000000, longitude=-750000000),
hi=route_guide_pb2.Point(latitude=420000000, longitude=-730000000))
print(f"Feature called {feature.name} at {feature.location}")
-def generate_route(feature_list: List[route_guide_pb2.Feature]
- ) -> Iterable[route_guide_pb2.Point]:
+def generate_route(
+ feature_list: List[route_guide_pb2.Feature]
+) -> Iterable[route_guide_pb2.Point]:
for _ in range(0, 10):
random_feature = random.choice(feature_list)
print(f"Visiting point {random_feature.location}")
else:
return feature
- async def ListFeatures(self, request: route_guide_pb2.Rectangle,
- unused_context
- ) -> AsyncIterable[route_guide_pb2.Feature]:
+ async def ListFeatures(
+ self, request: route_guide_pb2.Rectangle,
+ unused_context) -> AsyncIterable[route_guide_pb2.Feature]:
left = min(request.lo.longitude, request.hi.longitude)
right = max(request.lo.longitude, request.hi.longitude)
top = max(request.lo.latitude, request.hi.latitude)
feature.location.latitude <= top):
yield feature
- async def RecordRoute(
- self, request_iterator: AsyncIterable[route_guide_pb2.Point],
- unused_context) -> route_guide_pb2.RouteSummary:
+ async def RecordRoute(self, request_iterator: AsyncIterable[
+ route_guide_pb2.Point], unused_context) -> route_guide_pb2.RouteSummary:
point_count = 0
feature_count = 0
distance = 0.0
Pod::Spec.new do |s|
s.name = 'gRPC-C++'
# TODO (mxyan): use version that match gRPC version when pod is stabilized
- version = '1.35.0'
+ version = '1.36.0'
s.version = version
s.summary = 'gRPC C++ library'
s.homepage = 'https://grpc.io'
ss.header_mappings_dir = '.'
ss.dependency "#{s.name}/Interface", version
ss.dependency 'gRPC-Core', version
- abseil_version = '1.20200923.2'
+ abseil_version = '1.20200923.3'
ss.dependency 'abseil/base/base', abseil_version
ss.dependency 'abseil/container/flat_hash_map', abseil_version
ss.dependency 'abseil/container/flat_hash_set', abseil_version
'src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h',
'src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h',
'src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h',
'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h',
'src/core/ext/upb-generated/udpa/annotations/status.upb.h',
'src/core/ext/upb-generated/udpa/annotations/versioning.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/authority.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h',
'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
'src/core/ext/upb-generated/validate/validate.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/authority.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/context_params.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h',
'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h',
'src/core/ext/upbdefs-generated/validate/validate.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h',
'src/core/ext/xds/certificate_provider_factory.h',
'src/core/ext/xds/certificate_provider_registry.h',
'src/core/ext/xds/certificate_provider_store.h',
'src/core/lib/gprpp/stat.h',
'src/core/lib/gprpp/sync.h',
'src/core/lib/gprpp/thd.h',
+ 'src/core/lib/gprpp/time_util.h',
'src/core/lib/http/format_request.h',
'src/core/lib/http/httpcli.h',
'src/core/lib/http/parser.h',
'src/core/lib/iomgr/iomgr.h',
'src/core/lib/iomgr/iomgr_custom.h',
'src/core/lib/iomgr/iomgr_internal.h',
- 'src/core/lib/iomgr/iomgr_posix.h',
'src/core/lib/iomgr/is_epollexclusive_available.h',
'src/core/lib/iomgr/load_file.h',
'src/core/lib/iomgr/lockfree_event.h',
'src/core/lib/profiling/timers.h',
'src/core/lib/security/authorization/authorization_engine.h',
'src/core/lib/security/authorization/evaluate_args.h',
+ 'src/core/lib/security/authorization/matchers.h',
'src/core/lib/security/authorization/mock_cel/activation.h',
'src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h',
'src/core/lib/security/authorization/mock_cel/cel_expression.h',
'src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h',
'src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h',
'src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h',
'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h',
'src/core/ext/upb-generated/udpa/annotations/status.upb.h',
'src/core/ext/upb-generated/udpa/annotations/versioning.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/authority.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h',
'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
'src/core/ext/upb-generated/validate/validate.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/authority.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/context_params.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h',
'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h',
'src/core/ext/upbdefs-generated/validate/validate.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h',
'src/core/ext/xds/certificate_provider_factory.h',
'src/core/ext/xds/certificate_provider_registry.h',
'src/core/ext/xds/certificate_provider_store.h',
'src/core/lib/gprpp/stat.h',
'src/core/lib/gprpp/sync.h',
'src/core/lib/gprpp/thd.h',
+ 'src/core/lib/gprpp/time_util.h',
'src/core/lib/http/format_request.h',
'src/core/lib/http/httpcli.h',
'src/core/lib/http/parser.h',
'src/core/lib/iomgr/iomgr.h',
'src/core/lib/iomgr/iomgr_custom.h',
'src/core/lib/iomgr/iomgr_internal.h',
- 'src/core/lib/iomgr/iomgr_posix.h',
'src/core/lib/iomgr/is_epollexclusive_available.h',
'src/core/lib/iomgr/load_file.h',
'src/core/lib/iomgr/lockfree_event.h',
'src/core/lib/profiling/timers.h',
'src/core/lib/security/authorization/authorization_engine.h',
'src/core/lib/security/authorization/evaluate_args.h',
+ 'src/core/lib/security/authorization/matchers.h',
'src/core/lib/security/authorization/mock_cel/activation.h',
'src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h',
'src/core/lib/security/authorization/mock_cel/cel_expression.h',
end
s.prepare_command = <<-END_OF_COMMAND
- sed -E -i '' 's;#include <openssl/(.*)>;#if COCOAPODS==1\\\n #include <openssl_grpc/\\1>\\\n#else\\\n #include <openssl/\\1>\\\n#endif;g' $(find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print | xargs grep -H -c '#include <openssl_grpc/' | grep 0$ | cut -d':' -f1)
+ find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include <openssl/(.*)>;#if COCOAPODS==1\\\n #include <openssl_grpc/\\1>\\\n#else\\\n #include <openssl/\\1>\\\n#endif;g'
find third_party/upb/ -type f \\( -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include "third_party/(.*)";#if COCOAPODS==1\\\n #include "third_party/upb/third_party/\\1"\\\n#else\\\n #include "third_party/\\1"\\\n#endif;g'
find src/core/ src/cpp/ third_party/upb/ -type f \\( -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include "upb/(.*)";#if COCOAPODS==1\\\n #include "third_party/upb/upb/\\1"\\\n#else\\\n #include "upb/\\1"\\\n#endif;g'
find src/core/ src/cpp/ third_party/upb/ -type f -name '*.grpc_back' -print0 | xargs -0 rm
Pod::Spec.new do |s|
s.name = 'gRPC-Core'
- version = '1.35.0'
+ version = '1.36.0'
s.version = version
s.summary = 'Core cross-platform gRPC library, written in C'
s.homepage = 'https://grpc.io'
s.requires_arc = false
name = 'grpc'
- abseil_version = '1.20200923.2'
+ abseil_version = '1.20200923.3'
# When creating a dynamic framework, name it grpc.framework instead of gRPC-Core.framework.
# This lets users write their includes like `#include <grpc/grpc.h>` as opposed to `#include
ss.header_mappings_dir = '.'
ss.libraries = 'z'
ss.dependency "#{s.name}/Interface", version
- ss.dependency 'BoringSSL-GRPC', '0.0.14'
+ ss.dependency 'BoringSSL-GRPC', '0.0.16'
ss.dependency 'abseil/base/base', abseil_version
ss.dependency 'abseil/container/flat_hash_map', abseil_version
ss.dependency 'abseil/container/flat_hash_set', abseil_version
'src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h',
+ 'src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc',
'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc',
'src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc',
'src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h',
'src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h',
'src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c',
'src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c',
'src/core/ext/upb-generated/udpa/annotations/status.upb.h',
'src/core/ext/upb-generated/udpa/annotations/versioning.upb.c',
'src/core/ext/upb-generated/udpa/annotations/versioning.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/authority.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/authority.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/resource.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h',
'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
'src/core/ext/upb-generated/validate/validate.upb.c',
'src/core/ext/upb-generated/validate/validate.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/authority.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/authority.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/context_params.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/context_params.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/resource.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h',
'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c',
'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c',
'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h',
'src/core/ext/upbdefs-generated/validate/validate.upbdefs.c',
'src/core/ext/upbdefs-generated/validate/validate.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h',
'src/core/ext/xds/certificate_provider_factory.h',
'src/core/ext/xds/certificate_provider_registry.cc',
'src/core/ext/xds/certificate_provider_registry.h',
'src/core/lib/gprpp/thd.h',
'src/core/lib/gprpp/thd_posix.cc',
'src/core/lib/gprpp/thd_windows.cc',
+ 'src/core/lib/gprpp/time_util.cc',
+ 'src/core/lib/gprpp/time_util.h',
'src/core/lib/http/format_request.cc',
'src/core/lib/http/format_request.h',
'src/core/lib/http/httpcli.cc',
'src/core/lib/iomgr/iomgr_internal.cc',
'src/core/lib/iomgr/iomgr_internal.h',
'src/core/lib/iomgr/iomgr_posix.cc',
- 'src/core/lib/iomgr/iomgr_posix.h',
'src/core/lib/iomgr/iomgr_posix_cfstream.cc',
'src/core/lib/iomgr/iomgr_uv.cc',
'src/core/lib/iomgr/iomgr_windows.cc',
'src/core/lib/security/authorization/authorization_engine.h',
'src/core/lib/security/authorization/evaluate_args.cc',
'src/core/lib/security/authorization/evaluate_args.h',
+ 'src/core/lib/security/authorization/matchers.cc',
+ 'src/core/lib/security/authorization/matchers.h',
'src/core/lib/security/authorization/mock_cel/activation.h',
'src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h',
'src/core/lib/security/authorization/mock_cel/cel_expression.h',
'src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h',
'src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h',
'src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h',
+ 'src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h',
'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h',
'src/core/ext/upb-generated/udpa/annotations/status.upb.h',
'src/core/ext/upb-generated/udpa/annotations/versioning.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/authority.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h',
'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h',
'src/core/ext/upb-generated/validate/validate.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/authority.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/context_params.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h',
'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h',
'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h',
'src/core/ext/upbdefs-generated/validate/validate.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h',
'src/core/ext/xds/certificate_provider_factory.h',
'src/core/ext/xds/certificate_provider_registry.h',
'src/core/ext/xds/certificate_provider_store.h',
'src/core/lib/gprpp/stat.h',
'src/core/lib/gprpp/sync.h',
'src/core/lib/gprpp/thd.h',
+ 'src/core/lib/gprpp/time_util.h',
'src/core/lib/http/format_request.h',
'src/core/lib/http/httpcli.h',
'src/core/lib/http/parser.h',
'src/core/lib/iomgr/iomgr.h',
'src/core/lib/iomgr/iomgr_custom.h',
'src/core/lib/iomgr/iomgr_internal.h',
- 'src/core/lib/iomgr/iomgr_posix.h',
'src/core/lib/iomgr/is_epollexclusive_available.h',
'src/core/lib/iomgr/load_file.h',
'src/core/lib/iomgr/lockfree_event.h',
'src/core/lib/profiling/timers.h',
'src/core/lib/security/authorization/authorization_engine.h',
'src/core/lib/security/authorization/evaluate_args.h',
+ 'src/core/lib/security/authorization/matchers.h',
'src/core/lib/security/authorization/mock_cel/activation.h',
'src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h',
'src/core/lib/security/authorization/mock_cel/cel_expression.h',
# TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path?
s.prepare_command = <<-END_OF_COMMAND
- sed -E -i '' 's;#include <openssl/(.*)>;#if COCOAPODS==1\\\n #include <openssl_grpc/\\1>\\\n#else\\\n #include <openssl/\\1>\\\n#endif;g' $(find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print | xargs grep -H -c '#include <openssl_grpc/' | grep 0$ | cut -d':' -f1)
+ find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include <openssl/(.*)>;#if COCOAPODS==1\\\n #include <openssl_grpc/\\1>\\\n#else\\\n #include <openssl/\\1>\\\n#endif;g'
find third_party/upb/ -type f \\( -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include "third_party/(.*)";#if COCOAPODS==1\\\n #include "third_party/upb/third_party/\\1"\\\n#else\\\n #include "third_party/\\1"\\\n#endif;g'
find src/core/ src/cpp/ third_party/upb/ -type f \\( -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include "upb/(.*)";#if COCOAPODS==1\\\n #include "third_party/upb/upb/\\1"\\\n#else\\\n #include "upb/\\1"\\\n#endif;g'
find src/core/ src/cpp/ third_party/upb/ -type f -name '*.grpc_back' -print0 | xargs -0 rm
Pod::Spec.new do |s|
s.name = 'gRPC-ProtoRPC'
- version = '1.35.0'
+ version = '1.36.0'
s.version = version
s.summary = 'RPC library for Protocol Buffers, based on gRPC'
s.homepage = 'https://grpc.io'
Pod::Spec.new do |s|
s.name = 'gRPC-RxLibrary'
- version = '1.35.0'
+ version = '1.36.0'
s.version = version
s.summary = 'Reactive Extensions library for iOS/OSX.'
s.homepage = 'https://grpc.io'
Pod::Spec.new do |s|
s.name = 'gRPC'
- version = '1.35.0'
+ version = '1.36.0'
s.version = version
s.summary = 'gRPC client library for iOS/OSX'
s.homepage = 'https://grpc.io'
s.description = 'Send RPCs from Ruby using GRPC'
s.license = 'Apache-2.0'
- s.required_ruby_version = '>= 2.3.0'
+ s.required_ruby_version = '>= 2.4.0'
s.files = %w( Makefile .yardopts )
s.files += %w( etc/roots.pem )
s.files += %w( src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc )
s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc )
s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h )
+ s.files += %w( src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc )
s.files += %w( src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc )
s.files += %w( src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc )
s.files += %w( src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c )
+ s.files += %w( src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h )
s.files += %w( src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c )
s.files += %w( src/core/ext/upb-generated/udpa/annotations/status.upb.h )
s.files += %w( src/core/ext/upb-generated/udpa/annotations/versioning.upb.c )
s.files += %w( src/core/ext/upb-generated/udpa/annotations/versioning.upb.h )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/authority.upb.c )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/authority.upb.h )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/resource.upb.c )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/resource.upb.h )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c )
- s.files += %w( src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h )
s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c )
s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h )
s.files += %w( src/core/ext/upb-generated/validate/validate.upb.c )
s.files += %w( src/core/ext/upb-generated/validate/validate.upb.h )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/authority.upb.c )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/authority.upb.h )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/context_params.upb.c )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/context_params.upb.h )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/resource.upb.c )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/resource.upb.h )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c )
+ s.files += %w( src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c )
- s.files += %w( src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h )
s.files += %w( src/core/ext/upbdefs-generated/validate/validate.upbdefs.c )
s.files += %w( src/core/ext/upbdefs-generated/validate/validate.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c )
+ s.files += %w( src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h )
s.files += %w( src/core/ext/xds/certificate_provider_factory.h )
s.files += %w( src/core/ext/xds/certificate_provider_registry.cc )
s.files += %w( src/core/ext/xds/certificate_provider_registry.h )
s.files += %w( src/core/lib/gprpp/thd.h )
s.files += %w( src/core/lib/gprpp/thd_posix.cc )
s.files += %w( src/core/lib/gprpp/thd_windows.cc )
+ s.files += %w( src/core/lib/gprpp/time_util.cc )
+ s.files += %w( src/core/lib/gprpp/time_util.h )
s.files += %w( src/core/lib/http/format_request.cc )
s.files += %w( src/core/lib/http/format_request.h )
s.files += %w( src/core/lib/http/httpcli.cc )
s.files += %w( src/core/lib/iomgr/iomgr_internal.cc )
s.files += %w( src/core/lib/iomgr/iomgr_internal.h )
s.files += %w( src/core/lib/iomgr/iomgr_posix.cc )
- s.files += %w( src/core/lib/iomgr/iomgr_posix.h )
s.files += %w( src/core/lib/iomgr/iomgr_posix_cfstream.cc )
s.files += %w( src/core/lib/iomgr/iomgr_uv.cc )
s.files += %w( src/core/lib/iomgr/iomgr_windows.cc )
s.files += %w( src/core/lib/security/authorization/authorization_engine.h )
s.files += %w( src/core/lib/security/authorization/evaluate_args.cc )
s.files += %w( src/core/lib/security/authorization/evaluate_args.h )
+ s.files += %w( src/core/lib/security/authorization/matchers.cc )
+ s.files += %w( src/core/lib/security/authorization/matchers.h )
s.files += %w( src/core/lib/security/authorization/mock_cel/activation.h )
s.files += %w( src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h )
s.files += %w( src/core/lib/security/authorization/mock_cel/cel_expression.h )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/printf.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c )
+ s.files += %w( third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/buf/buf.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/internal.h )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c )
+ s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.h )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c )
- s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/check.c )
- s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/dh.c )
- s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c )
- s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/params.c )
+ s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c )
+ s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h )
+ s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c )
+ s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c )
+ s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c )
s.files += %w( third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c )
s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/base.h )
s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/base64.h )
s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bio.h )
+ s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/blake2.h )
s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/blowfish.h )
s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bn.h )
s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/buf.h )
'src/core/lib/gprpp/stat_windows.cc',
'src/core/lib/gprpp/thd_posix.cc',
'src/core/lib/gprpp/thd_windows.cc',
+ 'src/core/lib/gprpp/time_util.cc',
'src/core/lib/profiling/basic_timers.cc',
'src/core/lib/profiling/stap_timers.cc',
],
'src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc',
'src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
+ 'src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc',
'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc',
'src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc',
'src/core/ext/filters/client_channel/resolver_registry.cc',
'src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c',
'src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c',
'src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c',
'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c',
'src/core/ext/upb-generated/udpa/annotations/status.upb.c',
'src/core/ext/upb-generated/udpa/annotations/versioning.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/authority.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/resource.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c',
'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
'src/core/ext/upb-generated/validate/validate.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/authority.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/context_params.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/resource.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c',
'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c',
'src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c',
'src/core/ext/upbdefs-generated/google/api/http.upbdefs.c',
'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c',
- 'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c',
'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c',
'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c',
'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c',
'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c',
'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c',
'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c',
'src/core/ext/upbdefs-generated/validate/validate.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c',
'src/core/ext/xds/certificate_provider_registry.cc',
'src/core/ext/xds/certificate_provider_store.cc',
'src/core/ext/xds/file_watcher_certificate_provider_factory.cc',
'src/core/lib/json/json_writer.cc',
'src/core/lib/security/authorization/authorization_engine.cc',
'src/core/lib/security/authorization/evaluate_args.cc',
+ 'src/core/lib/security/authorization/matchers.cc',
'src/core/lib/security/context/security_context.cc',
'src/core/lib/security/credentials/alts/alts_credentials.cc',
'src/core/lib/security/credentials/alts/check_gcp_environment.cc',
'upb',
],
'sources': [
- 'src/proto/grpc/status/status.proto',
'src/cpp/util/error_details.cc',
],
},
'third_party/boringssl-with-bazel/src/crypto/bio/printf.c',
'third_party/boringssl-with-bazel/src/crypto/bio/socket.c',
'third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c',
+ 'third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c',
'third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c',
'third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c',
'third_party/boringssl-with-bazel/src/crypto/buf/buf.c',
'third_party/boringssl-with-bazel/src/crypto/conf/conf.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c',
+ 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-arm.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-intel.c',
'third_party/boringssl-with-bazel/src/crypto/crypto.c',
'third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c',
'third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c',
- 'third_party/boringssl-with-bazel/src/crypto/dh/check.c',
- 'third_party/boringssl-with-bazel/src/crypto/dh/dh.c',
- 'third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c',
- 'third_party/boringssl-with-bazel/src/crypto/dh/params.c',
+ 'third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c',
+ 'third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c',
'third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c',
'third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c',
'third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c',
+ 'third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c',
'third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c',
'third_party/upb/upb/table.c',
'third_party/upb/upb/text_encode.c',
'third_party/upb/upb/upb.c',
- 'src/core/ext/upb-generated/google/protobuf/any.upb.c',
'src/core/ext/upb-generated/google/protobuf/descriptor.upb.c',
- 'src/core/ext/upb-generated/google/protobuf/duration.upb.c',
- 'src/core/ext/upb-generated/google/protobuf/empty.upb.c',
- 'src/core/ext/upb-generated/google/protobuf/struct.upb.c',
- 'src/core/ext/upb-generated/google/protobuf/timestamp.upb.c',
- 'src/core/ext/upb-generated/google/protobuf/wrappers.upb.c',
- 'src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c',
'src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c',
- 'src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c',
- 'src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c',
- 'src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c',
- 'src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c',
- 'src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c',
],
},
{
/**
* Sets the options of whether to request and verify client certs. This should
- * be called only on the server side. It returns 1 on success and 0 on failure.
- * It is used for experimental purpose for now and subject to change.
+ * be called only on the server side. It is used for experimental purpose for
+ * now and subject to change.
*/
GRPCAPI void grpc_tls_credentials_options_set_cert_request_type(
grpc_tls_credentials_options* options,
* hostname check, etc. This should be called only on the client side. If
* |server_verification_option| is not GRPC_TLS_SERVER_VERIFICATION, use of a
* custom authorization check (grpc_tls_server_authorization_check_config) is
- * mandatory. It returns 1 on success and 0 on failure. It is used for
- * experimental purpose for now and subject to change.
+ * mandatory. It is used for experimental purpose for now and subject to change.
*/
GRPCAPI void grpc_tls_credentials_options_set_server_verification_option(
grpc_tls_credentials_options* options,
/**
* Sets the credential provider in the options.
* The |options| will implicitly take a new ref to the |provider|.
- * It returns 1 on success and 0 on failure.
* It is used for experimental purpose for now and subject to change.
*/
GRPCAPI void grpc_tls_credentials_options_set_certificate_provider(
/**
* If set, gRPC stack will keep watching the root certificates with
- * name |root_cert_name|. It returns 1 on success and 0 on failure. It is used
- * for experimental purpose for now and subject to change.
+ * name |root_cert_name|.
+ * If this is not set on the client side, we will use the root certificates
+ * stored in the default system location, since client side must provide root
+ * certificates in TLS.
+ * If this is not set on the server side, we will not watch any root certificate
+ * updates, and assume no root certificates needed for the server(single-side
+ * TLS). Default root certs on the server side is not supported.
+ * It is used for experimental purpose for now and subject to change.
*/
GRPCAPI void grpc_tls_credentials_options_watch_root_certs(
grpc_tls_credentials_options* options);
/**
* If set, gRPC stack will keep watching the identity key-cert pairs
- * with name |identity_cert_name|. It returns 1 on success and 0 on failure. It
- * is used for experimental purpose for now and subject to change.
+ * with name |identity_cert_name|.
+ * This is required on the server side, and optional on the client side.
+ * It is used for experimental purpose for now and subject to change.
*/
GRPCAPI void grpc_tls_credentials_options_watch_identity_key_cert_pairs(
grpc_tls_credentials_options* options);
/**
* Sets the configuration for a custom authorization check performed at the end
* of the handshake. The |options| will implicitly take a new ref to the
- * |config|. It returns 1 on success and 0 on failure. It is used for
- * experimental purpose for now and subject to change.
+ * |config|.
+ * It is used for experimental purpose for now and subject to change.
*/
GRPCAPI void grpc_tls_credentials_options_set_server_authorization_check_config(
grpc_tls_credentials_options* options,
initial_metadata_read_ = true;
}
- /// See \a ClientAysncResponseReaderInterface::Finish for semantics.
+ /// See \a ClientAsyncResponseReaderInterface::Finish for semantics.
///
/// Side effect:
/// - the \a ClientContext associated with this call is updated with
/// Mutation functions: should only be used by an AuthMetadataProcessor.
virtual void AddProperty(const std::string& key, const string_ref& value) = 0;
- virtual bool SetPeerIdentityPropertyName(const string& name) = 0;
+ virtual bool SetPeerIdentityPropertyName(const std::string& name) = 0;
};
} // namespace grpc
grpc_call* call = call_.call();
auto call_requester = std::move(call_requester_);
allocator_state_->Release();
+ if (ctx_->context_allocator() != nullptr) {
+ ctx_->context_allocator()->Release(ctx_);
+ }
this->~ServerCallbackUnaryImpl(); // explicitly call destructor
::grpc::g_core_codegen_interface->grpc_call_unref(call);
call_requester();
reactor_.load(std::memory_order_relaxed)->OnDone();
grpc_call* call = call_.call();
auto call_requester = std::move(call_requester_);
+ if (ctx_->context_allocator() != nullptr) {
+ ctx_->context_allocator()->Release(ctx_);
+ }
this->~ServerCallbackReaderImpl(); // explicitly call destructor
::grpc::g_core_codegen_interface->grpc_call_unref(call);
call_requester();
// DefaultReactor (which is unary).
this->MaybeDone(/*inlineable_ondone=*/false);
}
- ~ServerCallbackWriterImpl() { req_->~RequestType(); }
+ ~ServerCallbackWriterImpl() {
+ if (req_ != nullptr) {
+ req_->~RequestType();
+ }
+ }
const RequestType* request() { return req_; }
reactor_.load(std::memory_order_relaxed)->OnDone();
grpc_call* call = call_.call();
auto call_requester = std::move(call_requester_);
+ if (ctx_->context_allocator() != nullptr) {
+ ctx_->context_allocator()->Release(ctx_);
+ }
this->~ServerCallbackWriterImpl(); // explicitly call destructor
::grpc::g_core_codegen_interface->grpc_call_unref(call);
call_requester();
reactor_.load(std::memory_order_relaxed)->OnDone();
grpc_call* call = call_.call();
auto call_requester = std::move(call_requester_);
+ if (ctx_->context_allocator() != nullptr) {
+ ctx_->context_allocator()->Release(ctx_);
+ }
this->~ServerCallbackReaderWriterImpl(); // explicitly call destructor
::grpc::g_core_codegen_interface->grpc_call_unref(call);
call_requester();
class GenericServerContext;
class Server;
class ServerInterface;
+class ContextAllocator;
// TODO(vjpai): Remove namespace experimental when de-experimentalized fully.
namespace experimental {
ServerContextBase();
ServerContextBase(gpr_timespec deadline, grpc_metadata_array* arr);
+ void set_context_allocator(ContextAllocator* context_allocator) {
+ context_allocator_ = context_allocator;
+ }
+
+ ContextAllocator* context_allocator() const { return context_allocator_; }
+
private:
friend class ::grpc::testing::InteropServerContextInspector;
friend class ::grpc::testing::ServerContextTestSpouse;
::grpc::experimental::ServerRpcInfo* rpc_info_ = nullptr;
::grpc::experimental::RpcAllocatorState* message_allocator_state_ = nullptr;
+ ContextAllocator* context_allocator_ = nullptr;
class Reactor : public ::grpc::ServerUnaryReactor {
public:
using ServerContextBase::compression_algorithm;
using ServerContextBase::compression_level;
using ServerContextBase::compression_level_set;
+ using ServerContextBase::context_allocator;
using ServerContextBase::deadline;
using ServerContextBase::IsCancelled;
using ServerContextBase::peer;
using ServerContextBase::raw_deadline;
using ServerContextBase::set_compression_algorithm;
using ServerContextBase::set_compression_level;
+ using ServerContextBase::set_context_allocator;
using ServerContextBase::SetLoadReportingCosts;
using ServerContextBase::TryCancel;
CallbackServerContext& operator=(const CallbackServerContext&) = delete;
};
+/// A CallbackServerContext allows users to use the contents of the
+/// CallbackServerContext or GenericCallbackServerContext structure for the
+/// callback API.
+/// The library will invoke the allocator any time a new call is initiated.
+/// and call the Release method after the server OnDone.
+class ContextAllocator {
+ public:
+ virtual ~ContextAllocator() {}
+
+ virtual CallbackServerContext* NewCallbackServerContext() { return nullptr; }
+
+#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL
+ virtual experimental::GenericCallbackServerContext*
+ NewGenericCallbackServerContext() {
+ return nullptr;
+ }
+#else
+ virtual GenericCallbackServerContext* NewGenericCallbackServerContext() {
+ return nullptr;
+ }
+#endif
+
+ virtual void Release(CallbackServerContext*) {}
+
+#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL
+ virtual void Release(experimental::GenericCallbackServerContext*) {}
+#else
+ virtual void Release(GenericCallbackServerContext*) {}
+#endif
+};
+
} // namespace grpc
static_assert(
/// May not be abstract since this is a post-1.0 API addition
virtual void RegisterCallbackGenericService(
experimental::CallbackGenericService* /*service*/) {}
+ virtual void RegisterContextAllocator(
+ std::unique_ptr<ContextAllocator> context_allocator) {}
};
/// NOTE: The function experimental_registration() is not stable public API.
std::shared_ptr<CallCredentials> MetadataCredentialsFromPlugin(
std::unique_ptr<MetadataCredentialsPlugin> plugin);
+/// Builds External Account credentials.
+/// json_string is the JSON string containing the credentials options.
+/// scopes contains the scopes to be binded with the credentials.
+std::shared_ptr<CallCredentials> ExternalAccountCredentials(
+ const grpc::string& json_string, const std::vector<grpc::string>& scopes);
+
namespace experimental {
/// Options for creating STS Oauth Token Exchange credentials following the IETF
std::shared_ptr<CallCredentials> StsCredentials(
const StsCredentialsOptions& options);
-/// Builds External Account credentials.
-/// json_string is the JSON string containing the credentials options.
-/// scopes contains the scopes to be binded with the credentials.
-std::shared_ptr<CallCredentials> ExternalAccountCredentials(
- const grpc::string& json_string, const std::vector<grpc::string>& scopes);
-
std::shared_ptr<CallCredentials> MetadataCredentialsFromPlugin(
std::unique_ptr<MetadataCredentialsPlugin> plugin,
grpc_security_level min_security_level);
} // namespace experimental
/// Wrapper around \a grpc_server_credentials, a way to authenticate a server.
-class ServerCredentials {
+class ServerCredentials : private grpc::GrpcLibraryCodegen {
public:
- virtual ~ServerCredentials();
+ ServerCredentials();
+ ~ServerCredentials() override;
/// This method is not thread-safe and has to be called before the server is
/// started. The last call to this function wins.
//
// @param certificate_provider the provider which fetches TLS credentials that
// will be used in the TLS handshake
- explicit TlsCredentialsOptions(
- std::shared_ptr<CertificateProviderInterface> certificate_provider);
+ TlsCredentialsOptions();
// ---- Setters for member fields ----
+ // Sets the certificate provider used to store root certs and identity certs.
+ void set_certificate_provider(
+ std::shared_ptr<CertificateProviderInterface> certificate_provider);
// Watches the updates of root certificates with name |root_cert_name|.
- // If used in TLS credentials, it should always be set unless the root
- // certificates are not needed(e.g. in the one-side TLS scenario, the server
- // is not required to verify the client).
+ // If used in TLS credentials, setting this field is optional for both the
+ // client side and the server side.
+ // If this is not set on the client side, we will use the root certificates
+ // stored in the default system location, since client side must provide root
+ // certificates in TLS(no matter single-side TLS or mutual TLS).
+ // If this is not set on the server side, we will not watch any root
+ // certificate updates, and assume no root certificates needed for the server
+ // (in the one-side TLS scenario, the server is not required to provide root
+ // certs). We don't support default root certs on server side.
void watch_root_certs();
// Sets the name of root certificates being watched, if |watch_root_certs| is
// called. If not set, an empty string will be used as the name.
// @param root_cert_name the name of root certs being set.
void set_root_cert_name(const std::string& root_cert_name);
// Watches the updates of identity key-cert pairs with name
- // |identity_cert_name|. If used in TLS credentials, it should always be set
- // unless the identity certificates are not needed(e.g. in the one-side TLS
- // scenario, the client is not required to provide certs).
+ // |identity_cert_name|. If used in TLS credentials, it is required to be set
+ // on the server side, and optional for the client side(in the one-side
+ // TLS scenario, the client is not required to provide identity certs).
void watch_identity_key_cert_pairs();
// Sets the name of identity key-cert pairs being watched, if
// |watch_identity_key_cert_pairs| is called. If not set, an empty string will
};
// Contains configurable options on the client side.
+// Client side doesn't need to always use certificate provider. When the
+// certificate provider is not set, we will use the root certificates stored
+// in the system default locations, and assume client won't provide any
+// identity certificates(single side TLS).
// It is used for experimental purposes for now and it is subject to change.
class TlsChannelCredentialsOptions final : public TlsCredentialsOptions {
public:
- explicit TlsChannelCredentialsOptions(
- std::shared_ptr<CertificateProviderInterface> certificate_provider)
- : TlsCredentialsOptions(std::move(certificate_provider)) {}
-
// Sets the option to verify the server.
// The default is GRPC_TLS_SERVER_VERIFICATION.
void set_server_verification_option(
// It is used for experimental purposes for now and it is subject to change.
class TlsServerCredentialsOptions final : public TlsCredentialsOptions {
public:
+ // Server side is required to use a provider, because server always needs to
+ // use identity certs.
explicit TlsServerCredentialsOptions(
std::shared_ptr<CertificateProviderInterface> certificate_provider)
- : TlsCredentialsOptions(std::move(certificate_provider)) {}
+ : TlsCredentialsOptions() {
+ set_certificate_provider(certificate_provider);
+ }
// Sets option to request the certificates from the client.
// The default is GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE.
health_check_service_ = std::move(service);
}
+ ContextAllocator* context_allocator() { return context_allocator_.get(); }
+
/// NOTE: This method is not part of the public API for this class.
bool health_check_service_disabled() const {
return health_check_service_disabled_;
/// ownership of theservice. The service must exist for the lifetime of the
/// Server instance.
void RegisterCallbackGenericService(CallbackGenericService* service) override;
+
+ void RegisterContextAllocator(
+ std::unique_ptr<ContextAllocator> context_allocator) {
+ context_allocator_ = std::move(context_allocator);
+ }
+
#else
/// NOTE: class experimental_registration_type is not part of the public API
/// of this class
server_->RegisterCallbackGenericService(service);
}
+ void RegisterContextAllocator(
+ std::unique_ptr<ContextAllocator> context_allocator) override {
+ server_->context_allocator_ = std::move(context_allocator);
+ }
+
private:
Server* server_;
};
std::unique_ptr<ServerInitializer> server_initializer_;
+ std::unique_ptr<ContextAllocator> context_allocator_;
+
std::unique_ptr<HealthCheckServiceInterface> health_check_service_;
bool health_check_service_disabled_;
builder_->interceptor_creators_ = std::move(interceptor_creators);
}
+ /// Set the allocator for creating and releasing callback server context.
+ /// Takes the owndership of the allocator.
+ ServerBuilder& SetContextAllocator(
+ std::unique_ptr<grpc::ContextAllocator> context_allocator);
+
#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL
/// Register a generic service that uses the callback API.
/// Matches requests with any :authority
std::vector<std::unique_ptr<grpc::ServerBuilderPlugin>> plugins_;
grpc_resource_quota* resource_quota_;
grpc::AsyncGenericService* generic_service_{nullptr};
+ std::unique_ptr<ContextAllocator> context_allocator_;
#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
grpc::CallbackGenericService* callback_generic_service_{nullptr};
#else
#include <grpcpp/support/status.h>
-namespace google {
-namespace rpc {
-class Status;
-} // namespace rpc
-} // namespace google
-
namespace grpc {
/// Map a \a grpc::Status to a \a google::rpc::Status.
/// On success, returns status with OK.
/// Returns status with \a INVALID_ARGUMENT, if failed to deserialize.
/// Returns status with \a FAILED_PRECONDITION, if \a to is nullptr.
-grpc::Status ExtractErrorDetails(const grpc::Status& from,
- ::google::rpc::Status* to);
+///
+/// \note
+/// This function is a template to avoid a build dep on \a status.proto.
+/// However, this function still requires that \tparam T is of type
+/// \a google::rpc::Status, which is defined at
+/// https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto
+template <typename T>
+grpc::Status ExtractErrorDetails(const grpc::Status& from, T* to) {
+ if (to == nullptr) {
+ return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "");
+ }
+ if (!to->ParseFromString(from.error_details())) {
+ return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, "");
+ }
+ return grpc::Status::OK;
+}
+inline grpc::Status ExtractErrorDetails(const grpc::Status&, std::nullptr_t) {
+ return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "");
+}
/// Map \a google::rpc::Status to a \a grpc::Status.
/// Returns OK on success.
/// Returns status with \a FAILED_PRECONDITION if \a to is nullptr.
-grpc::Status SetErrorDetails(const ::google::rpc::Status& from,
- grpc::Status* to);
+///
+/// \note
+/// This function is a template to avoid a build dep on \a status.proto.
+/// However, this function still requires that \tparam T is of type
+/// \a google::rpc::Status, which is defined at
+/// https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto
+template <typename T>
+grpc::Status SetErrorDetails(const T& from, grpc::Status* to) {
+ if (to == nullptr) {
+ return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "");
+ }
+ grpc::StatusCode code = grpc::StatusCode::UNKNOWN;
+ if (from.code() >= grpc::StatusCode::OK &&
+ from.code() <= grpc::StatusCode::UNAUTHENTICATED) {
+ code = static_cast<grpc::StatusCode>(from.code());
+ }
+ *to = grpc::Status(code, from.message(), from.SerializeAsString());
+ return grpc::Status::OK;
+}
} // namespace grpc
<date>2019-09-24</date>
<time>16:06:07</time>
<version>
- <release>1.35.0</release>
- <api>1.35.0</api>
+ <release>1.36.0</release>
+ <api>1.36.0</api>
</version>
<stability>
<release>stable</release>
</stability>
<license>Apache 2.0</license>
<notes>
-- gRPC Core 1.35.0 update
+- gRPC Core 1.36.0 update
</notes>
<contents>
<dir baseinstalldir="/" name="/">
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/annotations/status.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/annotations/versioning.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/annotations/versioning.upb.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/authority.upb.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/authority.upb.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/resource.upb.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/resource.upb.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/validate/validate.upb.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upb-generated/validate/validate.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/authority.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/authority.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/context_params.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/context_params.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/resource.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/resource.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c" role="src" />
- <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/validate/validate.upbdefs.c" role="src" />
<file baseinstalldir="/" name="src/core/ext/upbdefs-generated/validate/validate.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c" role="src" />
+ <file baseinstalldir="/" name="src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/xds/certificate_provider_factory.h" role="src" />
<file baseinstalldir="/" name="src/core/ext/xds/certificate_provider_registry.cc" role="src" />
<file baseinstalldir="/" name="src/core/ext/xds/certificate_provider_registry.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gprpp/thd.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/gprpp/thd_posix.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/gprpp/thd_windows.cc" role="src" />
+ <file baseinstalldir="/" name="src/core/lib/gprpp/time_util.cc" role="src" />
+ <file baseinstalldir="/" name="src/core/lib/gprpp/time_util.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/http/format_request.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/http/format_request.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/http/httpcli.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iomgr_internal.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iomgr_internal.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iomgr_posix.cc" role="src" />
- <file baseinstalldir="/" name="src/core/lib/iomgr/iomgr_posix.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iomgr_posix_cfstream.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iomgr_uv.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/iomgr_windows.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/authorization/authorization_engine.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/authorization/evaluate_args.cc" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/authorization/evaluate_args.h" role="src" />
+ <file baseinstalldir="/" name="src/core/lib/security/authorization/matchers.cc" role="src" />
+ <file baseinstalldir="/" name="src/core/lib/security/authorization/matchers.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/authorization/mock_cel/activation.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/security/authorization/mock_cel/cel_expression.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/bio/printf.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/bio/socket.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/buf/buf.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/conf/internal.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/cpu-arm.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c" role="src" />
- <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/dh/check.c" role="src" />
- <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/dh/dh.c" role="src" />
- <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c" role="src" />
- <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/dh/params.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/include/openssl/base.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/include/openssl/base64.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/include/openssl/bio.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/include/openssl/blake2.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/include/openssl/blowfish.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/include/openssl/bn.h" role="src" />
<file baseinstalldir="/" name="third_party/boringssl-with-bazel/src/include/openssl/buf.h" role="src" />
# GRPC Python setup requirements
-coverage>=4.0
-cython>=0.29.8
-enum34>=1.0.4
+coverage==4.5.4
+cython==0.29.21
+enum34==1.1.10
protobuf>=3.5.0.post1, < 4.0dev
-six>=1.10
-wheel>=0.29
-futures>=2.2.0
-google-auth>=1.17.2
+six==1.15.0
+wheel==0.36.2
+futures==3.1.1
+google-auth==1.24.0
oauth2client==4.1.0
-requests>=2.14.2
-urllib3>=1.23
+requests==2.25.1
+urllib3==1.26.3
chardet==3.0.4
certifi==2017.4.17
idna==2.7
# By default, Python3 distutils enforces compatibility of
# c plugins (.so files) with the OSX version Python was built with.
# We need OSX 10.10, the oldest which supports C++ thread_local.
+# Python 3.9: Mac OS Big Sur sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') returns int (11)
if 'darwin' in sys.platform:
mac_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
- if mac_target and (pkg_resources.parse_version(mac_target) <
- pkg_resources.parse_version('10.10.0')):
- os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.10'
- os.environ['_PYTHON_HOST_PLATFORM'] = re.sub(
- r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.10-\1',
- util.get_platform())
+ if mac_target:
+ mac_target = pkg_resources.parse_version(str(mac_target))
+ if mac_target < pkg_resources.parse_version('10.10.0'):
+ os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.10'
+ os.environ['_PYTHON_HOST_PLATFORM'] = re.sub(
+ r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.10-\1',
+ util.get_platform())
def cython_extensions_and_necessity():
int port = static_cast<int>(port_raw);
bool use_tls = static_cast<bool>(use_tls_raw);
- return GetClient(host, port, use_tls)->DoEmpty();
+ jboolean result = GetClient(host, port, use_tls)->DoEmpty();
+ env->ReleaseStringUTFChars(host_raw, host);
+ return result;
}
extern "C" JNIEXPORT jboolean JNICALL
int port = static_cast<int>(port_raw);
bool use_tls = static_cast<bool>(use_tls_raw);
- return GetClient(host, port, use_tls)->DoLargeUnary();
+ jboolean result = GetClient(host, port, use_tls)->DoLargeUnary();
+ env->ReleaseStringUTFChars(host_raw, host);
+ return result;
}
extern "C" JNIEXPORT jboolean JNICALL
int port = static_cast<int>(port_raw);
bool use_tls = static_cast<bool>(use_tls_raw);
- return GetClient(host, port, use_tls)->DoEmptyStream();
+ jboolean result = GetClient(host, port, use_tls)->DoEmptyStream();
+ env->ReleaseStringUTFChars(host_raw, host);
+ return result;
}
extern "C" JNIEXPORT jboolean JNICALL
int port = static_cast<int>(port_raw);
bool use_tls = static_cast<bool>(use_tls_raw);
- return GetClient(host, port, use_tls)->DoRequestStreaming();
+ jboolean result = GetClient(host, port, use_tls)->DoRequestStreaming();
+ env->ReleaseStringUTFChars(host_raw, host);
+ return result;
}
extern "C" JNIEXPORT jboolean JNICALL
int port = static_cast<int>(port_raw);
bool use_tls = static_cast<bool>(use_tls_raw);
- return GetClient(host, port, use_tls)->DoResponseStreaming();
+ jboolean result = GetClient(host, port, use_tls)->DoResponseStreaming();
+ env->ReleaseStringUTFChars(host_raw, host);
+ return result;
}
extern "C" JNIEXPORT jboolean JNICALL
int port = static_cast<int>(port_raw);
bool use_tls = static_cast<bool>(use_tls_raw);
- return GetClient(host, port, use_tls)->DoPingPong();
+ jboolean result = GetClient(host, port, use_tls)->DoPingPong();
+ env->ReleaseStringUTFChars(host_raw, host);
+ return result;
}
-// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: 29c6e0e27268f5a43e039cd2ed4e849d6b736fc1
+// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: 067cfd92f4d7da0edfa073b096d090b98a83b860
// Copyright (c) 2018, Google Inc.
//
#define SSL_set_connect_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_connect_state)
#define SSL_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_custom_verify)
#define SSL_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_early_data_enabled)
+#define SSL_set_enable_ech_grease BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_enable_ech_grease)
#define SSL_set_enforce_rsa_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_enforce_rsa_key_usage)
#define SSL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ex_data)
#define SSL_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_fd)
#define SSL_set_quic_early_data_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_early_data_context)
#define SSL_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_method)
#define SSL_set_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_transport_params)
+#define SSL_set_quic_use_legacy_codepoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_use_legacy_codepoint)
#define SSL_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quiet_shutdown)
#define SSL_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_read_ahead)
#define SSL_set_renegotiate_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_renegotiate_mode)
#define ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_free)
#define ASN1_OBJECT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_it)
#define ASN1_OBJECT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_new)
-#define ASN1_OCTET_STRING_NDEF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_NDEF_it)
#define ASN1_OCTET_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_cmp)
#define ASN1_OCTET_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_dup)
#define ASN1_OCTET_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_free)
#define ASN1_item_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d)
#define ASN1_item_i2d_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_bio)
#define ASN1_item_i2d_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_fp)
-#define ASN1_item_ndef_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ndef_i2d)
#define ASN1_item_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_new)
#define ASN1_item_pack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_pack)
#define ASN1_item_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign)
#define ASN1_mbstring_ncopy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_ncopy)
#define ASN1_object_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_object_size)
#define ASN1_primitive_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_free)
-#define ASN1_primitive_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_new)
#define ASN1_put_eoc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_eoc)
#define ASN1_put_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_object)
#define ASN1_tag2bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2bit)
#define ASN1_tag2str BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2str)
#define ASN1_template_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_free)
-#define ASN1_template_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_new)
#define AUTHORITY_INFO_ACCESS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_free)
#define AUTHORITY_INFO_ACCESS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_it)
#define AUTHORITY_INFO_ACCESS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_new)
#define BIO_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write)
#define BIO_write_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_all)
#define BIO_write_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_filename)
+#define BLAKE2B256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BLAKE2B256)
+#define BLAKE2B256_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BLAKE2B256_Final)
+#define BLAKE2B256_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BLAKE2B256_Init)
+#define BLAKE2B256_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BLAKE2B256_Update)
#define BN_BLINDING_convert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_convert)
#define BN_BLINDING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_free)
#define BN_BLINDING_invalidate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_invalidate)
#define CBS_get_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8)
#define CBS_get_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8_length_prefixed)
#define CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_init)
+#define CBS_is_unsigned_asn1_integer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_unsigned_asn1_integer)
#define CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_bitstring)
+#define CBS_is_valid_asn1_integer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_integer)
#define CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_len)
#define CBS_mem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_mem_equal)
#define CBS_peek_asn1_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_peek_asn1_tag)
#define CRYPTO_cleanup_all_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cleanup_all_ex_data)
#define CRYPTO_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt)
#define CRYPTO_ctr128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt_ctr32)
+#define CRYPTO_fork_detect_ignore_madv_wipeonfork_for_testing BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_fork_detect_ignore_madv_wipeonfork_for_testing)
#define CRYPTO_free_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_free_ex_data)
#define CRYPTO_gcm128_aad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_aad)
#define CRYPTO_gcm128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt)
#define DH_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check)
#define DH_check_pub_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check_pub_key)
#define DH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_compute_key)
+#define DH_compute_key_hashed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_compute_key_hashed)
+#define DH_compute_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_compute_key_padded)
#define DH_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_free)
#define DH_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_key)
#define DH_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_parameters_ex)
#define DH_get0_priv_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_priv_key)
#define DH_get0_pub_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_pub_key)
#define DH_get0_q BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_q)
-#define DH_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_data)
-#define DH_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_new_index)
+#define DH_get_rfc7919_2048 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_rfc7919_2048)
#define DH_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_marshal_parameters)
#define DH_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_new)
#define DH_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_num_bits)
#define DH_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_parse_parameters)
#define DH_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_key)
#define DH_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_pqg)
-#define DH_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set_ex_data)
#define DH_set_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set_length)
#define DH_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_size)
#define DH_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_up_ref)
#define EC_POINT_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dbl)
#define EC_POINT_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dup)
#define EC_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_free)
+#define EC_POINT_get_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_get_affine_coordinates)
#define EC_POINT_get_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_get_affine_coordinates_GFp)
#define EC_POINT_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_invert)
#define EC_POINT_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_at_infinity)
#define EC_POINT_oct2point BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_oct2point)
#define EC_POINT_point2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2cbb)
#define EC_POINT_point2oct BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2oct)
+#define EC_POINT_set_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_affine_coordinates)
#define EC_POINT_set_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_affine_coordinates_GFp)
#define EC_POINT_set_compressed_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_compressed_coordinates_GFp)
#define EC_POINT_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_to_infinity)
#define EVP_HPKE_CTX_setup_psk_r_x25519 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_HPKE_CTX_setup_psk_r_x25519)
#define EVP_HPKE_CTX_setup_psk_s_x25519 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_HPKE_CTX_setup_psk_s_x25519)
#define EVP_HPKE_CTX_setup_psk_s_x25519_for_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_HPKE_CTX_setup_psk_s_x25519_for_test)
+#define EVP_HPKE_get_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_HPKE_get_aead)
+#define EVP_HPKE_get_hkdf_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_HPKE_get_hkdf_md)
#define EVP_MD_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_block_size)
#define EVP_MD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_cleanup)
#define EVP_MD_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy)
#define EVP_aes_256_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ecb)
#define EVP_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_gcm)
#define EVP_aes_256_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ofb)
+#define EVP_blake2b256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_blake2b256)
#define EVP_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_cleanup)
#define EVP_des_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_cbc)
#define EVP_des_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ecb)
#define PROXY_POLICY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_free)
#define PROXY_POLICY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_it)
#define PROXY_POLICY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_new)
+#define RAND_OpenSSL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_OpenSSL)
#define RAND_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_SSLeay)
#define RAND_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_add)
#define RAND_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes)
#define X509_reject_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_reject_clear)
#define X509_set1_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set1_notAfter)
#define X509_set1_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set1_notBefore)
+#define X509_set1_signature_algo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set1_signature_algo)
+#define X509_set1_signature_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set1_signature_value)
#define X509_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_ex_data)
#define X509_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_issuer_name)
#define X509_set_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notAfter)
#define asn1_enc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_init)
#define asn1_enc_restore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_restore)
#define asn1_enc_save BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_save)
-#define asn1_ex_c2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_c2i)
-#define asn1_ex_i2c BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_i2c)
#define asn1_generalizedtime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_generalizedtime_to_tm)
#define asn1_get_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_choice_selector)
#define asn1_get_field_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_field_ptr)
#define bn_scatter5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_scatter5)
#define bn_select_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_select_words)
#define bn_set_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_minimal_width)
+#define bn_set_static_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_static_words)
#define bn_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_words)
#define bn_sqr8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr8x_internal)
#define bn_sqr_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba4)
#define i2d_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_INFO)
#define i2d_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_bio)
#define i2d_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_fp)
+#define i2d_X509_CRL_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_tbs)
#define i2d_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSION)
#define i2d_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSIONS)
#define i2d_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME)
#define i2d_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_VAL)
#define i2d_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_bio)
#define i2d_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_fp)
+#define i2d_X509_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_tbs)
#define i2d_re_X509_CRL_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_CRL_tbs)
#define i2d_re_X509_REQ_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_REQ_tbs)
#define i2d_re_X509_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_tbs)
#define policy_node_cmp_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_cmp_new)
#define policy_node_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_free)
#define policy_node_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_match)
+#define poly_Rq_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, poly_Rq_mul)
#define rand_fork_unsafe_buffering_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rand_fork_unsafe_buffering_enabled)
#define rsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_asn1_meth)
#define rsa_check_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_check_public_key)
// Fields guarded by a mutex, since they need to be accessed
// synchronously via get_channel_info().
//
- gpr_mu info_mu_;
+ Mutex info_mu_;
UniquePtr<char> info_lb_policy_name_;
UniquePtr<char> info_service_config_json_;
// Channel arg pointer vtable for GRPC_ARG_CLIENT_CHANNEL_DATA.
void* ChannelDataArgCopy(void* p) { return p; }
-void ChannelDataArgDestroy(void* p) {}
+void ChannelDataArgDestroy(void* /*p*/) {}
int ChannelDataArgCmp(void* p, void* q) { return GPR_ICMP(p, q); }
const grpc_arg_pointer_vtable kChannelDataArgPointerVtable = {
ChannelDataArgCopy, ChannelDataArgDestroy, ChannelDataArgCmp};
}
// Will never be called.
- static void StartTransportOp(grpc_channel_element* elem,
- grpc_transport_op* op) {}
- static void GetChannelInfo(grpc_channel_element* elem,
- const grpc_channel_info* info) {}
+ static void StartTransportOp(grpc_channel_element* /*elem*/,
+ grpc_transport_op* /*op*/) {}
+ static void GetChannelInfo(grpc_channel_element* /*elem*/,
+ const grpc_channel_info* /*info*/) {}
ChannelData* chand() const { return chand_; }
RefCountedPtr<ServerRetryThrottleData> retry_throttle_data() const {
}
static void Destroy(grpc_call_element* elem,
- const grpc_call_final_info* final_info,
+ const grpc_call_final_info* /*final_info*/,
grpc_closure* then_schedule_closure) {
auto* calld =
static_cast<DynamicTerminationFilterCallData*>(elem->call_data);
gpr_log(GPR_INFO, "chand=%p: creating client_channel for channel stack %p",
this, owning_stack_);
}
- // Initialize data members.
- gpr_mu_init(&info_mu_);
// Start backup polling.
grpc_client_channel_start_backup_polling(interested_parties_);
// Check client channel factory.
grpc_client_channel_stop_backup_polling(interested_parties_);
grpc_pollset_set_destroy(interested_parties_);
GRPC_ERROR_UNREF(disconnect_error_.Load(MemoryOrder::RELAXED));
- gpr_mu_destroy(&info_mu_);
}
RefCountedPtr<LoadBalancingPolicy::Config> ChooseLbPolicy(
grpc_connectivity_state state, const absl::Status& status,
const char* reason,
std::unique_ptr<LoadBalancingPolicy::SubchannelPicker> picker) {
- // Clean the control plane when entering IDLE.
+ // Special case for IDLE and SHUTDOWN states.
if (picker == nullptr || state == GRPC_CHANNEL_SHUTDOWN) {
saved_service_config_.reset();
saved_config_selector_.reset();
+ // Acquire resolution lock to update config selector and associated state.
+ // To minimize lock contention, we wait to unref these objects until
+ // after we release the lock.
+ RefCountedPtr<ServiceConfig> service_config_to_unref;
+ RefCountedPtr<ConfigSelector> config_selector_to_unref;
+ RefCountedPtr<DynamicFilters> dynamic_filters_to_unref;
+ {
+ MutexLock lock(&resolution_mu_);
+ received_service_config_data_ = false;
+ service_config_to_unref = std::move(service_config_);
+ config_selector_to_unref = std::move(config_selector_);
+ dynamic_filters_to_unref = std::move(dynamic_filters_);
+ }
}
// Update connectivity state.
state_tracker_.SetState(state, status, reason);
// the refs until after we release the lock, and then unref them at
// that point. This includes the following:
// - refs to subchannel wrappers in the keys of pending_subchannel_updates_
- // - ref stored in service_config_
- // - ref stored in config_selector_
- // - ref stored in dynamic_filters_
// - ownership of the existing picker in picker_
- RefCountedPtr<ServiceConfig> service_config_to_unref;
- RefCountedPtr<ConfigSelector> config_selector_to_unref;
- RefCountedPtr<DynamicFilters> dynamic_filters_to_unref;
{
MutexLock lock(&data_plane_mu_);
// Handle subchannel updates.
// Swap out the picker.
// Note: Original value will be destroyed after the lock is released.
picker_.swap(picker);
- // Clean the data plane if the updated picker is nullptr.
- if (picker_ == nullptr || state == GRPC_CHANNEL_SHUTDOWN) {
- received_service_config_data_ = false;
- // Note: We save the objects to unref until after the lock is released.
- service_config_to_unref = std::move(service_config_);
- config_selector_to_unref = std::move(config_selector_);
- dynamic_filters_to_unref = std::move(dynamic_filters_);
- }
// Re-process queued picks.
for (LbQueuedCall* call = lb_queued_calls_; call != nullptr;
call = call->next) {
arena_(args.arena),
owning_call_(args.call_stack),
call_combiner_(args.call_combiner),
- call_context_(args.context) {}
+ call_context_(args.context) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) {
+ gpr_log(GPR_INFO, "chand=%p calld=%p: created call", &chand, this);
+ }
+}
CallData::~CallData() {
grpc_slice_unref_internal(path_);
call_combiner_};
grpc_error* error = GRPC_ERROR_NONE;
DynamicFilters* channel_stack = args.channel_stack.get();
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
+ gpr_log(
+ GPR_INFO,
+ "chand=%p calld=%p: creating dynamic call stack on channel_stack=%p",
+ chand, this, channel_stack);
+ }
dynamic_call_ = channel_stack->CreateCall(std::move(args), &error);
if (error != GRPC_ERROR_NONE) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
#include "src/core/ext/filters/client_channel/resolver.h"
#include "src/core/lib/channel/channel_stack.h"
-extern grpc_core::TraceFlag grpc_client_channel_trace;
-
// Channel arg key for server URI string.
#define GRPC_ARG_SERVER_URI "grpc.server_uri"
// Only comparing the ConfigSelector itself, not the underlying
// service config, so we always return true.
- bool Equals(const ConfigSelector* other) const override { return true; }
+ bool Equals(const ConfigSelector* /*other*/) const override { return true; }
CallConfig GetCallConfig(GetCallConfigArgs args) override {
CallConfig call_config;
// If the write failed or we're shutting down, clean up and invoke the
// callback with the error.
handshaker->HandshakeFailedLocked(GRPC_ERROR_REF(error));
- lock.Unlock();
+ lock.Release();
handshaker->Unref();
} else {
// Otherwise, read the response.
// Set shutdown to true so that subsequent calls to
// http_connect_handshaker_shutdown() do nothing.
handshaker->is_shutdown_ = true;
- lock.Unlock();
+ lock.Release();
handshaker->Unref();
}
* stream for the reception of load balancing updates.
*
* Inputs:
- * - \a addresses: corresponding to the balancers.
* - \a response_generator: in order to propagate updates from the resolver
* above the grpclb policy.
* - \a args: other args inherited from the grpclb policy. */
grpc_channel_args* BuildBalancerChannelArgs(
- const ServerAddressList& addresses,
FakeResolverResponseGenerator* response_generator,
const grpc_channel_args* args) {
// Channel args to remove.
args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), args_to_add.data(),
args_to_add.size());
// Make any necessary modifications for security.
- return ModifyGrpclbBalancerChannelArgs(addresses, new_args);
+ return ModifyGrpclbBalancerChannelArgs(new_args);
}
//
&args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &new_arg, 1);
// Construct args for balancer channel.
ServerAddressList balancer_addresses = ExtractBalancerAddresses(args);
- grpc_channel_args* lb_channel_args = BuildBalancerChannelArgs(
- balancer_addresses, response_generator_.get(), &args);
+ grpc_channel_args* lb_channel_args =
+ BuildBalancerChannelArgs(response_generator_.get(), &args);
// Create balancer channel if needed.
if (lb_channel_ == nullptr) {
std::string uri_str = absl::StrCat("fake:///", server_name_);
namespace grpc_core {
-grpc_channel_args* ModifyGrpclbBalancerChannelArgs(
- const ServerAddressList& /*addresses*/, grpc_channel_args* args) {
+grpc_channel_args* ModifyGrpclbBalancerChannelArgs(grpc_channel_args* args) {
return args;
}
/// Takes ownership of \a args.
///
/// Caller takes ownership of the returned args.
-grpc_channel_args* ModifyGrpclbBalancerChannelArgs(
- const ServerAddressList& addresses, grpc_channel_args* args);
+grpc_channel_args* ModifyGrpclbBalancerChannelArgs(grpc_channel_args* args);
grpc_channel* CreateGrpclbBalancerChannel(const char* target_uri,
const grpc_channel_args& args);
namespace grpc_core {
-grpc_channel_args* ModifyGrpclbBalancerChannelArgs(
- const ServerAddressList& addresses, grpc_channel_args* args) {
+grpc_channel_args* ModifyGrpclbBalancerChannelArgs(grpc_channel_args* args) {
absl::InlinedVector<const char*, 1> args_to_remove;
absl::InlinedVector<grpc_arg, 1> args_to_add;
// Substitute the channel credentials with a version without call
const char* name() const override { return kPickFirst; }
RefCountedPtr<LoadBalancingPolicy::Config> ParseLoadBalancingConfig(
- const Json& json, grpc_error** /*error*/) const override {
+ const Json& /*json*/, grpc_error** /*error*/) const override {
return MakeRefCounted<PickFirstConfig>();
}
};
// Otherwise, find the child's priority.
uint32_t child_priority = GetChildPriorityLocked(child->name());
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
- gpr_log(GPR_INFO, "[priority_lb %p] state update for priority %d, child %s",
- this, child_priority, child->name().c_str());
+ gpr_log(GPR_INFO,
+ "[priority_lb %p] state update for priority %u, child %s, current "
+ "priority %u",
+ this, child_priority, child->name().c_str(), current_priority_);
}
// Ignore priorities not in the current config.
if (child_priority == UINT32_MAX) return;
}
void PriorityLb::TryNextPriorityLocked(bool report_connecting) {
+ current_priority_ = UINT32_MAX;
for (uint32_t priority = 0; priority < config_->priorities().size();
++priority) {
// If the child for the priority does not exist yet, create it.
const std::string& child_name = config_->priorities()[priority];
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
- gpr_log(GPR_INFO, "[priority_lb %p] trying priority %d, child %s", this,
+ gpr_log(GPR_INFO, "[priority_lb %p] trying priority %u, child %s", this,
priority, child_name.c_str());
}
auto& child = children_[child_name];
if (child->failover_timer_callback_pending()) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
gpr_log(GPR_INFO,
- "[priority_lb %p] priority %d, child %s: child still "
+ "[priority_lb %p] priority %u, child %s: child still "
"attempting to connect, will wait",
this, priority, child_name.c_str());
}
"TRANSIENT_FAILURE",
this);
}
- current_priority_ = UINT32_MAX;
current_child_from_before_update_ = nullptr;
grpc_error* error = grpc_error_set_int(
GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready priority"),
void PriorityLb::SelectPriorityLocked(uint32_t priority) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) {
- gpr_log(GPR_INFO, "[priority_lb %p] selected priority %d, child %s", this,
+ gpr_log(GPR_INFO, "[priority_lb %p] selected priority %u, child %s", this,
priority, config_->priorities()[priority].c_str());
}
current_priority_ = priority;
void UpdateLocked(UpdateArgs args) override;
void ResetBackoffLocked() override;
+ void ExitIdleLocked() override;
private:
// Watcher for getting cluster data from XdsClient.
class ClusterWatcher : public XdsClient::ClusterWatcherInterface {
public:
- explicit ClusterWatcher(RefCountedPtr<CdsLb> parent)
- : parent_(std::move(parent)) {}
+ ClusterWatcher(RefCountedPtr<CdsLb> parent, std::string name)
+ : parent_(std::move(parent)), name_(std::move(name)) {}
void OnClusterChanged(XdsApi::CdsUpdate cluster_data) override {
- new Notifier(parent_, std::move(cluster_data));
+ new Notifier(parent_, name_, std::move(cluster_data));
}
- void OnError(grpc_error* error) override { new Notifier(parent_, error); }
- void OnResourceDoesNotExist() override { new Notifier(parent_); }
+ void OnError(grpc_error* error) override {
+ new Notifier(parent_, name_, error);
+ }
+ void OnResourceDoesNotExist() override { new Notifier(parent_, name_); }
private:
class Notifier {
public:
- Notifier(RefCountedPtr<CdsLb> parent, XdsApi::CdsUpdate update);
- Notifier(RefCountedPtr<CdsLb> parent, grpc_error* error);
- explicit Notifier(RefCountedPtr<CdsLb> parent);
+ Notifier(RefCountedPtr<CdsLb> parent, std::string name,
+ XdsApi::CdsUpdate update);
+ Notifier(RefCountedPtr<CdsLb> parent, std::string name,
+ grpc_error* error);
+ explicit Notifier(RefCountedPtr<CdsLb> parent, std::string name);
private:
enum Type { kUpdate, kError, kDoesNotExist };
void RunInWorkSerializer(grpc_error* error);
RefCountedPtr<CdsLb> parent_;
+ std::string name_;
grpc_closure closure_;
XdsApi::CdsUpdate update_;
Type type_;
};
RefCountedPtr<CdsLb> parent_;
+ std::string name_;
+ };
+
+ struct WatcherState {
+ // Pointer to watcher, to be used when cancelling.
+ // Not owned, so do not dereference.
+ ClusterWatcher* watcher = nullptr;
+ // Most recent update obtained from this watcher.
+ absl::optional<XdsApi::CdsUpdate> update;
};
// Delegating helper to be passed to child policy.
void ShutdownLocked() override;
- void OnClusterChanged(XdsApi::CdsUpdate cluster_data);
- void OnError(grpc_error* error);
- void OnResourceDoesNotExist();
+ bool GenerateDiscoveryMechanismForCluster(
+ const std::string& name, Json::Array* discovery_mechanisms,
+ std::set<std::string>* clusters_needed);
+ void OnClusterChanged(const std::string& name,
+ XdsApi::CdsUpdate cluster_data);
+ void OnError(const std::string& name, grpc_error* error);
+ void OnResourceDoesNotExist(const std::string& name);
grpc_error* UpdateXdsCertificateProvider(
- const XdsApi::CdsUpdate& cluster_data);
+ const std::string& cluster_name, const XdsApi::CdsUpdate& cluster_data);
+
+ void CancelClusterDataWatch(absl::string_view cluster_name,
+ XdsClient::ClusterWatcherInterface* watcher,
+ bool delay_unsubscription = false);
void MaybeDestroyChildPolicyLocked();
// The xds client.
RefCountedPtr<XdsClient> xds_client_;
- // A pointer to the cluster watcher, to be used when cancelling the watch.
- // Note that this is not owned, so this pointer must never be derefernced.
- ClusterWatcher* cluster_watcher_ = nullptr;
+
+ // Maps from cluster name to the state for that cluster.
+ // The root of the tree is config_->cluster().
+ std::map<std::string, WatcherState> watchers_;
RefCountedPtr<grpc_tls_certificate_provider> root_certificate_provider_;
RefCountedPtr<grpc_tls_certificate_provider> identity_certificate_provider_;
//
CdsLb::ClusterWatcher::Notifier::Notifier(RefCountedPtr<CdsLb> parent,
+ std::string name,
XdsApi::CdsUpdate update)
- : parent_(std::move(parent)), update_(std::move(update)), type_(kUpdate) {
+ : parent_(std::move(parent)),
+ name_(std::move(name)),
+ update_(std::move(update)),
+ type_(kUpdate) {
GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
}
CdsLb::ClusterWatcher::Notifier::Notifier(RefCountedPtr<CdsLb> parent,
- grpc_error* error)
- : parent_(std::move(parent)), type_(kError) {
+ std::string name, grpc_error* error)
+ : parent_(std::move(parent)), name_(std::move(name)), type_(kError) {
GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
ExecCtx::Run(DEBUG_LOCATION, &closure_, error);
}
-CdsLb::ClusterWatcher::Notifier::Notifier(RefCountedPtr<CdsLb> parent)
- : parent_(std::move(parent)), type_(kDoesNotExist) {
+CdsLb::ClusterWatcher::Notifier::Notifier(RefCountedPtr<CdsLb> parent,
+ std::string name)
+ : parent_(std::move(parent)), name_(std::move(name)), type_(kDoesNotExist) {
GRPC_CLOSURE_INIT(&closure_, &RunInExecCtx, this, nullptr);
ExecCtx::Run(DEBUG_LOCATION, &closure_, GRPC_ERROR_NONE);
}
void CdsLb::ClusterWatcher::Notifier::RunInWorkSerializer(grpc_error* error) {
switch (type_) {
case kUpdate:
- parent_->OnClusterChanged(std::move(update_));
+ parent_->OnClusterChanged(name_, std::move(update_));
break;
case kError:
- parent_->OnError(error);
+ parent_->OnError(name_, error);
break;
case kDoesNotExist:
- parent_->OnResourceDoesNotExist();
+ parent_->OnResourceDoesNotExist(name_);
break;
};
delete this;
shutting_down_ = true;
MaybeDestroyChildPolicyLocked();
if (xds_client_ != nullptr) {
- if (cluster_watcher_ != nullptr) {
+ for (auto& watcher : watchers_) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
- config_->cluster().c_str());
+ watcher.first.c_str());
}
- xds_client_->CancelClusterDataWatch(config_->cluster(), cluster_watcher_);
+ CancelClusterDataWatch(watcher.first, watcher.second.watcher,
+ /*delay_unsubscription=*/false);
}
+ watchers_.clear();
xds_client_.reset(DEBUG_LOCATION, "CdsLb");
}
grpc_channel_args_destroy(args_);
if (child_policy_ != nullptr) child_policy_->ResetBackoffLocked();
}
+void CdsLb::ExitIdleLocked() {
+ if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
+}
+
void CdsLb::UpdateLocked(UpdateArgs args) {
// Update config.
auto old_config = std::move(config_);
// If cluster name changed, cancel watcher and restart.
if (old_config == nullptr || old_config->cluster() != config_->cluster()) {
if (old_config != nullptr) {
- if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
- gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
- old_config->cluster().c_str());
+ for (auto& watcher : watchers_) {
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
+ gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
+ watcher.first.c_str());
+ }
+ CancelClusterDataWatch(watcher.first, watcher.second.watcher,
+ /*delay_unsubscription=*/true);
}
- xds_client_->CancelClusterDataWatch(old_config->cluster(),
- cluster_watcher_,
- /*delay_unsubscription=*/true);
+ watchers_.clear();
}
- if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
- gpr_log(GPR_INFO, "[cdslb %p] starting watch for cluster %s", this,
- config_->cluster().c_str());
- }
- auto watcher = absl::make_unique<ClusterWatcher>(Ref());
- cluster_watcher_ = watcher.get();
+ auto watcher = absl::make_unique<ClusterWatcher>(Ref(), config_->cluster());
+ watchers_[config_->cluster()].watcher = watcher.get();
xds_client_->WatchClusterData(config_->cluster(), std::move(watcher));
}
}
-void CdsLb::OnClusterChanged(XdsApi::CdsUpdate cluster_data) {
- if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
- gpr_log(GPR_INFO, "[cdslb %p] received CDS update from xds client %p: %s",
- this, xds_client_.get(), cluster_data.ToString().c_str());
+// This method will attempt to generate one or multiple entries of discovery
+// mechanism recursively:
+// For cluster types EDS or LOGICAL_DNS, one discovery mechanism entry may be
+// generated cluster name, type and other data from the CdsUpdate inserted into
+// the entry and the entry appended to the array of entries.
+// Note, discovery mechanism entry can be generated if an CdsUpdate is
+// available; otherwise, just return false. For cluster type AGGREGATE,
+// recursively call the method for each child cluster.
+bool CdsLb::GenerateDiscoveryMechanismForCluster(
+ const std::string& name, Json::Array* discovery_mechanisms,
+ std::set<std::string>* clusters_needed) {
+ clusters_needed->insert(name);
+ auto& state = watchers_[name];
+ // Create a new watcher if needed.
+ if (state.watcher == nullptr) {
+ auto watcher = absl::make_unique<ClusterWatcher>(Ref(), name);
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
+ gpr_log(GPR_INFO, "[cdslb %p] starting watch for cluster %s", this,
+ name.c_str());
+ }
+ state.watcher = watcher.get();
+ xds_client_->WatchClusterData(name, std::move(watcher));
+ return false;
}
- grpc_error* error = GRPC_ERROR_NONE;
- error = UpdateXdsCertificateProvider(cluster_data);
- if (error != GRPC_ERROR_NONE) {
- return OnError(error);
+ // Don't have the update we need yet.
+ if (!state.update.has_value()) return false;
+ // For AGGREGATE clusters, recursively expand to child clusters.
+ if (state.update->cluster_type == XdsApi::CdsUpdate::ClusterType::AGGREGATE) {
+ bool missing_cluster = false;
+ for (const std::string& child_name :
+ state.update->prioritized_cluster_names) {
+ if (!GenerateDiscoveryMechanismForCluster(
+ child_name, discovery_mechanisms, clusters_needed)) {
+ missing_cluster = true;
+ }
+ }
+ return !missing_cluster;
+ }
+ std::string type;
+ switch (state.update->cluster_type) {
+ case XdsApi::CdsUpdate::ClusterType::EDS:
+ type = "EDS";
+ break;
+ case XdsApi::CdsUpdate::ClusterType::LOGICAL_DNS:
+ type = "LOGICAL_DNS";
+ break;
+ default:
+ GPR_ASSERT(0);
+ break;
}
- // Construct config for child policy.
- Json::Object discovery_mechanism = {
- {"clusterName", config_->cluster()},
- {"max_concurrent_requests", cluster_data.max_concurrent_requests},
- {"type", "EDS"},
+ Json::Object mechanism = {
+ {"clusterName", name},
+ {"max_concurrent_requests", state.update->max_concurrent_requests},
+ {"type", std::move(type)},
};
- if (!cluster_data.eds_service_name.empty()) {
- discovery_mechanism["edsServiceName"] = cluster_data.eds_service_name;
+ if (!state.update->eds_service_name.empty()) {
+ mechanism["edsServiceName"] = state.update->eds_service_name;
}
- if (cluster_data.lrs_load_reporting_server_name.has_value()) {
- discovery_mechanism["lrsLoadReportingServerName"] =
- cluster_data.lrs_load_reporting_server_name.value();
+ if (state.update->lrs_load_reporting_server_name.has_value()) {
+ mechanism["lrsLoadReportingServerName"] =
+ state.update->lrs_load_reporting_server_name.value();
}
- Json::Object child_config = {
- {"discoveryMechanisms",
- Json::Array{
- discovery_mechanism,
- }},
- {"localityPickingPolicy",
- Json::Array{
- Json::Object{
- {"weighted_target_experimental",
- Json::Object{
- {"targets", Json::Object()},
- }},
- },
- }},
- {"endpointPickingPolicy",
- Json::Array{
- Json::Object{
- {"round_robin", Json::Object()},
- },
- }},
- };
- Json json = Json::Array{
- Json::Object{
- {"xds_cluster_resolver_experimental", std::move(child_config)},
- },
- };
+ discovery_mechanisms->emplace_back(std::move(mechanism));
+ return true;
+}
+
+void CdsLb::OnClusterChanged(const std::string& name,
+ XdsApi::CdsUpdate cluster_data) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
- std::string json_str = json.Dump(/*indent=*/1);
- gpr_log(GPR_INFO, "[cdslb %p] generated config for child policy: %s", this,
- json_str.c_str());
+ gpr_log(
+ GPR_INFO,
+ "[cdslb %p] received CDS update for cluster %s from xds client %p: %s",
+ this, name.c_str(), xds_client_.get(), cluster_data.ToString().c_str());
}
- RefCountedPtr<LoadBalancingPolicy::Config> config =
- LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(json, &error);
+ // Store the update in the map if we are still interested in watching this
+ // cluster (i.e., it is not cancelled already).
+ // If we've already deleted this entry, then this is an update notification
+ // that was scheduled before the deletion, so we can just ignore it.
+ auto it = watchers_.find(name);
+ if (it == watchers_.end()) return;
+ it->second.update = cluster_data;
+ // Take care of integration with new certificate code.
+ grpc_error* error = GRPC_ERROR_NONE;
+ error = UpdateXdsCertificateProvider(name, it->second.update.value());
if (error != GRPC_ERROR_NONE) {
- OnError(error);
- return;
+ return OnError(name, error);
}
- // Create child policy if not already present.
- if (child_policy_ == nullptr) {
- LoadBalancingPolicy::Args args;
- args.work_serializer = work_serializer();
- args.args = args_;
- args.channel_control_helper = absl::make_unique<Helper>(Ref());
- child_policy_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
- config->name(), std::move(args));
- if (child_policy_ == nullptr) {
- OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "failed to create child policy"));
- return;
+ // Scan the map starting from the root cluster to generate the list of
+ // discovery mechanisms. If we don't have some of the data we need (i.e., we
+ // just started up and not all watchers have returned data yet), then don't
+ // update the child policy at all.
+ Json::Array discovery_mechanisms;
+ std::set<std::string> clusters_needed;
+ if (GenerateDiscoveryMechanismForCluster(
+ config_->cluster(), &discovery_mechanisms, &clusters_needed)) {
+ // Construct config for child policy.
+ Json::Object xds_lb_policy;
+ if (cluster_data.lb_policy == "RING_HASH") {
+ std::string hash_function;
+ switch (cluster_data.hash_function) {
+ case XdsApi::CdsUpdate::HashFunction::XX_HASH:
+ hash_function = "XX_HASH";
+ break;
+ case XdsApi::CdsUpdate::HashFunction::MURMUR_HASH_2:
+ hash_function = "MURMUR_HASH_2";
+ break;
+ default:
+ GPR_ASSERT(0);
+ break;
+ }
+ xds_lb_policy["RING_HASH"] = Json::Object{
+ {"min_ring_size", cluster_data.min_ring_size},
+ {"max_ring_size", cluster_data.max_ring_size},
+ {"hash_function", hash_function},
+ };
+ } else {
+ xds_lb_policy["ROUND_ROBIN"] = Json::Object();
}
- grpc_pollset_set_add_pollset_set(child_policy_->interested_parties(),
- interested_parties());
+ Json::Object child_config = {
+ {"xdsLbPolicy",
+ Json::Array{
+ xds_lb_policy,
+ }},
+ {"discoveryMechanisms", std::move(discovery_mechanisms)},
+ };
+ Json json = Json::Array{
+ Json::Object{
+ {"xds_cluster_resolver_experimental", std::move(child_config)},
+ },
+ };
if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
- gpr_log(GPR_INFO, "[cdslb %p] created child policy %s (%p)", this,
- config->name(), child_policy_.get());
+ std::string json_str = json.Dump(/*indent=*/1);
+ gpr_log(GPR_INFO, "[cdslb %p] generated config for child policy: %s",
+ this, json_str.c_str());
}
+ RefCountedPtr<LoadBalancingPolicy::Config> config =
+ LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(json, &error);
+ if (error != GRPC_ERROR_NONE) {
+ OnError(name, error);
+ return;
+ }
+ // Create child policy if not already present.
+ if (child_policy_ == nullptr) {
+ LoadBalancingPolicy::Args args;
+ args.work_serializer = work_serializer();
+ args.args = args_;
+ args.channel_control_helper = absl::make_unique<Helper>(Ref());
+ child_policy_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
+ config->name(), std::move(args));
+ if (child_policy_ == nullptr) {
+ OnError(name, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "failed to create child policy"));
+ return;
+ }
+ grpc_pollset_set_add_pollset_set(child_policy_->interested_parties(),
+ interested_parties());
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
+ gpr_log(GPR_INFO, "[cdslb %p] created child policy %s (%p)", this,
+ config->name(), child_policy_.get());
+ }
+ }
+ // Update child policy.
+ UpdateArgs args;
+ args.config = std::move(config);
+ if (xds_certificate_provider_ != nullptr) {
+ grpc_arg arg_to_add = xds_certificate_provider_->MakeChannelArg();
+ args.args = grpc_channel_args_copy_and_add(args_, &arg_to_add, 1);
+ } else {
+ args.args = grpc_channel_args_copy(args_);
+ }
+ child_policy_->UpdateLocked(std::move(args));
}
- // Update child policy.
- UpdateArgs args;
- args.config = std::move(config);
- if (xds_certificate_provider_ != nullptr) {
- grpc_arg arg_to_add = xds_certificate_provider_->MakeChannelArg();
- args.args = grpc_channel_args_copy_and_add(args_, &arg_to_add, 1);
- } else {
- args.args = grpc_channel_args_copy(args_);
+ // Remove entries in watchers_ for any clusters not in clusters_needed
+ for (auto it = watchers_.begin(); it != watchers_.end();) {
+ const std::string& cluster_name = it->first;
+ if (clusters_needed.find(cluster_name) != clusters_needed.end()) {
+ ++it;
+ continue;
+ }
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) {
+ gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this,
+ cluster_name.c_str());
+ }
+ CancelClusterDataWatch(cluster_name, it->second.watcher,
+ /*delay_unsubscription=*/false);
+ it = watchers_.erase(it);
}
- child_policy_->UpdateLocked(std::move(args));
}
-void CdsLb::OnError(grpc_error* error) {
+void CdsLb::OnError(const std::string& name, grpc_error* error) {
gpr_log(GPR_ERROR, "[cdslb %p] xds error obtaining data for cluster %s: %s",
- this, config_->cluster().c_str(), grpc_error_string(error));
+ this, name.c_str(), grpc_error_string(error));
// Go into TRANSIENT_FAILURE if we have not yet created the child
// policy (i.e., we have not yet received data from xds). Otherwise,
// we keep running with the data we had previously.
}
}
-void CdsLb::OnResourceDoesNotExist() {
+void CdsLb::OnResourceDoesNotExist(const std::string& name) {
gpr_log(GPR_ERROR,
"[cdslb %p] CDS resource for %s does not exist -- reporting "
"TRANSIENT_FAILURE",
- this, config_->cluster().c_str());
+ this, name.c_str());
grpc_error* error =
grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
absl::StrCat("CDS resource \"", config_->cluster(),
}
grpc_error* CdsLb::UpdateXdsCertificateProvider(
- const XdsApi::CdsUpdate& cluster_data) {
+ const std::string& cluster_name, const XdsApi::CdsUpdate& cluster_data) {
// Early out if channel is not configured to use xds security.
grpc_channel_credentials* channel_credentials =
grpc_channel_credentials_find_in_args(args_);
xds_certificate_provider_ = nullptr;
return GRPC_ERROR_NONE;
}
+ if (xds_certificate_provider_ == nullptr) {
+ xds_certificate_provider_ = MakeRefCounted<XdsCertificateProvider>();
+ }
+ // Configure root cert.
absl::string_view root_provider_instance_name =
cluster_data.common_tls_context.combined_validation_context
.validation_context_certificate_provider_instance.instance_name;
absl::string_view root_provider_cert_name =
cluster_data.common_tls_context.combined_validation_context
.validation_context_certificate_provider_instance.certificate_name;
- absl::string_view identity_provider_instance_name =
- cluster_data.common_tls_context
- .tls_certificate_certificate_provider_instance.instance_name;
- absl::string_view identity_provider_cert_name =
- cluster_data.common_tls_context
- .tls_certificate_certificate_provider_instance.certificate_name;
RefCountedPtr<XdsCertificateProvider> new_root_provider;
if (!root_provider_instance_name.empty()) {
new_root_provider =
}
root_certificate_provider_ = std::move(new_root_provider);
}
+ xds_certificate_provider_->UpdateRootCertNameAndDistributor(
+ cluster_name, root_provider_cert_name,
+ root_certificate_provider_ == nullptr
+ ? nullptr
+ : root_certificate_provider_->distributor());
+ // Configure identity cert.
+ absl::string_view identity_provider_instance_name =
+ cluster_data.common_tls_context
+ .tls_certificate_certificate_provider_instance.instance_name;
+ absl::string_view identity_provider_cert_name =
+ cluster_data.common_tls_context
+ .tls_certificate_certificate_provider_instance.certificate_name;
RefCountedPtr<XdsCertificateProvider> new_identity_provider;
if (!identity_provider_instance_name.empty()) {
new_identity_provider =
}
identity_certificate_provider_ = std::move(new_identity_provider);
}
- const std::vector<XdsApi::StringMatcher>& match_subject_alt_names =
+ xds_certificate_provider_->UpdateIdentityCertNameAndDistributor(
+ cluster_name, identity_provider_cert_name,
+ identity_certificate_provider_ == nullptr
+ ? nullptr
+ : identity_certificate_provider_->distributor());
+ // Configure SAN matchers.
+ const std::vector<StringMatcher>& match_subject_alt_names =
cluster_data.common_tls_context.combined_validation_context
.default_validation_context.match_subject_alt_names;
- if (!root_provider_instance_name.empty() &&
- !identity_provider_instance_name.empty()) {
- // Using mTLS configuration
- if (xds_certificate_provider_ != nullptr &&
- xds_certificate_provider_->ProvidesRootCerts() &&
- xds_certificate_provider_->ProvidesIdentityCerts()) {
- xds_certificate_provider_->UpdateRootCertNameAndDistributor(
- root_provider_cert_name, root_certificate_provider_->distributor());
- xds_certificate_provider_->UpdateIdentityCertNameAndDistributor(
- identity_provider_cert_name,
- identity_certificate_provider_->distributor());
- xds_certificate_provider_->UpdateSubjectAlternativeNameMatchers(
- match_subject_alt_names);
- } else {
- // Existing xDS certificate provider does not have mTLS configuration.
- // Create new certificate provider so that new subchannel connectors are
- // created.
- xds_certificate_provider_ = MakeRefCounted<XdsCertificateProvider>(
- root_provider_cert_name, root_certificate_provider_->distributor(),
- identity_provider_cert_name,
- identity_certificate_provider_->distributor(),
- match_subject_alt_names);
- }
- } else if (!root_provider_instance_name.empty()) {
- // Using TLS configuration
- if (xds_certificate_provider_ != nullptr &&
- xds_certificate_provider_->ProvidesRootCerts() &&
- !xds_certificate_provider_->ProvidesIdentityCerts()) {
- xds_certificate_provider_->UpdateRootCertNameAndDistributor(
- root_provider_cert_name, root_certificate_provider_->distributor());
- xds_certificate_provider_->UpdateSubjectAlternativeNameMatchers(
- match_subject_alt_names);
- } else {
- // Existing xDS certificate provider does not have TLS configuration.
- // Create new certificate provider so that new subchannel connectors are
- // created.
- xds_certificate_provider_ = MakeRefCounted<XdsCertificateProvider>(
- root_provider_cert_name, root_certificate_provider_->distributor(),
- "", nullptr, match_subject_alt_names);
- }
- } else {
- // No configuration provided.
- xds_certificate_provider_ = nullptr;
- }
+ xds_certificate_provider_->UpdateSubjectAlternativeNameMatchers(
+ cluster_name, match_subject_alt_names);
return GRPC_ERROR_NONE;
}
+void CdsLb::CancelClusterDataWatch(absl::string_view cluster_name,
+ XdsClient::ClusterWatcherInterface* watcher,
+ bool delay_unsubscription) {
+ if (xds_certificate_provider_ != nullptr) {
+ std::string name(cluster_name);
+ xds_certificate_provider_->UpdateRootCertNameAndDistributor(name, "",
+ nullptr);
+ xds_certificate_provider_->UpdateIdentityCertNameAndDistributor(name, "",
+ nullptr);
+ xds_certificate_provider_->UpdateSubjectAlternativeNameMatchers(name, {});
+ }
+ xds_client_->CancelClusterDataWatch(cluster_name, watcher,
+ delay_unsubscription);
+}
//
// factory
//
return nullptr;
}
std::vector<grpc_error*> error_list;
+ // cluster name.
std::string cluster;
auto it = json.object_value().find("cluster");
if (it == json.object_value().end()) {
// Set by xds_cluster_impl LB policy and used by GoogleDefaultCredentials.
#define GRPC_ARG_XDS_CLUSTER_NAME "grpc.internal.xds_cluster_name"
+// For testing purpose, this channel arg indicating xds_cluster_resolver LB
+// policy should use the fake DNS resolver to resolve logical dns cluster.
+#define GRPC_ARG_XDS_LOGICAL_DNS_CLUSTER_FAKE_RESOLVER_RESPONSE_GENERATOR \
+ "grpc.internal.xds_logical_dns_cluster_fake_resolver_response_generator"
+
#endif // GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_CHANNEL_ARGS_H
const absl::optional<std::string>& lrs_load_reporting_server_name() const {
return lrs_load_reporting_server_name_;
};
- const uint32_t max_concurrent_requests() const {
- return max_concurrent_requests_;
- }
+ uint32_t max_concurrent_requests() const { return max_concurrent_requests_; }
RefCountedPtr<XdsApi::EdsUpdate::DropConfig> drop_config() const {
return drop_config_;
}
#include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h"
#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h"
#include "src/core/ext/filters/client_channel/lb_policy/xds/xds.h"
+#include "src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h"
#include "src/core/ext/filters/client_channel/lb_policy_factory.h"
#include "src/core/ext/filters/client_channel/lb_policy_registry.h"
+#include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
#include "src/core/ext/filters/client_channel/resolver_registry.h"
#include "src/core/ext/filters/client_channel/server_address.h"
#include "src/core/ext/xds/xds_channel_args.h"
};
XdsClusterResolverLbConfig(
- std::vector<DiscoveryMechanism> discovery_mechanisms,
- Json locality_picking_policy, Json endpoint_picking_policy)
+ std::vector<DiscoveryMechanism> discovery_mechanisms, Json xds_lb_policy)
: discovery_mechanisms_(std::move(discovery_mechanisms)),
- locality_picking_policy_(std::move(locality_picking_policy)),
- endpoint_picking_policy_(std::move(endpoint_picking_policy)) {}
+ xds_lb_policy_(std::move(xds_lb_policy)) {}
const char* name() const override { return kXdsClusterResolver; }
-
const std::vector<DiscoveryMechanism>& discovery_mechanisms() const {
return discovery_mechanisms_;
}
- const Json& locality_picking_policy() const {
- return locality_picking_policy_;
- }
- const Json& endpoint_picking_policy() const {
- return endpoint_picking_policy_;
- }
+
+ const Json& xds_lb_policy() const { return xds_lb_policy_; }
private:
std::vector<DiscoveryMechanism> discovery_mechanisms_;
- Json locality_picking_policy_;
- Json endpoint_picking_policy_;
+ Json xds_lb_policy_;
};
// Xds Cluster Resolver LB policy.
void UpdateLocked(UpdateArgs args) override;
void ResetBackoffLocked() override;
+ void ExitIdleLocked() override;
private:
// Discovery Mechanism Base class
: parent_(std::move(xds_cluster_resolver_lb)), index_(index) {}
virtual void Start() = 0;
void Orphan() override = 0;
+ virtual Json::Array override_child_policy() = 0;
+ virtual bool disable_reresolution() = 0;
// Caller must ensure that config_ is set before calling.
const absl::string_view GetXdsClusterResolverResourceName() const {
: DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
void Start() override;
void Orphan() override;
+ Json::Array override_child_policy() override { return Json::Array{}; }
+ bool disable_reresolution() override { return true; }
private:
class EndpointWatcher : public XdsClient::EndpointWatcherInterface {
: DiscoveryMechanism(std::move(xds_cluster_resolver_lb), index) {}
void Start() override;
void Orphan() override;
+ Json::Array override_child_policy() override {
+ return Json::Array{
+ Json::Object{
+ {"pick_first", Json::Object()},
+ },
+ };
+ }
+ bool disable_reresolution() override { return false; };
private:
class ResolverResultHandler : public Resolver::ResultHandler {
//
void XdsClusterResolverLb::LogicalDNSDiscoveryMechanism::Start() {
+ std::string target = parent()->server_name_;
+ grpc_channel_args* args = nullptr;
+ FakeResolverResponseGenerator* fake_resolver_response_generator =
+ grpc_channel_args_find_pointer<FakeResolverResponseGenerator>(
+ parent()->args_,
+ GRPC_ARG_XDS_LOGICAL_DNS_CLUSTER_FAKE_RESOLVER_RESPONSE_GENERATOR);
+ if (fake_resolver_response_generator != nullptr) {
+ target = absl::StrCat("fake:", target);
+ grpc_arg new_arg = FakeResolverResponseGenerator::MakeChannelArg(
+ fake_resolver_response_generator);
+ args = grpc_channel_args_copy_and_add(parent()->args_, &new_arg, 1);
+ } else {
+ args = grpc_channel_args_copy(parent()->args_);
+ }
resolver_ = ResolverRegistry::CreateResolver(
- parent()->server_name_.c_str(), parent()->args_,
- grpc_pollset_set_create(), parent()->work_serializer(),
+ target.c_str(), args, parent()->interested_parties(),
+ parent()->work_serializer(),
absl::make_unique<ResolverResultHandler>(
Ref(DEBUG_LOCATION, "LogicalDNSDiscoveryMechanism")));
+ grpc_channel_args_destroy(args);
if (resolver_ == nullptr) {
parent()->OnResourceDoesNotExist(index());
return;
XdsApi::EdsUpdate update;
XdsApi::EdsUpdate::Priority::Locality locality;
locality.name = MakeRefCounted<XdsLocalityName>("", "", "");
+ locality.lb_weight = 1;
locality.endpoints = std::move(result.addresses);
- update.priorities[0].localities.emplace(locality.name.get(),
- std::move(locality));
+ XdsApi::EdsUpdate::Priority priority;
+ priority.localities.emplace(locality.name.get(), std::move(locality));
+ update.priorities.emplace_back(std::move(priority));
discovery_mechanism_->parent()->OnEndpointChanged(
discovery_mechanism_->index(), std::move(update));
}
}
}
+void XdsClusterResolverLb::ExitIdleLocked() {
+ if (child_policy_ != nullptr) child_policy_->ExitIdleLocked();
+}
+
void XdsClusterResolverLb::OnEndpointChanged(size_t index,
XdsApi::EdsUpdate update) {
if (shutting_down_) return;
discovery_mechanisms_[index].pending_priority_list =
std::move(update.priorities);
discovery_mechanisms_[index].first_update_received = true;
- if (!discovery_mechanisms_[0].first_update_received) {
- // We have not yet received an update for index 0, so wait until that
- // happens to create the child policy.
- return;
+ // If any discovery mechanism has not received its first update,
+ // wait until that happens before creating the child policy.
+ // TODO(roth): If this becomes problematic in the future (e.g., a
+ // secondary discovery mechanism delaying us from starting up at all),
+ // we can consider some sort of optimization whereby we can create the
+ // priority policy with only a subset of its children. But we need to
+ // make sure not to get into a situation where the priority policy
+ // will put the channel into TRANSIENT_FAILURE instead of CONNECTING
+ // while we're still waiting for the other discovery mechanism(s).
+ for (DiscoveryMechanismEntry& mechanism : discovery_mechanisms_) {
+ if (!mechanism.first_update_received) return;
}
// Construct new priority list.
XdsApi::EdsUpdate::PriorityList priority_list;
MakeHierarchicalPathAttribute(hierarchical_path))
.WithAttribute(kXdsLocalityNameAttributeKey,
absl::make_unique<XdsLocalityAttribute>(
- locality_name->Ref())));
+ locality_name->Ref()))
+ .WithAttribute(ServerAddressWeightAttribute::
+ kServerAddressWeightAttributeKey,
+ absl::make_unique<ServerAddressWeightAttribute>(
+ locality.lb_weight)));
}
}
}
Json::Object priority_children;
Json::Array priority_priorities;
// Setting up index to iterate through the discovery mechanisms and keeping
- // track the discovery_mechanism each prioirty belongs to.
+ // track the discovery_mechanism each priority belongs to.
size_t discovery_index = 0;
// Setting up num_priorities_remaining to track the priorities in each
// discovery_mechanism.
size_t num_priorities_remaining_in_discovery =
discovery_mechanisms_[discovery_index].num_priorities;
for (size_t priority = 0; priority < priority_list_.size(); ++priority) {
- // Each prioirty in the priority_list_ should correspond to a priority in a
- // discovery mechanism in discovery_mechanisms_ (both in the same order).
- // Keeping track of the discovery_mechanism each prioirty belongs to.
- if (num_priorities_remaining_in_discovery == 0) {
- ++discovery_index;
- num_priorities_remaining_in_discovery =
- discovery_mechanisms_[discovery_index].num_priorities;
+ Json child_policy;
+ if (!discovery_mechanisms_[discovery_index]
+ .discovery_mechanism->override_child_policy()
+ .empty()) {
+ child_policy = discovery_mechanisms_[discovery_index]
+ .discovery_mechanism->override_child_policy();
} else {
- --num_priorities_remaining_in_discovery;
- }
- const auto& localities = priority_list_[priority].localities;
- Json::Object weighted_targets;
- for (const auto& p : localities) {
- XdsLocalityName* locality_name = p.first;
- const auto& locality = p.second;
- // Construct JSON object containing locality name.
- Json::Object locality_name_json;
- if (!locality_name->region().empty()) {
- locality_name_json["region"] = locality_name->region();
- }
- if (!locality_name->zone().empty()) {
- locality_name_json["zone"] = locality_name->zone();
- }
- if (!locality_name->sub_zone().empty()) {
- locality_name_json["subzone"] = locality_name->sub_zone();
+ const auto& xds_lb_policy = config_->xds_lb_policy().object_value();
+ if (xds_lb_policy.find("ROUND_ROBIN") != xds_lb_policy.end()) {
+ const auto& localities = priority_list_[priority].localities;
+ Json::Object weighted_targets;
+ for (const auto& p : localities) {
+ XdsLocalityName* locality_name = p.first;
+ const auto& locality = p.second;
+ // Construct JSON object containing locality name.
+ Json::Object locality_name_json;
+ if (!locality_name->region().empty()) {
+ locality_name_json["region"] = locality_name->region();
+ }
+ if (!locality_name->zone().empty()) {
+ locality_name_json["zone"] = locality_name->zone();
+ }
+ if (!locality_name->sub_zone().empty()) {
+ locality_name_json["subzone"] = locality_name->sub_zone();
+ }
+ // Add weighted target entry.
+ weighted_targets[locality_name->AsHumanReadableString()] =
+ Json::Object{
+ {"weight", locality.lb_weight},
+ {"childPolicy",
+ Json::Array{
+ Json::Object{
+ {"round_robin", Json::Object()},
+ },
+ }},
+ };
+ }
+ // Construct locality-picking policy.
+ // Start with field from our config and add the "targets" field.
+ child_policy = Json::Array{
+ Json::Object{
+ {"weighted_target_experimental",
+ Json::Object{
+ {"targets", Json::Object()},
+ }},
+ },
+ };
+ Json::Object& config =
+ *(*child_policy.mutable_array())[0].mutable_object();
+ auto it = config.begin();
+ GPR_ASSERT(it != config.end());
+ (*it->second.mutable_object())["targets"] = std::move(weighted_targets);
+ } else {
+ auto it = xds_lb_policy.find("RING_HASH");
+ GPR_ASSERT(it != xds_lb_policy.end());
+ Json::Object ring_hash_experimental_policy = it->second.object_value();
+ child_policy = Json::Array{
+ Json::Object{
+ {"ring_hash_experimental", ring_hash_experimental_policy},
+ },
+ };
}
- // Add weighted target entry.
- weighted_targets[locality_name->AsHumanReadableString()] = Json::Object{
- {"weight", locality.lb_weight},
- {"childPolicy", config_->endpoint_picking_policy()},
- };
}
- // Construct locality-picking policy.
- // Start with field from our config and add the "targets" field.
- Json locality_picking_config = config_->locality_picking_policy();
- Json::Object& config =
- *(*locality_picking_config.mutable_array())[0].mutable_object();
- auto it = config.begin();
- GPR_ASSERT(it != config.end());
- (*it->second.mutable_object())["targets"] = std::move(weighted_targets);
// Wrap it in the drop policy.
Json::Array drop_categories;
if (discovery_mechanisms_[discovery_index].drop_config != nullptr) {
.discovery_mechanism->GetLrsClusterKey();
Json::Object xds_cluster_impl_config = {
{"clusterName", std::string(lrs_key.first)},
- {"childPolicy", std::move(locality_picking_config)},
+ {"childPolicy", std::move(child_policy)},
{"dropCategories", std::move(drop_categories)},
{"maxConcurrentRequests",
config_->discovery_mechanisms()[discovery_index]
const size_t child_number = priority_child_numbers_[priority];
std::string child_name = absl::StrCat("child", child_number);
priority_priorities.emplace_back(child_name);
- priority_children[child_name] = Json::Object{
+ Json::Object child_config = {
{"config", std::move(locality_picking_policy)},
- {"ignore_reresolution_requests", true},
};
+ if (discovery_mechanisms_[discovery_index]
+ .discovery_mechanism->disable_reresolution()) {
+ child_config["ignore_reresolution_requests"] = true;
+ }
+ priority_children[child_name] = std::move(child_config);
+ // Each priority in the priority_list_ should correspond to a priority in a
+ // discovery mechanism in discovery_mechanisms_ (both in the same order).
+ // Keeping track of the discovery_mechanism each priority belongs to.
+ --num_priorities_remaining_in_discovery;
+ while (num_priorities_remaining_in_discovery == 0 &&
+ discovery_index < discovery_mechanisms_.size() - 1) {
+ ++discovery_index;
+ num_priorities_remaining_in_discovery =
+ discovery_mechanisms_[discovery_index].num_priorities;
+ }
}
// There should be matching number of priorities in discovery_mechanisms_ and
// in priority_list_; therefore at the end of looping through all the
discovery_mechanisms.emplace_back(std::move(discovery_mechanism));
}
}
- // Locality-picking policy.
- Json locality_picking_policy;
- it = json.object_value().find("localityPickingPolicy");
- if (it == json.object_value().end()) {
- locality_picking_policy = Json::Array{
- Json::Object{
- {"weighted_target_experimental",
- Json::Object{
- {"targets", Json::Object()},
- }},
- },
- };
- } else {
- locality_picking_policy = it->second;
- }
- grpc_error* parse_error = GRPC_ERROR_NONE;
- if (LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
- locality_picking_policy, &parse_error) == nullptr) {
- GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
- error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
- "localityPickingPolicy", &parse_error, 1));
- GRPC_ERROR_UNREF(parse_error);
- }
- // Endpoint-picking policy. Called "childPolicy" for xds policy.
- Json endpoint_picking_policy;
- it = json.object_value().find("endpointPickingPolicy");
- if (it == json.object_value().end()) {
- endpoint_picking_policy = Json::Array{
- Json::Object{
- {"round_robin", Json::Object()},
- },
- };
- } else {
- endpoint_picking_policy = it->second;
- }
- parse_error = GRPC_ERROR_NONE;
- if (LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(
- endpoint_picking_policy, &parse_error) == nullptr) {
- GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE);
- error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
- "endpointPickingPolicy", &parse_error, 1));
- GRPC_ERROR_UNREF(parse_error);
- }
if (discovery_mechanisms.empty()) {
error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"field:discovery_mechanism error:list is missing or empty"));
}
+ Json xds_lb_policy = Json::Object{
+ {"ROUND_ROBIN", Json::Object()},
+ };
+ it = json.object_value().find("xdsLbPolicy");
+ if (it != json.object_value().end()) {
+ if (it->second.type() != Json::Type::ARRAY) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:xdsLbPolicy error:type should be array"));
+ } else {
+ const Json::Array& array = it->second.array_value();
+ for (size_t i = 0; i < array.size(); ++i) {
+ if (array[i].type() != Json::Type::OBJECT) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:xdsLbPolicy error:element should be of type object"));
+ continue;
+ }
+ const Json::Object& policy = array[i].object_value();
+ auto policy_it = policy.find("ROUND_ROBIN");
+ if (policy_it != policy.end()) {
+ if (policy_it->second.type() != Json::Type::OBJECT) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:ROUND_ROBIN error:type should be object"));
+ }
+ break;
+ }
+ policy_it = policy.find("RING_HASH");
+ if (policy_it != policy.end()) {
+ if (policy_it->second.type() != Json::Type::OBJECT) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:RING_HASH error:type should be object"));
+ continue;
+ }
+ // TODO(donnadionne): Move this to a method in
+ // ring_hash_experimental and call it here.
+ const Json::Object& ring_hash = policy_it->second.object_value();
+ xds_lb_policy = array[i];
+ size_t min_ring_size = 1024;
+ size_t max_ring_size = 8388608;
+ auto ring_hash_it = ring_hash.find("min_ring_size");
+ if (ring_hash_it == ring_hash.end()) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:min_ring_size missing"));
+ } else if (ring_hash_it->second.type() != Json::Type::NUMBER) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:min_ring_size error: should be of "
+ "number"));
+ } else {
+ min_ring_size = gpr_parse_nonnegative_int(
+ ring_hash_it->second.string_value().c_str());
+ }
+ ring_hash_it = ring_hash.find("max_ring_size");
+ if (ring_hash_it == ring_hash.end()) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:max_ring_size missing"));
+ } else if (ring_hash_it->second.type() != Json::Type::NUMBER) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:max_ring_size error: should be of "
+ "number"));
+ } else {
+ max_ring_size = gpr_parse_nonnegative_int(
+ ring_hash_it->second.string_value().c_str());
+ }
+ if (min_ring_size <= 0 || min_ring_size > 8388608 ||
+ max_ring_size <= 0 || max_ring_size > 8388608 ||
+ min_ring_size > max_ring_size) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:max_ring_size and or min_ring_size error: "
+ "values need to be in the range of 1 to 8388608 "
+ "and max_ring_size cannot be smaller than "
+ "min_ring_size"));
+ }
+ ring_hash_it = ring_hash.find("hash_function");
+ if (ring_hash_it == ring_hash.end()) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:hash_function missing"));
+ } else if (ring_hash_it->second.type() != Json::Type::STRING) {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:hash_function error: should be a "
+ "string"));
+ } else if (ring_hash_it->second.string_value() != "XX_HASH" &&
+ ring_hash_it->second.string_value() != "MURMUR_HASH_2") {
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "field:hash_function error: unsupported "
+ "hash_function"));
+ }
+ break;
+ }
+ }
+ }
+ }
// Construct config.
if (error_list.empty()) {
return MakeRefCounted<XdsClusterResolverLbConfig>(
- std::move(discovery_mechanisms), std::move(locality_picking_policy),
- std::move(endpoint_picking_policy));
+ std::move(discovery_mechanisms), std::move(xds_lb_policy));
} else {
*error = GRPC_ERROR_CREATE_FROM_VECTOR(
"xds_cluster_resolver_experimental LB policy config", &error_list);
}
OrphanablePtr<LoadBalancingPolicy> CreateLoadBalancingPolicy(
- const char* name, LoadBalancingPolicy::Args args) const override {
+ const char* /*name*/, LoadBalancingPolicy::Args args) const override {
return MakeOrphanable<XdsClusterResolverLb>(xds_client_, std::move(args));
}
// Resolver
//
-Resolver::Resolver(std::shared_ptr<WorkSerializer> work_serializer,
- std::unique_ptr<ResultHandler> result_handler)
+Resolver::Resolver()
: InternallyRefCounted(GRPC_TRACE_FLAG_ENABLED(grpc_trace_resolver_refcount)
? "Resolver"
- : nullptr),
- work_serializer_(std::move(work_serializer)),
- result_handler_(std::move(result_handler)) {}
+ : nullptr) {}
//
// Resolver::Result
}
protected:
- Resolver(std::shared_ptr<WorkSerializer> work_serializer,
- std::unique_ptr<ResultHandler> result_handler);
+ Resolver();
/// Shuts down the resolver.
virtual void ShutdownLocked() = 0;
-
- std::shared_ptr<WorkSerializer> work_serializer() const {
- return work_serializer_;
- }
-
- ResultHandler* result_handler() const { return result_handler_.get(); }
-
- private:
- std::shared_ptr<WorkSerializer> work_serializer_;
- std::unique_ptr<ResultHandler> result_handler_;
};
} // namespace grpc_core
std::string name_to_resolve_;
/// channel args
grpc_channel_args* channel_args_;
- /// whether to request the service config
- bool request_service_config_;
+ std::shared_ptr<WorkSerializer> work_serializer_;
+ std::unique_ptr<ResultHandler> result_handler_;
/// pollset_set to drive the name resolution process
grpc_pollset_set* interested_parties_;
+
+ /// whether to request the service config
+ bool request_service_config_;
+ // whether or not to enable SRV DNS queries
+ bool enable_srv_queries_;
+ // timeout in milliseconds for active DNS queries
+ int query_timeout_ms_;
+ /// min interval between DNS requests
+ grpc_millis min_time_between_resolutions_;
+
/// closures used by the work_serializer
grpc_closure on_next_resolution_;
grpc_closure on_resolved_;
/// next resolution timer
bool have_next_resolution_timer_ = false;
grpc_timer next_resolution_timer_;
- /// min interval between DNS requests
- grpc_millis min_time_between_resolutions_;
/// timestamp of last DNS request
grpc_millis last_resolution_timestamp_ = -1;
/// retry backoff state
char* service_config_json_ = nullptr;
// has shutdown been initiated
bool shutdown_initiated_ = false;
- // timeout in milliseconds for active DNS queries
- int query_timeout_ms_;
- // whether or not to enable SRV DNS queries
- bool enable_srv_queries_;
};
AresDnsResolver::AresDnsResolver(ResolverArgs args)
- : Resolver(std::move(args.work_serializer), std::move(args.result_handler)),
+ : dns_server_(args.uri.authority()),
+ name_to_resolve_(absl::StripPrefix(args.uri.path(), "/")),
+ channel_args_(grpc_channel_args_copy(args.args)),
+ work_serializer_(std::move(args.work_serializer)),
+ result_handler_(std::move(args.result_handler)),
+ interested_parties_(args.pollset_set),
+ request_service_config_(!grpc_channel_args_find_bool(
+ channel_args_, GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION, true)),
+ enable_srv_queries_(grpc_channel_args_find_bool(
+ channel_args_, GRPC_ARG_DNS_ENABLE_SRV_QUERIES, false)),
+ query_timeout_ms_(grpc_channel_args_find_integer(
+ channel_args_, GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS,
+ {GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS, 0, INT_MAX})),
+ min_time_between_resolutions_(grpc_channel_args_find_integer(
+ channel_args_, GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS,
+ {1000 * 30, 0, INT_MAX})),
backoff_(
BackOff::Options()
.set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS *
.set_multiplier(GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER)
.set_jitter(GRPC_DNS_RECONNECT_JITTER)
.set_max_backoff(GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) {
- // Closure Initialization
+ // Closure initialization.
GRPC_CLOSURE_INIT(&on_next_resolution_, OnNextResolution, this,
grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_INIT(&on_resolved_, OnResolved, this, grpc_schedule_on_exec_ctx);
- // Get name to resolve from URI path.
- name_to_resolve_ = std::string(absl::StripPrefix(args.uri.path(), "/"));
- // Get DNS server from URI authority.
- dns_server_ = args.uri.authority();
- channel_args_ = grpc_channel_args_copy(args.args);
- // Disable service config option
- const grpc_arg* arg = grpc_channel_args_find(
- channel_args_, GRPC_ARG_SERVICE_CONFIG_DISABLE_RESOLUTION);
- request_service_config_ = !grpc_channel_arg_get_bool(arg, true);
- // Min time b/t resolutions option
- arg = grpc_channel_args_find(channel_args_,
- GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS);
- min_time_between_resolutions_ =
- grpc_channel_arg_get_integer(arg, {1000 * 30, 0, INT_MAX});
- // Enable SRV queries option
- arg = grpc_channel_args_find(channel_args_, GRPC_ARG_DNS_ENABLE_SRV_QUERIES);
- enable_srv_queries_ = grpc_channel_arg_get_bool(arg, false);
- interested_parties_ = grpc_pollset_set_create();
- if (args.pollset_set != nullptr) {
- grpc_pollset_set_add_pollset_set(interested_parties_, args.pollset_set);
- }
-
- const grpc_arg* query_timeout_ms_arg =
- grpc_channel_args_find(channel_args_, GRPC_ARG_DNS_ARES_QUERY_TIMEOUT_MS);
- query_timeout_ms_ = grpc_channel_arg_get_integer(
- query_timeout_ms_arg,
- {GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS, 0, INT_MAX});
}
AresDnsResolver::~AresDnsResolver() {
GRPC_CARES_TRACE_LOG("resolver:%p destroying AresDnsResolver", this);
- grpc_pollset_set_destroy(interested_parties_);
grpc_channel_args_destroy(channel_args_);
}
void AresDnsResolver::OnNextResolution(void* arg, grpc_error* error) {
AresDnsResolver* r = static_cast<AresDnsResolver*>(arg);
GRPC_ERROR_REF(error); // ref owned by lambda
- r->work_serializer()->Run([r, error]() { r->OnNextResolutionLocked(error); },
- DEBUG_LOCATION);
+ r->work_serializer_->Run([r, error]() { r->OnNextResolutionLocked(error); },
+ DEBUG_LOCATION);
}
void AresDnsResolver::OnNextResolutionLocked(grpc_error* error) {
void AresDnsResolver::OnResolved(void* arg, grpc_error* error) {
AresDnsResolver* r = static_cast<AresDnsResolver*>(arg);
GRPC_ERROR_REF(error); // ref owned by lambda
- r->work_serializer()->Run([r, error]() { r->OnResolvedLocked(error); },
- DEBUG_LOCATION);
+ r->work_serializer_->Run([r, error]() { r->OnResolvedLocked(error); },
+ DEBUG_LOCATION);
}
void AresDnsResolver::OnResolvedLocked(grpc_error* error) {
}
result.args = grpc_channel_args_copy_and_add(channel_args_, new_args.data(),
new_args.size());
- result_handler()->ReturnResult(std::move(result));
+ result_handler_->ReturnResult(std::move(result));
addresses_.reset();
balancer_addresses_.reset();
// Reset backoff state so that we start from the beginning when the
grpc_error_string(error));
std::string error_message =
absl::StrCat("DNS resolution failed for service: ", name_to_resolve_);
- result_handler()->ReturnError(grpc_error_set_int(
+ result_handler_->ReturnError(grpc_error_set_int(
GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(error_message.c_str(),
&error, 1),
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
interested_parties_, &on_resolved_, &addresses_,
enable_srv_queries_ ? &balancer_addresses_ : nullptr,
request_service_config_ ? &service_config_json_ : nullptr,
- query_timeout_ms_, work_serializer());
+ query_timeout_ms_, work_serializer_);
last_resolution_timestamp_ = grpc_core::ExecCtx::Get()->Now();
GRPC_CARES_TRACE_LOG("resolver:%p Started resolving. pending_request_:%p",
this, pending_request_);
std::shared_ptr<grpc_core::WorkSerializer> work_serializer;
/** a list of grpc_fd that this event driver is currently using. */
fd_node* fds;
- /** is this event driver currently working? */
- bool working;
/** is this event driver being shut down */
bool shutting_down;
/** request object that's using this ev driver */
void grpc_ares_ev_driver_on_queries_complete_locked(
grpc_ares_ev_driver* ev_driver) {
- // We mark the event driver as being shut down. If the event driver
- // is working, grpc_ares_notify_on_event_locked will shut down the
- // fds; if it's not working, there are no fds to shut down.
+ // We mark the event driver as being shut down.
+ // grpc_ares_notify_on_event_locked will shut down any remaining
+ // fds.
ev_driver->shutting_down = true;
grpc_timer_cancel(&ev_driver->query_timeout);
grpc_timer_cancel(&ev_driver->ares_backup_poll_alarm);
}
}
ev_driver->fds = new_list;
- // If the ev driver has no working fd, all the tasks are done.
- if (new_list == nullptr) {
- ev_driver->working = false;
- GRPC_CARES_TRACE_LOG("request:%p ev driver stop working",
- ev_driver->request);
- }
}
void grpc_ares_ev_driver_start_locked(grpc_ares_ev_driver* ev_driver) {
- if (!ev_driver->working) {
- ev_driver->working = true;
- grpc_ares_notify_on_event_locked(ev_driver);
- // Initialize overall DNS resolution timeout alarm
- grpc_millis timeout =
- ev_driver->query_timeout_ms == 0
- ? GRPC_MILLIS_INF_FUTURE
- : ev_driver->query_timeout_ms + grpc_core::ExecCtx::Get()->Now();
- GRPC_CARES_TRACE_LOG(
- "request:%p ev_driver=%p grpc_ares_ev_driver_start_locked. timeout in "
- "%" PRId64 " ms",
- ev_driver->request, ev_driver, timeout);
- grpc_ares_ev_driver_ref(ev_driver);
- GRPC_CLOSURE_INIT(&ev_driver->on_timeout_locked, on_timeout, ev_driver,
- grpc_schedule_on_exec_ctx);
- grpc_timer_init(&ev_driver->query_timeout, timeout,
- &ev_driver->on_timeout_locked);
- // Initialize the backup poll alarm
- grpc_millis next_ares_backup_poll_alarm =
- calculate_next_ares_backup_poll_alarm_ms(ev_driver);
- grpc_ares_ev_driver_ref(ev_driver);
- GRPC_CLOSURE_INIT(&ev_driver->on_ares_backup_poll_alarm_locked,
- on_ares_backup_poll_alarm, ev_driver,
- grpc_schedule_on_exec_ctx);
- grpc_timer_init(&ev_driver->ares_backup_poll_alarm,
- next_ares_backup_poll_alarm,
- &ev_driver->on_ares_backup_poll_alarm_locked);
- }
+ grpc_ares_notify_on_event_locked(ev_driver);
+ // Initialize overall DNS resolution timeout alarm
+ grpc_millis timeout =
+ ev_driver->query_timeout_ms == 0
+ ? GRPC_MILLIS_INF_FUTURE
+ : ev_driver->query_timeout_ms + grpc_core::ExecCtx::Get()->Now();
+ GRPC_CARES_TRACE_LOG(
+ "request:%p ev_driver=%p grpc_ares_ev_driver_start_locked. timeout in "
+ "%" PRId64 " ms",
+ ev_driver->request, ev_driver, timeout);
+ grpc_ares_ev_driver_ref(ev_driver);
+ GRPC_CLOSURE_INIT(&ev_driver->on_timeout_locked, on_timeout, ev_driver,
+ grpc_schedule_on_exec_ctx);
+ grpc_timer_init(&ev_driver->query_timeout, timeout,
+ &ev_driver->on_timeout_locked);
+ // Initialize the backup poll alarm
+ grpc_millis next_ares_backup_poll_alarm =
+ calculate_next_ares_backup_poll_alarm_ms(ev_driver);
+ grpc_ares_ev_driver_ref(ev_driver);
+ GRPC_CLOSURE_INIT(&ev_driver->on_ares_backup_poll_alarm_locked,
+ on_ares_backup_poll_alarm, ev_driver,
+ grpc_schedule_on_exec_ctx);
+ grpc_timer_init(&ev_driver->ares_backup_poll_alarm,
+ next_ares_backup_poll_alarm,
+ &ev_driver->on_ares_backup_poll_alarm_locked);
}
static void noop_inject_channel_config(ares_channel /*channel*/) {}
gpr_ref_init(&(*ev_driver)->refs, 1);
(*ev_driver)->pollset_set = pollset_set;
(*ev_driver)->fds = nullptr;
- (*ev_driver)->working = false;
(*ev_driver)->shutting_down = false;
(*ev_driver)->request = request;
(*ev_driver)->polled_fd_factory =
r, srv_it->host, htons(srv_it->port), true /* is_balancer */, "A");
ares_gethostbyname(r->ev_driver->channel, hr->host, AF_INET,
on_hostbyname_done_locked, hr);
- grpc_ares_ev_driver_start_locked(r->ev_driver);
+ grpc_ares_notify_on_event_locked(r->ev_driver);
}
}
if (reply != nullptr) {
std::string name_to_resolve_;
/// channel args
grpc_channel_args* channel_args_ = nullptr;
+ std::shared_ptr<WorkSerializer> work_serializer_;
+ std::unique_ptr<ResultHandler> result_handler_;
/// pollset_set to drive the name resolution process
grpc_pollset_set* interested_parties_ = nullptr;
/// are we shutting down?
};
NativeDnsResolver::NativeDnsResolver(ResolverArgs args)
- : Resolver(std::move(args.work_serializer), std::move(args.result_handler)),
+ : name_to_resolve_(absl::StripPrefix(args.uri.path(), "/")),
+ channel_args_(grpc_channel_args_copy(args.args)),
+ work_serializer_(std::move(args.work_serializer)),
+ result_handler_(std::move(args.result_handler)),
+ interested_parties_(grpc_pollset_set_create()),
+ min_time_between_resolutions_(grpc_channel_args_find_integer(
+ channel_args_, GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS,
+ {1000 * 30, 0, INT_MAX})),
backoff_(
BackOff::Options()
.set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS *
.set_multiplier(GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER)
.set_jitter(GRPC_DNS_RECONNECT_JITTER)
.set_max_backoff(GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) {
- name_to_resolve_ = std::string(absl::StripPrefix(args.uri.path(), "/"));
- channel_args_ = grpc_channel_args_copy(args.args);
- const grpc_arg* arg = grpc_channel_args_find(
- args.args, GRPC_ARG_DNS_MIN_TIME_BETWEEN_RESOLUTIONS_MS);
- min_time_between_resolutions_ =
- grpc_channel_arg_get_integer(arg, {1000 * 30, 0, INT_MAX});
- interested_parties_ = grpc_pollset_set_create();
if (args.pollset_set != nullptr) {
grpc_pollset_set_add_pollset_set(interested_parties_, args.pollset_set);
}
void NativeDnsResolver::OnNextResolution(void* arg, grpc_error* error) {
NativeDnsResolver* r = static_cast<NativeDnsResolver*>(arg);
GRPC_ERROR_REF(error); // ref owned by lambda
- r->work_serializer()->Run([r, error]() { r->OnNextResolutionLocked(error); },
- DEBUG_LOCATION);
+ r->work_serializer_->Run([r, error]() { r->OnNextResolutionLocked(error); },
+ DEBUG_LOCATION);
}
void NativeDnsResolver::OnNextResolutionLocked(grpc_error* error) {
void NativeDnsResolver::OnResolved(void* arg, grpc_error* error) {
NativeDnsResolver* r = static_cast<NativeDnsResolver*>(arg);
GRPC_ERROR_REF(error); // owned by lambda
- r->work_serializer()->Run([r, error]() { r->OnResolvedLocked(error); },
- DEBUG_LOCATION);
+ r->work_serializer_->Run([r, error]() { r->OnResolvedLocked(error); },
+ DEBUG_LOCATION);
}
void NativeDnsResolver::OnResolvedLocked(grpc_error* error) {
}
grpc_resolved_addresses_destroy(addresses_);
result.args = grpc_channel_args_copy(channel_args_);
- result_handler()->ReturnResult(std::move(result));
+ result_handler_->ReturnResult(std::move(result));
// Reset backoff state so that we start from the beginning when the
// next request gets triggered.
backoff_.Reset();
// Return transient error.
std::string error_message =
absl::StrCat("DNS resolution failed for service: ", name_to_resolve_);
- result_handler()->ReturnError(grpc_error_set_int(
+ result_handler_->ReturnError(grpc_error_set_int(
GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(error_message.c_str(),
&error, 1),
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
// passed-in parameters
grpc_channel_args* channel_args_ = nullptr;
+ std::shared_ptr<WorkSerializer> work_serializer_;
+ std::unique_ptr<ResultHandler> result_handler_;
RefCountedPtr<FakeResolverResponseGenerator> response_generator_;
// If has_next_result_ is true, next_result_ is the next resolution result
// to be returned.
};
FakeResolver::FakeResolver(ResolverArgs args)
- : Resolver(std::move(args.work_serializer), std::move(args.result_handler)),
+ : work_serializer_(std::move(args.work_serializer)),
+ result_handler_(std::move(args.result_handler)),
response_generator_(
FakeResolverResponseGenerator::GetFromArgs(args.args)) {
// Channels sharing the same subchannels may have different resolver response
if (!reresolution_closure_pending_) {
reresolution_closure_pending_ = true;
Ref().release(); // ref held by closure
- work_serializer()->Run([this]() { ReturnReresolutionResult(); },
- DEBUG_LOCATION);
+ work_serializer_->Run([this]() { ReturnReresolutionResult(); },
+ DEBUG_LOCATION);
}
}
}
if (return_failure_) {
// TODO(roth): Change resolver result generator to be able to inject
// the error to be returned.
- result_handler()->ReturnError(grpc_error_set_int(
+ result_handler_->ReturnError(grpc_error_set_int(
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resolver transient failure"),
GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE));
return_failure_ = false;
// name, only the one in next_results_ will be kept since next_results_ is
// before channel_args_.
result.args = grpc_channel_args_union(next_result_.args, channel_args_);
- result_handler()->ReturnResult(std::move(result));
+ result_handler_->ReturnResult(std::move(result));
has_next_result_ = false;
}
}
}
FakeResolverResponseSetter* arg =
new FakeResolverResponseSetter(resolver, std::move(result));
- resolver->work_serializer()->Run([arg]() { arg->SetResponseLocked(); },
- DEBUG_LOCATION);
+ resolver->work_serializer_->Run([arg]() { arg->SetResponseLocked(); },
+ DEBUG_LOCATION);
}
void FakeResolverResponseGenerator::SetReresolutionResponse(
}
FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(
resolver, std::move(result), true /* has_result */);
- resolver->work_serializer()->Run(
+ resolver->work_serializer_->Run(
[arg]() { arg->SetReresolutionResponseLocked(); }, DEBUG_LOCATION);
}
}
FakeResolverResponseSetter* arg =
new FakeResolverResponseSetter(resolver, Resolver::Result());
- resolver->work_serializer()->Run(
+ resolver->work_serializer_->Run(
[arg]() { arg->SetReresolutionResponseLocked(); }, DEBUG_LOCATION);
}
}
FakeResolverResponseSetter* arg =
new FakeResolverResponseSetter(resolver, Resolver::Result());
- resolver->work_serializer()->Run([arg]() { arg->SetFailureLocked(); },
- DEBUG_LOCATION);
+ resolver->work_serializer_->Run([arg]() { arg->SetFailureLocked(); },
+ DEBUG_LOCATION);
}
void FakeResolverResponseGenerator::SetFailureOnReresolution() {
FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(
resolver, Resolver::Result(), false /* has_result */,
false /* immediate */);
- resolver->work_serializer()->Run([arg]() { arg->SetFailureLocked(); },
- DEBUG_LOCATION);
+ resolver->work_serializer_->Run([arg]() { arg->SetFailureLocked(); },
+ DEBUG_LOCATION);
}
void FakeResolverResponseGenerator::SetFakeResolver(
if (has_result_) {
FakeResolverResponseSetter* arg =
new FakeResolverResponseSetter(resolver_, std::move(result_));
- resolver_->work_serializer()->Run([arg]() { arg->SetResponseLocked(); },
- DEBUG_LOCATION);
+ resolver_->work_serializer_->Run([arg]() { arg->SetResponseLocked(); },
+ DEBUG_LOCATION);
has_result_ = false;
}
}
--- /dev/null
+//
+// Copyright 2021 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.
+//
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/ext/filters/client_channel/resolver_registry.h"
+#include "src/core/ext/xds/xds_client.h"
+#include "src/core/lib/gpr/env.h"
+#include "src/core/lib/http/httpcli.h"
+#include "src/core/lib/iomgr/polling_entity.h"
+#include "src/core/lib/security/credentials/alts/check_gcp_environment.h"
+
+namespace grpc_core {
+
+namespace {
+
+class GoogleCloud2ProdResolver : public Resolver {
+ public:
+ explicit GoogleCloud2ProdResolver(ResolverArgs args);
+
+ void StartLocked() override;
+ void RequestReresolutionLocked() override;
+ void ResetBackoffLocked() override;
+ void ShutdownLocked() override;
+
+ private:
+ // Represents an HTTP request to the metadata server.
+ class MetadataQuery : public InternallyRefCounted<MetadataQuery> {
+ public:
+ MetadataQuery(RefCountedPtr<GoogleCloud2ProdResolver> resolver,
+ const char* path, grpc_polling_entity* pollent);
+ ~MetadataQuery() override;
+
+ void Orphan() override;
+
+ private:
+ static void OnHttpRequestDone(void* arg, grpc_error* error);
+
+ // Calls OnDone() if not already called. Releases a ref.
+ void MaybeCallOnDone(grpc_error* error);
+
+ // If error is not GRPC_ERROR_NONE, then it's not safe to look at response.
+ virtual void OnDone(GoogleCloud2ProdResolver* resolver,
+ const grpc_http_response* response,
+ grpc_error* error) = 0;
+
+ RefCountedPtr<GoogleCloud2ProdResolver> resolver_;
+ grpc_httpcli_context context_;
+ grpc_httpcli_response response_;
+ grpc_closure on_done_;
+ Atomic<bool> on_done_called_{false};
+ };
+
+ // A metadata server query to get the zone.
+ class ZoneQuery : public MetadataQuery {
+ public:
+ ZoneQuery(RefCountedPtr<GoogleCloud2ProdResolver> resolver,
+ grpc_polling_entity* pollent);
+
+ private:
+ void OnDone(GoogleCloud2ProdResolver* resolver,
+ const grpc_http_response* response, grpc_error* error) override;
+ };
+
+ // A metadata server query to get the IPv6 address.
+ class IPv6Query : public MetadataQuery {
+ public:
+ IPv6Query(RefCountedPtr<GoogleCloud2ProdResolver> resolver,
+ grpc_polling_entity* pollent);
+
+ private:
+ void OnDone(GoogleCloud2ProdResolver* resolver,
+ const grpc_http_response* response, grpc_error* error) override;
+ };
+
+ void ZoneQueryDone(std::string zone);
+ void IPv6QueryDone(bool ipv6_supported);
+ void StartXdsResolver();
+
+ std::shared_ptr<WorkSerializer> work_serializer_;
+ grpc_polling_entity pollent_;
+ bool using_dns_ = false;
+ OrphanablePtr<Resolver> child_resolver_;
+
+ OrphanablePtr<ZoneQuery> zone_query_;
+ absl::optional<std::string> zone_;
+
+ OrphanablePtr<IPv6Query> ipv6_query_;
+ absl::optional<bool> supports_ipv6_;
+};
+
+//
+// GoogleCloud2ProdResolver::MetadataQuery
+//
+
+GoogleCloud2ProdResolver::MetadataQuery::MetadataQuery(
+ RefCountedPtr<GoogleCloud2ProdResolver> resolver, const char* path,
+ grpc_polling_entity* pollent)
+ : resolver_(std::move(resolver)) {
+ grpc_httpcli_context_init(&context_);
+ // Start HTTP request.
+ GRPC_CLOSURE_INIT(&on_done_, OnHttpRequestDone, this, nullptr);
+ Ref().release(); // Ref held by callback.
+ grpc_httpcli_request request;
+ memset(&request, 0, sizeof(grpc_httpcli_request));
+ grpc_http_header header = {const_cast<char*>("Metadata-Flavor"),
+ const_cast<char*>("Google")};
+ request.host = const_cast<char*>("metadata.google.internal");
+ request.http.path = const_cast<char*>(path);
+ request.http.hdr_count = 1;
+ request.http.hdrs = &header;
+ grpc_resource_quota* resource_quota =
+ grpc_resource_quota_create("c2p_resolver");
+ grpc_httpcli_get(&context_, pollent, resource_quota, &request,
+ ExecCtx::Get()->Now() + 10000, // 10s timeout
+ &on_done_, &response_);
+ grpc_resource_quota_unref_internal(resource_quota);
+}
+
+GoogleCloud2ProdResolver::MetadataQuery::~MetadataQuery() {
+ grpc_httpcli_context_destroy(&context_);
+ grpc_http_response_destroy(&response_);
+}
+
+void GoogleCloud2ProdResolver::MetadataQuery::Orphan() {
+ // TODO(roth): Once the HTTP client library supports cancellation,
+ // use that here.
+ MaybeCallOnDone(GRPC_ERROR_CANCELLED);
+}
+
+void GoogleCloud2ProdResolver::MetadataQuery::OnHttpRequestDone(
+ void* arg, grpc_error* error) {
+ auto* self = static_cast<MetadataQuery*>(arg);
+ self->MaybeCallOnDone(GRPC_ERROR_REF(error));
+}
+
+void GoogleCloud2ProdResolver::MetadataQuery::MaybeCallOnDone(
+ grpc_error* error) {
+ bool expected = false;
+ if (!on_done_called_.CompareExchangeStrong(
+ &expected, true, MemoryOrder::RELAXED, MemoryOrder::RELAXED)) {
+ // We've already called OnDone(), so just clean up.
+ GRPC_ERROR_UNREF(error);
+ Unref();
+ return;
+ }
+ // Hop back into WorkSerializer to call OnDone().
+ // Note: We implicitly pass our ref to the callback here.
+ resolver_->work_serializer_->Run(
+ [this, error]() {
+ OnDone(resolver_.get(), &response_, error);
+ Unref();
+ },
+ DEBUG_LOCATION);
+}
+
+//
+// GoogleCloud2ProdResolver::ZoneQuery
+//
+
+GoogleCloud2ProdResolver::ZoneQuery::ZoneQuery(
+ RefCountedPtr<GoogleCloud2ProdResolver> resolver,
+ grpc_polling_entity* pollent)
+ : MetadataQuery(std::move(resolver), "/computeMetadata/v1/instance/zone",
+ pollent) {}
+
+void GoogleCloud2ProdResolver::ZoneQuery::OnDone(
+ GoogleCloud2ProdResolver* resolver, const grpc_http_response* response,
+ grpc_error* error) {
+ if (error != GRPC_ERROR_NONE) {
+ gpr_log(GPR_ERROR, "error fetching zone from metadata server: %s",
+ grpc_error_string(error));
+ }
+ std::string zone;
+ if (error == GRPC_ERROR_NONE && response->status == 200) {
+ absl::string_view body(response->body, response->body_length);
+ size_t i = body.find_last_of('/');
+ if (i == body.npos) {
+ gpr_log(GPR_ERROR, "could not parse zone from metadata server: %s",
+ std::string(body).c_str());
+ } else {
+ zone = std::string(body.substr(i));
+ }
+ }
+ resolver->ZoneQueryDone(std::move(zone));
+ GRPC_ERROR_UNREF(error);
+}
+
+//
+// GoogleCloud2ProdResolver::IPv6Query
+//
+
+GoogleCloud2ProdResolver::IPv6Query::IPv6Query(
+ RefCountedPtr<GoogleCloud2ProdResolver> resolver,
+ grpc_polling_entity* pollent)
+ : MetadataQuery(std::move(resolver),
+ "/computeMetadata/v1/instance/network-interfaces/0/ipv6s",
+ pollent) {}
+
+void GoogleCloud2ProdResolver::IPv6Query::OnDone(
+ GoogleCloud2ProdResolver* resolver, const grpc_http_response* response,
+ grpc_error* error) {
+ if (error != GRPC_ERROR_NONE) {
+ gpr_log(GPR_ERROR, "error fetching IPv6 address from metadata server: %s",
+ grpc_error_string(error));
+ }
+ resolver->IPv6QueryDone(error == GRPC_ERROR_NONE && response->status == 200);
+ GRPC_ERROR_UNREF(error);
+}
+
+//
+// GoogleCloud2ProdResolver
+//
+
+GoogleCloud2ProdResolver::GoogleCloud2ProdResolver(ResolverArgs args)
+ : work_serializer_(std::move(args.work_serializer)),
+ pollent_(grpc_polling_entity_create_from_pollset_set(args.pollset_set)) {
+ absl::string_view name_to_resolve = absl::StripPrefix(args.uri.path(), "/");
+ // If we're not running on GCP, we can't use DirectPath, so delegate
+ // to the DNS resolver.
+ if (!grpc_alts_is_running_on_gcp() ||
+ // If the client is already using xDS, we can't use it here, because
+ // they may be talking to a completely different xDS server than we
+ // want to.
+ // TODO(roth): When we implement xDS federation, remove this constraint.
+ UniquePtr<char>(gpr_getenv("GRPC_XDS_BOOTSTRAP")) != nullptr ||
+ UniquePtr<char>(gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG")) != nullptr) {
+ using_dns_ = true;
+ child_resolver_ = ResolverRegistry::CreateResolver(
+ absl::StrCat("dns:", name_to_resolve).c_str(), args.args,
+ args.pollset_set, work_serializer_, std::move(args.result_handler));
+ GPR_ASSERT(child_resolver_ != nullptr);
+ return;
+ }
+ // Create xds resolver.
+ child_resolver_ = ResolverRegistry::CreateResolver(
+ absl::StrCat("xds:", name_to_resolve).c_str(), args.args,
+ args.pollset_set, work_serializer_, std::move(args.result_handler));
+ GPR_ASSERT(child_resolver_ != nullptr);
+}
+
+void GoogleCloud2ProdResolver::StartLocked() {
+ if (using_dns_) {
+ child_resolver_->StartLocked();
+ return;
+ }
+ // Using xDS. Start metadata server queries.
+ zone_query_ = MakeOrphanable<ZoneQuery>(Ref(), &pollent_);
+ ipv6_query_ = MakeOrphanable<IPv6Query>(Ref(), &pollent_);
+}
+
+void GoogleCloud2ProdResolver::RequestReresolutionLocked() {
+ if (child_resolver_ != nullptr) {
+ child_resolver_->RequestReresolutionLocked();
+ }
+}
+
+void GoogleCloud2ProdResolver::ResetBackoffLocked() {
+ if (child_resolver_ != nullptr) {
+ child_resolver_->ResetBackoffLocked();
+ }
+}
+
+void GoogleCloud2ProdResolver::ShutdownLocked() {
+ zone_query_.reset();
+ ipv6_query_.reset();
+ child_resolver_.reset();
+}
+
+void GoogleCloud2ProdResolver::ZoneQueryDone(std::string zone) {
+ zone_query_.reset();
+ zone_ = std::move(zone);
+ if (supports_ipv6_.has_value()) StartXdsResolver();
+}
+
+void GoogleCloud2ProdResolver::IPv6QueryDone(bool ipv6_supported) {
+ ipv6_query_.reset();
+ supports_ipv6_ = ipv6_supported;
+ if (zone_.has_value()) StartXdsResolver();
+}
+
+void GoogleCloud2ProdResolver::StartXdsResolver() {
+ // Construct bootstrap JSON.
+ Json::Object node = {
+ {"id", "C2P"},
+ };
+ if (!zone_->empty()) {
+ node["locality"] = Json::Object{
+ {"zone", *zone_},
+ };
+ };
+ if (*supports_ipv6_) {
+ node["metadata"] = Json::Object{
+ {"TRAFFICDIRECTOR_DIRECTPATH_C2P_IPV6_CAPABLE", true},
+ };
+ }
+ Json bootstrap = Json::Object{
+ {"xds_servers",
+ Json::Array{
+ Json::Object{
+ {"server_uri", "directpath-trafficdirector.googleapis.com"},
+ {"channel_creds",
+ Json::Array{
+ Json::Object{
+ {"type", "google_default"},
+ },
+ }},
+ },
+ }},
+ {"node", std::move(node)},
+ };
+ // Inject bootstrap JSON as fallback config.
+ internal::SetXdsFallbackBootstrapConfig(bootstrap.Dump().c_str());
+ // Now start xDS resolver.
+ child_resolver_->StartLocked();
+}
+
+//
+// Factory
+//
+
+class GoogleCloud2ProdResolverFactory : public ResolverFactory {
+ public:
+ bool IsValidUri(const URI& uri) const override {
+ if (GPR_UNLIKELY(!uri.authority().empty())) {
+ gpr_log(GPR_ERROR, "google-c2p URI scheme does not support authorities");
+ return false;
+ }
+ return true;
+ }
+
+ OrphanablePtr<Resolver> CreateResolver(ResolverArgs args) const override {
+ if (!IsValidUri(args.uri)) return nullptr;
+ return MakeOrphanable<GoogleCloud2ProdResolver>(std::move(args));
+ }
+
+ const char* scheme() const override { return "google-c2p"; }
+};
+
+} // namespace
+
+void GoogleCloud2ProdResolverInit() {
+ ResolverRegistry::Builder::RegisterResolverFactory(
+ absl::make_unique<GoogleCloud2ProdResolverFactory>());
+}
+
+void GoogleCloud2ProdResolverShutdown() {}
+
+} // namespace grpc_core
#include "src/core/lib/iomgr/parse_address.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/unix_sockets_posix.h"
-#include "src/core/lib/iomgr/work_serializer.h"
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
void ShutdownLocked() override {}
private:
+ std::unique_ptr<ResultHandler> result_handler_;
ServerAddressList addresses_;
const grpc_channel_args* channel_args_ = nullptr;
};
SockaddrResolver::SockaddrResolver(ServerAddressList addresses,
ResolverArgs args)
- : Resolver(std::move(args.work_serializer), std::move(args.result_handler)),
+ : result_handler_(std::move(args.result_handler)),
addresses_(std::move(addresses)),
channel_args_(grpc_channel_args_copy(args.args)) {}
// TODO(roth): Use std::move() once channel args is converted to C++.
result.args = channel_args_;
channel_args_ = nullptr;
- result_handler()->ReturnResult(std::move(result));
+ result_handler_->ReturnResult(std::move(result));
}
//
return CreateSockaddrResolver(std::move(args), grpc_parse_unix);
}
- std::string GetDefaultAuthority(const URI& uri) const override {
+ std::string GetDefaultAuthority(const URI& /*uri*/) const override {
return "localhost";
}
class XdsResolver : public Resolver {
public:
explicit XdsResolver(ResolverArgs args)
- : Resolver(std::move(args.work_serializer),
- std::move(args.result_handler)),
+ : work_serializer_(std::move(args.work_serializer)),
+ result_handler_(std::move(args.result_handler)),
server_name_(absl::StripPrefix(args.uri.path(), "/")),
args_(grpc_channel_args_copy(args.args)),
interested_parties_(args.pollset_set) {
void GenerateResult();
void MaybeRemoveUnusedClusters();
+ std::shared_ptr<WorkSerializer> work_serializer_;
+ std::unique_ptr<ResultHandler> result_handler_;
std::string server_name_;
const grpc_channel_args* args_;
grpc_pollset_set* interested_parties_;
void XdsResolver::Notifier::RunInExecCtx(void* arg, grpc_error* error) {
Notifier* self = static_cast<Notifier*>(arg);
GRPC_ERROR_REF(error);
- self->resolver_->work_serializer()->Run(
+ self->resolver_->work_serializer_->Run(
[self, error]() { self->RunInWorkSerializer(error); }, DEBUG_LOCATION);
}
}
}
-bool PathMatch(const absl::string_view& path,
- const XdsApi::Route::Matchers::PathMatcher& path_matcher) {
- switch (path_matcher.type) {
- case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PREFIX:
- return path_matcher.case_sensitive
- ? absl::StartsWith(path, path_matcher.string_matcher)
- : absl::StartsWithIgnoreCase(path,
- path_matcher.string_matcher);
- case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PATH:
- return path_matcher.case_sensitive
- ? path == path_matcher.string_matcher
- : absl::EqualsIgnoreCase(path, path_matcher.string_matcher);
- case XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX:
- // Note: Case-sensitive option will already have been set appropriately
- // in path_matcher.regex_matcher when it was constructed, so no
- // need to check it here.
- return RE2::FullMatch(path.data(), *path_matcher.regex_matcher);
- default:
- return false;
- }
-}
-
absl::optional<absl::string_view> GetMetadataValue(
const std::string& target_key, grpc_metadata_batch* initial_metadata,
std::string* concatenated_value) {
return *concatenated_value;
}
-bool HeaderMatchHelper(
- const XdsApi::Route::Matchers::HeaderMatcher& header_matcher,
- grpc_metadata_batch* initial_metadata) {
+bool HeaderMatchHelper(const HeaderMatcher& header_matcher,
+ grpc_metadata_batch* initial_metadata) {
std::string concatenated_value;
absl::optional<absl::string_view> value;
// Note: If we ever allow binary headers here, we still need to
// special-case ignore "grpc-tags-bin" and "grpc-trace-bin", since
// they are not visible to the LB policy in grpc-go.
- if (absl::EndsWith(header_matcher.name, "-bin") ||
- header_matcher.name == "grpc-previous-rpc-attempts") {
+ if (absl::EndsWith(header_matcher.name(), "-bin") ||
+ header_matcher.name() == "grpc-previous-rpc-attempts") {
value = absl::nullopt;
- } else if (header_matcher.name == "content-type") {
+ } else if (header_matcher.name() == "content-type") {
value = "application/grpc";
} else {
- value = GetMetadataValue(header_matcher.name, initial_metadata,
+ value = GetMetadataValue(header_matcher.name(), initial_metadata,
&concatenated_value);
}
- if (!value.has_value()) {
- if (header_matcher.type ==
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PRESENT) {
- return !header_matcher.present_match;
- } else {
- // For all other header matcher types, we need the header value to
- // exist to consider matches.
- return false;
- }
- }
- switch (header_matcher.type) {
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::EXACT:
- return value.value() == header_matcher.string_matcher;
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::REGEX:
- return RE2::FullMatch(value.value().data(), *header_matcher.regex_match);
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::RANGE:
- int64_t int_value;
- if (!absl::SimpleAtoi(value.value(), &int_value)) {
- return false;
- }
- return int_value >= header_matcher.range_start &&
- int_value < header_matcher.range_end;
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PREFIX:
- return absl::StartsWith(value.value(), header_matcher.string_matcher);
- case XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::SUFFIX:
- return absl::EndsWith(value.value(), header_matcher.string_matcher);
- default:
- return false;
- }
+ return header_matcher.Match(value);
}
-bool HeadersMatch(
- const std::vector<XdsApi::Route::Matchers::HeaderMatcher>& header_matchers,
- grpc_metadata_batch* initial_metadata) {
+bool HeadersMatch(const std::vector<HeaderMatcher>& header_matchers,
+ grpc_metadata_batch* initial_metadata) {
for (const auto& header_matcher : header_matchers) {
- bool match = HeaderMatchHelper(header_matcher, initial_metadata);
- if (header_matcher.invert_match) match = !match;
- if (!match) return false;
+ if (!HeaderMatchHelper(header_matcher, initial_metadata)) return false;
}
return true;
}
GetCallConfigArgs args) {
for (const auto& entry : route_table_) {
// Path matching.
- if (!PathMatch(StringViewFromSlice(*args.path),
- entry.route.matchers.path_matcher)) {
+ if (!entry.route.matchers.path_matcher.Match(
+ StringViewFromSlice(*args.path))) {
continue;
}
// Header Matching.
GRPC_CLOSURE_CREATE(
[](void* arg, grpc_error* /*error*/) {
auto* resolver = static_cast<XdsResolver*>(arg);
- resolver->work_serializer()->Run(
+ resolver->work_serializer_->Run(
[resolver]() {
resolver->MaybeRemoveUnusedClusters();
resolver->Unref();
"Failed to create xds client -- channel will remain in "
"TRANSIENT_FAILURE: %s",
grpc_error_string(error));
- result_handler()->ReturnError(error);
+ result_handler_->ReturnError(error);
return;
}
grpc_pollset_set_add_pollset_set(xds_client_->interested_parties(),
Result result;
result.args = grpc_channel_args_copy(args_);
result.service_config_error = error;
- result_handler()->ReturnResult(std::move(result));
+ result_handler_->ReturnResult(std::move(result));
}
void XdsResolver::OnResourceDoesNotExist() {
ServiceConfig::Create(args_, "{}", &result.service_config_error);
GPR_ASSERT(result.service_config != nullptr);
result.args = grpc_channel_args_copy(args_);
- result_handler()->ReturnResult(std::move(result));
+ result_handler_->ReturnResult(std::move(result));
}
grpc_error* XdsResolver::CreateServiceConfig(
}
grpc_arg new_arg = config_selector->MakeChannelArg();
result.args = grpc_channel_args_copy_and_add(args_, &new_arg, 1);
- result_handler()->ReturnResult(std::move(result));
+ result_handler_->ReturnResult(std::move(result));
}
void XdsResolver::MaybeRemoveUnusedClusters() {
namespace grpc_core {
//
+// ServerAddressWeightAttribute
+//
+const char* ServerAddressWeightAttribute::kServerAddressWeightAttributeKey =
+ "server_address_weight";
+
+//
// ServerAddress
//
#include <memory>
#include "absl/container/inlined_vector.h"
+#include "absl/strings/str_format.h"
#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/gpr/useful.h"
#include "src/core/lib/iomgr/resolve_address.h"
namespace grpc_core {
typedef absl::InlinedVector<ServerAddress, 1> ServerAddressList;
+//
+// ServerAddressWeightAttribute
+//
+class ServerAddressWeightAttribute : public ServerAddress::AttributeInterface {
+ public:
+ static const char* kServerAddressWeightAttributeKey;
+
+ explicit ServerAddressWeightAttribute(uint32_t weight) : weight_(weight) {}
+
+ uint32_t weight() const { return weight_; }
+
+ std::unique_ptr<AttributeInterface> Copy() const override {
+ return absl::make_unique<ServerAddressWeightAttribute>(weight_);
+ }
+
+ int Cmp(const AttributeInterface* other) const override {
+ const auto* other_locality_attr =
+ static_cast<const ServerAddressWeightAttribute*>(other);
+ return GPR_ICMP(weight_, other_locality_attr->weight_);
+ }
+
+ std::string ToString() const override {
+ return absl::StrFormat("%d", weight_);
+ }
+
+ private:
+ uint32_t weight_;
+};
+
} // namespace grpc_core
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_SERVER_ADDRESS_H */
if (error == GRPC_ERROR_NONE) {
gpr_log(GPR_INFO, "Failed to connect to channel, retrying");
c->ContinueConnectingLocked();
- lock.Unlock();
+ lock.Release();
} else {
- lock.Unlock();
+ lock.Release();
GRPC_SUBCHANNEL_WEAK_UNREF(c, "connecting");
}
GRPC_ERROR_UNREF(error);
void ServerLoadReportingCallData::Destroy(
grpc_call_element* elem, const grpc_call_final_info* final_info,
- grpc_closure* then_call_closure) {
+ grpc_closure* /*then_call_closure*/) {
ServerLoadReportingChannelData* chand =
reinterpret_cast<ServerLoadReportingChannelData*>(elem->channel_data);
// Only record an end if we've recorded its corresponding start, which is
strncpy(cur_pos, lr_token, lr_token_len);
}
GPR_ASSERT(cur_pos + lr_token_len - client_ip_and_lr_token_ ==
- client_ip_and_lr_token_len_);
+ long(client_ip_and_lr_token_len_));
}
grpc_filtered_mdelem ServerLoadReportingCallData::RecvInitialMetadataFilter(
}
grpc_error* ServerLoadReportingCallData::Init(
- grpc_call_element* elem, const grpc_call_element_args* args) {
+ grpc_call_element* elem, const grpc_call_element_args* /*args*/) {
service_method_ = grpc_empty_slice();
GRPC_CLOSURE_INIT(&recv_initial_metadata_ready_, RecvInitialMetadataReady,
elem, grpc_schedule_on_exec_ctx);
grpc_channel_stack* channel_stack;
/* Guards access to max_age_timer, max_age_timer_pending, max_age_grace_timer
and max_age_grace_timer_pending */
- gpr_mu max_age_timer_mu;
+ grpc_core::Mutex max_age_timer_mu;
/* True if the max_age timer callback is currently pending */
- bool max_age_timer_pending;
+ bool max_age_timer_pending ABSL_GUARDED_BY(max_age_timer_mu) = false;
/* True if the max_age_grace timer callback is currently pending */
- bool max_age_grace_timer_pending;
+ bool max_age_grace_timer_pending ABSL_GUARDED_BY(max_age_timer_mu) = false;
/* The timer for checking if the channel has reached its max age */
- grpc_timer max_age_timer;
+ grpc_timer max_age_timer ABSL_GUARDED_BY(max_age_timer_mu);
/* The timer for checking if the max-aged channel has uesed up the grace
period */
- grpc_timer max_age_grace_timer;
+ grpc_timer max_age_grace_timer ABSL_GUARDED_BY(max_age_timer_mu);
/* The timer for checking if the channel's idle duration reaches
max_connection_idle */
grpc_timer max_idle_timer;
static void start_max_age_timer_after_init(void* arg, grpc_error* /*error*/) {
channel_data* chand = static_cast<channel_data*>(arg);
- gpr_mu_lock(&chand->max_age_timer_mu);
- chand->max_age_timer_pending = true;
- GRPC_CHANNEL_STACK_REF(chand->channel_stack, "max_age max_age_timer");
- grpc_timer_init(&chand->max_age_timer,
- grpc_core::ExecCtx::Get()->Now() + chand->max_connection_age,
- &chand->close_max_age_channel);
- gpr_mu_unlock(&chand->max_age_timer_mu);
+ {
+ grpc_core::MutexLock lock(&chand->max_age_timer_mu);
+ chand->max_age_timer_pending = true;
+ GRPC_CHANNEL_STACK_REF(chand->channel_stack, "max_age max_age_timer");
+ grpc_timer_init(
+ &chand->max_age_timer,
+ grpc_core::ExecCtx::Get()->Now() + chand->max_connection_age,
+ &chand->close_max_age_channel);
+ }
grpc_transport_op* op = grpc_make_transport_op(nullptr);
op->start_connectivity_watch.reset(new grpc_core::ConnectivityWatcher(chand));
op->start_connectivity_watch_state = GRPC_CHANNEL_IDLE;
static void start_max_age_grace_timer_after_goaway_op(void* arg,
grpc_error* /*error*/) {
channel_data* chand = static_cast<channel_data*>(arg);
- gpr_mu_lock(&chand->max_age_timer_mu);
- chand->max_age_grace_timer_pending = true;
- GRPC_CHANNEL_STACK_REF(chand->channel_stack, "max_age max_age_grace_timer");
- grpc_timer_init(
- &chand->max_age_grace_timer,
- chand->max_connection_age_grace == GRPC_MILLIS_INF_FUTURE
- ? GRPC_MILLIS_INF_FUTURE
- : grpc_core::ExecCtx::Get()->Now() + chand->max_connection_age_grace,
- &chand->force_close_max_age_channel);
- gpr_mu_unlock(&chand->max_age_timer_mu);
+ {
+ grpc_core::MutexLock lock(&chand->max_age_timer_mu);
+ chand->max_age_grace_timer_pending = true;
+ GRPC_CHANNEL_STACK_REF(chand->channel_stack, "max_age max_age_grace_timer");
+ grpc_timer_init(&chand->max_age_grace_timer,
+ chand->max_connection_age_grace == GRPC_MILLIS_INF_FUTURE
+ ? GRPC_MILLIS_INF_FUTURE
+ : grpc_core::ExecCtx::Get()->Now() +
+ chand->max_connection_age_grace,
+ &chand->force_close_max_age_channel);
+ }
GRPC_CHANNEL_STACK_UNREF(chand->channel_stack,
"max_age start_max_age_grace_timer_after_goaway_op");
}
static void close_max_age_channel(void* arg, grpc_error* error) {
channel_data* chand = static_cast<channel_data*>(arg);
- gpr_mu_lock(&chand->max_age_timer_mu);
- chand->max_age_timer_pending = false;
- gpr_mu_unlock(&chand->max_age_timer_mu);
+ {
+ grpc_core::MutexLock lock(&chand->max_age_timer_mu);
+ chand->max_age_timer_pending = false;
+ }
if (error == GRPC_ERROR_NONE) {
GRPC_CHANNEL_STACK_REF(chand->channel_stack,
"max_age start_max_age_grace_timer_after_goaway_op");
static void force_close_max_age_channel(void* arg, grpc_error* error) {
channel_data* chand = static_cast<channel_data*>(arg);
- gpr_mu_lock(&chand->max_age_timer_mu);
- chand->max_age_grace_timer_pending = false;
- gpr_mu_unlock(&chand->max_age_timer_mu);
+ {
+ grpc_core::MutexLock lock(&chand->max_age_timer_mu);
+ chand->max_age_grace_timer_pending = false;
+ }
if (error == GRPC_ERROR_NONE) {
grpc_transport_op* op = grpc_make_transport_op(nullptr);
op->disconnect_with_error =
static grpc_error* max_age_init_channel_elem(grpc_channel_element* elem,
grpc_channel_element_args* args) {
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
- gpr_mu_init(&chand->max_age_timer_mu);
- chand->max_age_timer_pending = false;
- chand->max_age_grace_timer_pending = false;
+ new (chand) channel_data();
chand->channel_stack = args->channel_stack;
chand->max_connection_age =
add_random_max_connection_age_jitter_and_convert_to_grpc_millis(
/* Destructor for channel_data. */
static void max_age_destroy_channel_elem(grpc_channel_element* elem) {
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
- gpr_mu_destroy(&chand->max_age_timer_mu);
+ chand->~channel_data();
}
const grpc_channel_filter grpc_max_age_filter = {
self->Unref();
}
-void Chttp2Connector::OnTimeout(void* arg, grpc_error* error) {
+void Chttp2Connector::OnTimeout(void* arg, grpc_error* /*error*/) {
Chttp2Connector* self = static_cast<Chttp2Connector*>(arg);
{
MutexLock lock(&self->mu_);
class Chttp2ServerListener : public Server::ListenerInterface {
public:
static grpc_error* Create(Server* server, grpc_resolved_address* addr,
- grpc_channel_args* args, int* port_num);
+ grpc_channel_args* args,
+ Chttp2ServerArgsModifier args_modifier,
+ int* port_num);
static grpc_error* CreateWithAcceptor(Server* server, const char* name,
- grpc_channel_args* args);
+ grpc_channel_args* args,
+ Chttp2ServerArgsModifier args_modifier);
// Do not instantiate directly. Use one of the factory methods above.
- Chttp2ServerListener(Server* server, grpc_channel_args* args);
+ Chttp2ServerListener(Server* server, grpc_channel_args* args,
+ Chttp2ServerArgsModifier args_modifier);
~Chttp2ServerListener() override;
void Start(Server* server,
void UpdateConfig(grpc_channel_args* args) override {
{
MutexLock lock(&listener_->mu_);
- // TODO(yashykt): Fix this
- // grpc_channel_args_destroy(listener_->args_);
- // listener_->args_ = args;
+ grpc_channel_args_destroy(listener_->args_);
+ grpc_error* error = GRPC_ERROR_NONE;
+ args = listener_->args_modifier_(args, &error);
+ if (error != GRPC_ERROR_NONE) {
+ // TODO(yashykt): Set state to close down connections immediately
+ // after accepting.
+ GPR_ASSERT(0);
+ }
+ listener_->args_ = args;
if (!listener_->shutdown_) return; // Already started listening.
}
int port_temp;
grpc_closure* destroy_done);
Server* const server_;
- grpc_channel_args* const args_;
grpc_tcp_server* tcp_server_;
grpc_resolved_address resolved_address_;
+ Chttp2ServerArgsModifier args_modifier_;
Mutex mu_;
+ grpc_channel_args* args_; // guarded by mu_
ConfigFetcherWatcher* config_fetcher_watcher_ = nullptr;
bool shutdown_ = true;
grpc_closure tcp_server_shutdown_complete_;
grpc_error* Chttp2ServerListener::Create(Server* server,
grpc_resolved_address* addr,
grpc_channel_args* args,
+ Chttp2ServerArgsModifier args_modifier,
int* port_num) {
Chttp2ServerListener* listener = nullptr;
// The bulk of this method is inside of a lambda to make cleanup
// easier without using goto.
grpc_error* error = [&]() {
// Create Chttp2ServerListener.
- listener = new Chttp2ServerListener(server, args);
+ listener = new Chttp2ServerListener(server, args, args_modifier);
error = grpc_tcp_server_create(&listener->tcp_server_shutdown_complete_,
args, &listener->tcp_server_);
if (error != GRPC_ERROR_NONE) return error;
return error;
}
-grpc_error* Chttp2ServerListener::CreateWithAcceptor(Server* server,
- const char* name,
- grpc_channel_args* args) {
- Chttp2ServerListener* listener = new Chttp2ServerListener(server, args);
+grpc_error* Chttp2ServerListener::CreateWithAcceptor(
+ Server* server, const char* name, grpc_channel_args* args,
+ Chttp2ServerArgsModifier args_modifier) {
+ Chttp2ServerListener* listener =
+ new Chttp2ServerListener(server, args, args_modifier);
grpc_error* error = grpc_tcp_server_create(
&listener->tcp_server_shutdown_complete_, args, &listener->tcp_server_);
if (error != GRPC_ERROR_NONE) {
return GRPC_ERROR_NONE;
}
-Chttp2ServerListener::Chttp2ServerListener(Server* server,
- grpc_channel_args* args)
- : server_(server), args_(args) {
+Chttp2ServerListener::Chttp2ServerListener(
+ Server* server, grpc_channel_args* args,
+ Chttp2ServerArgsModifier args_modifier)
+ : server_(server), args_modifier_(args_modifier), args_(args) {
GRPC_CLOSURE_INIT(&tcp_server_shutdown_complete_, TcpServerShutdownComplete,
this, grpc_schedule_on_exec_ctx);
}
void Chttp2ServerListener::Start(
Server* /*server*/, const std::vector<grpc_pollset*>* /* pollsets */) {
if (server_->config_fetcher() != nullptr) {
+ grpc_channel_args* args = nullptr;
auto watcher = absl::make_unique<ConfigFetcherWatcher>(this);
{
MutexLock lock(&mu_);
config_fetcher_watcher_ = watcher.get();
+ args = grpc_channel_args_copy(args_);
}
server_->config_fetcher()->StartWatch(
- grpc_sockaddr_to_string(&resolved_address_, false), std::move(watcher));
+ grpc_sockaddr_to_string(&resolved_address_, false), args,
+ std::move(watcher));
} else {
StartListening();
}
gpr_free(acceptor);
return;
}
+ grpc_channel_args* args = nullptr;
+ {
+ MutexLock lock(&self->mu_);
+ args = grpc_channel_args_copy(self->args_);
+ }
// Deletes itself when done.
new ConnectionState(self, accepting_pollset, acceptor,
- std::move(handshake_mgr), self->args_, tcp);
+ std::move(handshake_mgr), args, tcp);
+ grpc_channel_args_destroy(args);
}
void Chttp2ServerListener::TcpServerShutdownComplete(void* arg,
//
grpc_error* Chttp2ServerAddPort(Server* server, const char* addr,
- grpc_channel_args* args, int* port_num) {
+ grpc_channel_args* args,
+ Chttp2ServerArgsModifier args_modifier,
+ int* port_num) {
if (strncmp(addr, "external:", 9) == 0) {
- return grpc_core::Chttp2ServerListener::CreateWithAcceptor(server, addr,
- args);
+ return grpc_core::Chttp2ServerListener::CreateWithAcceptor(
+ server, addr, args, args_modifier);
}
*port_num = -1;
grpc_resolved_addresses* resolved = nullptr;
if (*port_num != -1 && grpc_sockaddr_get_port(&resolved->addrs[i]) == 0) {
grpc_sockaddr_set_port(&resolved->addrs[i], *port_num);
}
- int port_temp;
+ int port_temp = -1;
error = grpc_core::Chttp2ServerListener::Create(
server, &resolved->addrs[i], grpc_channel_args_copy(args),
- &port_temp);
+ args_modifier, &port_temp);
if (error != GRPC_ERROR_NONE) {
error_list.push_back(error);
} else {
namespace grpc_core {
+// A function to modify channel args for a listening addr:port. Note that this
+// is used to create a security connector for listeners when the servers are
+// configured with a config fetcher. Not invoked if there is no config fetcher
+// added to the server. Takes ownership of the args. Caller takes ownership of
+// returned args. On failure, the error parameter will be set.
+using Chttp2ServerArgsModifier =
+ std::function<grpc_channel_args*(grpc_channel_args*, grpc_error**)>;
+
/// Adds a port to \a server. Sets \a port_num to the port number.
/// Takes ownership of \a args.
-grpc_error* Chttp2ServerAddPort(Server* server, const char* addr,
- grpc_channel_args* args, int* port_num);
+grpc_error* Chttp2ServerAddPort(
+ Server* server, const char* addr, grpc_channel_args* args,
+ Chttp2ServerArgsModifier connection_args_modifier, int* port_num);
} // namespace grpc_core
#include "src/core/lib/surface/api_trace.h"
#include "src/core/lib/surface/server.h"
+namespace {
+
+grpc_channel_args* ModifyArgsForConnection(grpc_channel_args* args,
+ grpc_error** /*error*/) {
+ return args;
+}
+
+} // namespace
+
int grpc_server_add_insecure_http2_port(grpc_server* server, const char* addr) {
grpc_core::ExecCtx exec_ctx;
int port_num = 0;
(server, addr));
grpc_error* err = grpc_core::Chttp2ServerAddPort(
server->core_server.get(), addr,
- grpc_channel_args_copy(server->core_server->channel_args()), &port_num);
+ grpc_channel_args_copy(server->core_server->channel_args()),
+ ModifyArgsForConnection, &port_num);
if (err != GRPC_ERROR_NONE) {
const char* msg = grpc_error_string(err);
gpr_log(GPR_ERROR, "%s", msg);
#include <grpc/support/port_platform.h>
-#include <grpc/grpc.h>
-
#include <string.h>
#include "absl/strings/str_cat.h"
+#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include "src/core/lib/surface/api_trace.h"
#include "src/core/lib/surface/server.h"
+namespace {
+
+grpc_channel_args* ModifyArgsForConnection(grpc_channel_args* args,
+ grpc_error** error) {
+ grpc_server_credentials* server_credentials =
+ grpc_find_server_credentials_in_args(args);
+ if (server_credentials == nullptr) {
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Could not find server credentials");
+ return args;
+ }
+ auto security_connector = server_credentials->create_security_connector(args);
+ if (security_connector == nullptr) {
+ *error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("Unable to create secure server with credentials of type ",
+ server_credentials->type())
+ .c_str());
+ return args;
+ }
+ grpc_arg arg_to_add =
+ grpc_security_connector_to_arg(security_connector.get());
+ grpc_channel_args* new_args =
+ grpc_channel_args_copy_and_add(args, &arg_to_add, 1);
+ grpc_channel_args_destroy(args);
+ return new_args;
+}
+
+} // namespace
+
int grpc_server_add_secure_http2_port(grpc_server* server, const char* addr,
grpc_server_credentials* creds) {
grpc_core::ExecCtx exec_ctx;
"No credentials specified for secure server port (creds==NULL)");
goto done;
}
- sc = creds->create_security_connector();
- if (sc == nullptr) {
- err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat("Unable to create secure server with credentials of type ",
- creds->type())
- .c_str());
- goto done;
+ // TODO(yashykt): Ideally, we would not want to have different behavior here
+ // based on whether a config fetcher is configured or not. Currently, we have
+ // a feature for SSL credentials reloading with an application callback that
+ // assumes that there is a single security connector. If we delay the creation
+ // of the security connector to after the creation of the listener(s), we
+ // would have potentially multiple security connectors which breaks the
+ // assumption for SSL creds reloading. When the API for SSL creds reloading is
+ // rewritten, we would be able to make this workaround go away by removing
+ // that assumption. As an immediate drawback of this workaround, config
+ // fetchers need to be registered before adding ports to the server.
+ if (server->core_server->config_fetcher() != nullptr) {
+ // Create channel args.
+ grpc_arg arg_to_add = grpc_server_credentials_to_arg(creds);
+ args = grpc_channel_args_copy_and_add(server->core_server->channel_args(),
+ &arg_to_add, 1);
+ } else {
+ sc = creds->create_security_connector(nullptr);
+ if (sc == nullptr) {
+ err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(
+ "Unable to create secure server with credentials of type ",
+ creds->type())
+ .c_str());
+ goto done;
+ }
+ grpc_arg args_to_add[2];
+ args_to_add[0] = grpc_server_credentials_to_arg(creds);
+ args_to_add[1] = grpc_security_connector_to_arg(sc.get());
+ args = grpc_channel_args_copy_and_add(server->core_server->channel_args(),
+ args_to_add,
+ GPR_ARRAY_SIZE(args_to_add));
}
- // Create channel args.
- grpc_arg args_to_add[2];
- args_to_add[0] = grpc_server_credentials_to_arg(creds);
- args_to_add[1] = grpc_security_connector_to_arg(sc.get());
- args =
- grpc_channel_args_copy_and_add(server->core_server->channel_args(),
- args_to_add, GPR_ARRAY_SIZE(args_to_add));
// Add server port.
err = grpc_core::Chttp2ServerAddPort(server->core_server.get(), addr, args,
- &port_num);
+ ModifyArgsForConnection, &port_num);
done:
sc.reset(DEBUG_LOCATION, "server");
-
if (err != GRPC_ERROR_NONE) {
const char* msg = grpc_error_string(err);
gpr_log(GPR_ERROR, "%s", msg);
#else
/* Dummy implementation of cronet API just to test for build-ability */
bidirectional_stream* bidirectional_stream_create(
- stream_engine* engine, void* annotation,
- bidirectional_stream_callback* callback) {
+ stream_engine* /*engine*/, void* /*annotation*/,
+ bidirectional_stream_callback* /*callback*/) {
GPR_ASSERT(0);
return nullptr;
}
-int bidirectional_stream_destroy(bidirectional_stream* stream) {
+int bidirectional_stream_destroy(bidirectional_stream* /*stream*/) {
GPR_ASSERT(0);
return 0;
}
-int bidirectional_stream_start(bidirectional_stream* stream, const char* url,
- int priority, const char* method,
- const bidirectional_stream_header_array* headers,
- bool end_of_stream) {
+int bidirectional_stream_start(
+ bidirectional_stream* /*stream*/, const char* /*url*/, int /*priority*/,
+ const char* /*method*/,
+ const bidirectional_stream_header_array* /*headers*/,
+ bool /*end_of_stream*/) {
GPR_ASSERT(0);
return 0;
}
-int bidirectional_stream_read(bidirectional_stream* stream, char* buffer,
- int capacity) {
+int bidirectional_stream_read(bidirectional_stream* /*stream*/,
+ char* /*buffer*/, int /*capacity*/) {
GPR_ASSERT(0);
return 0;
}
-int bidirectional_stream_write(bidirectional_stream* stream, const char* buffer,
- int count, bool end_of_stream) {
+int bidirectional_stream_write(bidirectional_stream* /*stream*/,
+ const char* /*buffer*/, int /*count*/,
+ bool /*end_of_stream*/) {
GPR_ASSERT(0);
return 0;
}
-void bidirectional_stream_cancel(bidirectional_stream* stream) {
+void bidirectional_stream_cancel(bidirectional_stream* /*stream*/) {
GPR_ASSERT(0);
}
-void bidirectional_stream_disable_auto_flush(bidirectional_stream* stream,
- bool disable_auto_flush) {
+void bidirectional_stream_disable_auto_flush(bidirectional_stream* /*stream*/,
+ bool /*disable_auto_flush*/) {
GPR_ASSERT(0);
}
void bidirectional_stream_delay_request_headers_until_flush(
- bidirectional_stream* stream, bool delay_headers_until_flush) {
+ bidirectional_stream* /*stream*/, bool /*delay_headers_until_flush*/) {
GPR_ASSERT(0);
}
-void bidirectional_stream_flush(bidirectional_stream* stream) { GPR_ASSERT(0); }
+void bidirectional_stream_flush(bidirectional_stream* /*stream*/) {
+ GPR_ASSERT(0);
+}
#endif /* GRPC_COMPILE_WITH_CRONET */
}
static int init_stream(grpc_transport* gt, grpc_stream* gs,
- grpc_stream_refcount* refcount, const void* server_data,
- grpc_core::Arena* arena) {
+ grpc_stream_refcount* refcount,
+ const void* /*server_data*/, grpc_core::Arena* arena) {
new (gs) stream_obj(gt, gs, refcount, arena);
return 0;
}
-static void set_pollset_do_nothing(grpc_transport* gt, grpc_stream* gs,
- grpc_pollset* pollset) {}
+static void set_pollset_do_nothing(grpc_transport* /*gt*/, grpc_stream* /*gs*/,
+ grpc_pollset* /*pollset*/) {}
-static void set_pollset_set_do_nothing(grpc_transport* gt, grpc_stream* gs,
- grpc_pollset_set* pollset_set) {}
+static void set_pollset_set_do_nothing(grpc_transport* /*gt*/,
+ grpc_stream* /*gs*/,
+ grpc_pollset_set* /*pollset_set*/) {}
-static void perform_stream_op(grpc_transport* gt, grpc_stream* gs,
+static void perform_stream_op(grpc_transport* /*gt*/, grpc_stream* gs,
grpc_transport_stream_op_batch* op) {
CRONET_LOG(GPR_DEBUG, "perform_stream_op");
if (op->send_initial_metadata &&
execute_from_storage(s);
}
-static void destroy_stream(grpc_transport* gt, grpc_stream* gs,
+static void destroy_stream(grpc_transport* /*gt*/, grpc_stream* gs,
grpc_closure* then_schedule_closure) {
stream_obj* s = reinterpret_cast<stream_obj*>(gs);
s->~stream_obj();
GRPC_ERROR_NONE);
}
-static void destroy_transport(grpc_transport* gt) {}
+static void destroy_transport(grpc_transport* /*gt*/) {}
-static grpc_endpoint* get_endpoint(grpc_transport* gt) { return nullptr; }
+static grpc_endpoint* get_endpoint(grpc_transport* /*gt*/) { return nullptr; }
-static void perform_op(grpc_transport* gt, grpc_transport_op* op) {}
+static void perform_op(grpc_transport* /*gt*/, grpc_transport_op* /*op*/) {}
static const grpc_transport_vtable grpc_cronet_vtable = {
sizeof(stream_obj),
grpc_transport* grpc_create_cronet_transport(void* engine, const char* target,
const grpc_channel_args* args,
- void* reserved) {
+ void* /*reserved*/) {
grpc_cronet_transport* ct = static_cast<grpc_cronet_transport*>(
gpr_malloc(sizeof(grpc_cronet_transport)));
if (!ct) {
#include "envoy/type/matcher/v3/metadata.upb.h"
#include "envoy/type/v3/percent.upb.h"
#include "google/protobuf/any.upb.h"
-#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
-#include "udpa/core/v1/collection_entry.upb.h"
-#include "udpa/core/v1/resource_locator.upb.h"
-#include "envoy/annotations/deprecation.upb.h"
-#include "udpa/annotations/migrate.upb.h"
+#include "xds/core/v3/collection_entry.upb.h"
#include "udpa/annotations/security.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "upb/port_def.inc"
static const upb_msglayout *const envoy_config_cluster_v3_ClusterCollection_submsgs[1] = {
- &udpa_core_v1_CollectionEntry_msginit,
+ &xds_core_v3_CollectionEntry_msginit,
};
static const upb_msglayout_field envoy_config_cluster_v3_ClusterCollection__fields[1] = {
&envoy_config_cluster_v3_Cluster_LeastRequestLbConfig_msginit,
&envoy_config_cluster_v3_Cluster_MaglevLbConfig_msginit,
&envoy_config_cluster_v3_Cluster_OriginalDstLbConfig_msginit,
- &envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit,
+ &envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit,
&envoy_config_cluster_v3_Cluster_RefreshRate_msginit,
&envoy_config_cluster_v3_Cluster_RingHashLbConfig_msginit,
&envoy_config_cluster_v3_Cluster_TransportSocketMatch_msginit,
UPB_SIZE(16, 32), 2, false, 255,
};
-static const upb_msglayout *const envoy_config_cluster_v3_Cluster_EdsClusterConfig_submsgs[2] = {
+static const upb_msglayout *const envoy_config_cluster_v3_Cluster_EdsClusterConfig_submsgs[1] = {
&envoy_config_core_v3_ConfigSource_msginit,
- &udpa_core_v1_ResourceLocator_msginit,
};
-static const upb_msglayout_field envoy_config_cluster_v3_Cluster_EdsClusterConfig__fields[3] = {
+static const upb_msglayout_field envoy_config_cluster_v3_Cluster_EdsClusterConfig__fields[2] = {
{1, UPB_SIZE(12, 24), 1, 0, 11, 1},
{2, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {3, UPB_SIZE(16, 32), 2, 1, 11, 1},
};
const upb_msglayout envoy_config_cluster_v3_Cluster_EdsClusterConfig_msginit = {
&envoy_config_cluster_v3_Cluster_EdsClusterConfig_submsgs[0],
&envoy_config_cluster_v3_Cluster_EdsClusterConfig__fields[0],
- UPB_SIZE(24, 48), 3, false, 255,
+ UPB_SIZE(16, 32), 2, false, 255,
};
static const upb_msglayout *const envoy_config_cluster_v3_Cluster_LbSubsetConfig_submsgs[2] = {
UPB_SIZE(16, 24), 2, false, 255,
};
-static const upb_msglayout *const envoy_config_cluster_v3_Cluster_PrefetchPolicy_submsgs[1] = {
+static const upb_msglayout *const envoy_config_cluster_v3_Cluster_PreconnectPolicy_submsgs[1] = {
&google_protobuf_DoubleValue_msginit,
};
-static const upb_msglayout_field envoy_config_cluster_v3_Cluster_PrefetchPolicy__fields[2] = {
+static const upb_msglayout_field envoy_config_cluster_v3_Cluster_PreconnectPolicy__fields[2] = {
{1, UPB_SIZE(4, 8), 1, 0, 11, 1},
{2, UPB_SIZE(8, 16), 2, 0, 11, 1},
};
-const upb_msglayout envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit = {
- &envoy_config_cluster_v3_Cluster_PrefetchPolicy_submsgs[0],
- &envoy_config_cluster_v3_Cluster_PrefetchPolicy__fields[0],
+const upb_msglayout envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit = {
+ &envoy_config_cluster_v3_Cluster_PreconnectPolicy_submsgs[0],
+ &envoy_config_cluster_v3_Cluster_PreconnectPolicy__fields[0],
UPB_SIZE(16, 24), 2, false, 255,
};
struct envoy_config_cluster_v3_Cluster_CommonLbConfig_LocalityWeightedLbConfig;
struct envoy_config_cluster_v3_Cluster_CommonLbConfig_ConsistentHashingLbConfig;
struct envoy_config_cluster_v3_Cluster_RefreshRate;
-struct envoy_config_cluster_v3_Cluster_PrefetchPolicy;
+struct envoy_config_cluster_v3_Cluster_PreconnectPolicy;
struct envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry;
struct envoy_config_cluster_v3_LoadBalancingPolicy;
struct envoy_config_cluster_v3_LoadBalancingPolicy_Policy;
typedef struct envoy_config_cluster_v3_Cluster_CommonLbConfig_LocalityWeightedLbConfig envoy_config_cluster_v3_Cluster_CommonLbConfig_LocalityWeightedLbConfig;
typedef struct envoy_config_cluster_v3_Cluster_CommonLbConfig_ConsistentHashingLbConfig envoy_config_cluster_v3_Cluster_CommonLbConfig_ConsistentHashingLbConfig;
typedef struct envoy_config_cluster_v3_Cluster_RefreshRate envoy_config_cluster_v3_Cluster_RefreshRate;
-typedef struct envoy_config_cluster_v3_Cluster_PrefetchPolicy envoy_config_cluster_v3_Cluster_PrefetchPolicy;
+typedef struct envoy_config_cluster_v3_Cluster_PreconnectPolicy envoy_config_cluster_v3_Cluster_PreconnectPolicy;
typedef struct envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry;
typedef struct envoy_config_cluster_v3_LoadBalancingPolicy envoy_config_cluster_v3_LoadBalancingPolicy;
typedef struct envoy_config_cluster_v3_LoadBalancingPolicy_Policy envoy_config_cluster_v3_LoadBalancingPolicy_Policy;
extern const upb_msglayout envoy_config_cluster_v3_Cluster_CommonLbConfig_LocalityWeightedLbConfig_msginit;
extern const upb_msglayout envoy_config_cluster_v3_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit;
extern const upb_msglayout envoy_config_cluster_v3_Cluster_RefreshRate_msginit;
-extern const upb_msglayout envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit;
+extern const upb_msglayout envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit;
extern const upb_msglayout envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry_msginit;
extern const upb_msglayout envoy_config_cluster_v3_LoadBalancingPolicy_msginit;
extern const upb_msglayout envoy_config_cluster_v3_LoadBalancingPolicy_Policy_msginit;
struct google_protobuf_Struct;
struct google_protobuf_UInt32Value;
struct google_protobuf_UInt64Value;
-struct udpa_core_v1_CollectionEntry;
-struct udpa_core_v1_ResourceLocator;
+struct xds_core_v3_CollectionEntry;
extern const upb_msglayout envoy_config_cluster_v3_CircuitBreakers_msginit;
extern const upb_msglayout envoy_config_cluster_v3_Filter_msginit;
extern const upb_msglayout envoy_config_cluster_v3_OutlierDetection_msginit;
extern const upb_msglayout google_protobuf_Struct_msginit;
extern const upb_msglayout google_protobuf_UInt32Value_msginit;
extern const upb_msglayout google_protobuf_UInt64Value_msginit;
-extern const upb_msglayout udpa_core_v1_CollectionEntry_msginit;
-extern const upb_msglayout udpa_core_v1_ResourceLocator_msginit;
+extern const upb_msglayout xds_core_v3_CollectionEntry_msginit;
typedef enum {
envoy_config_cluster_v3_Cluster_USE_CONFIGURED_PROTOCOL = 0,
}
UPB_INLINE bool envoy_config_cluster_v3_ClusterCollection_has_entries(const envoy_config_cluster_v3_ClusterCollection *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct udpa_core_v1_CollectionEntry* envoy_config_cluster_v3_ClusterCollection_entries(const envoy_config_cluster_v3_ClusterCollection *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct udpa_core_v1_CollectionEntry*); }
+UPB_INLINE const struct xds_core_v3_CollectionEntry* envoy_config_cluster_v3_ClusterCollection_entries(const envoy_config_cluster_v3_ClusterCollection *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct xds_core_v3_CollectionEntry*); }
-UPB_INLINE void envoy_config_cluster_v3_ClusterCollection_set_entries(envoy_config_cluster_v3_ClusterCollection *msg, struct udpa_core_v1_CollectionEntry* value) {
+UPB_INLINE void envoy_config_cluster_v3_ClusterCollection_set_entries(envoy_config_cluster_v3_ClusterCollection *msg, struct xds_core_v3_CollectionEntry* value) {
_upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct udpa_core_v1_CollectionEntry*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct xds_core_v3_CollectionEntry*) = value;
}
-UPB_INLINE struct udpa_core_v1_CollectionEntry* envoy_config_cluster_v3_ClusterCollection_mutable_entries(envoy_config_cluster_v3_ClusterCollection *msg, upb_arena *arena) {
- struct udpa_core_v1_CollectionEntry* sub = (struct udpa_core_v1_CollectionEntry*)envoy_config_cluster_v3_ClusterCollection_entries(msg);
+UPB_INLINE struct xds_core_v3_CollectionEntry* envoy_config_cluster_v3_ClusterCollection_mutable_entries(envoy_config_cluster_v3_ClusterCollection *msg, upb_arena *arena) {
+ struct xds_core_v3_CollectionEntry* sub = (struct xds_core_v3_CollectionEntry*)envoy_config_cluster_v3_ClusterCollection_entries(msg);
if (sub == NULL) {
- sub = (struct udpa_core_v1_CollectionEntry*)_upb_msg_new(&udpa_core_v1_CollectionEntry_msginit, arena);
+ sub = (struct xds_core_v3_CollectionEntry*)_upb_msg_new(&xds_core_v3_CollectionEntry_msginit, arena);
if (!sub) return NULL;
envoy_config_cluster_v3_ClusterCollection_set_entries(msg, sub);
}
UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_cluster_v3_Cluster_upstream_config(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(128, 232), const struct envoy_config_core_v3_TypedExtensionConfig*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_track_cluster_stats(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 24); }
UPB_INLINE const envoy_config_cluster_v3_TrackClusterStats* envoy_config_cluster_v3_Cluster_track_cluster_stats(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(132, 240), const envoy_config_cluster_v3_TrackClusterStats*); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_prefetch_policy(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 25); }
-UPB_INLINE const envoy_config_cluster_v3_Cluster_PrefetchPolicy* envoy_config_cluster_v3_Cluster_prefetch_policy(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(136, 248), const envoy_config_cluster_v3_Cluster_PrefetchPolicy*); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_preconnect_policy(const envoy_config_cluster_v3_Cluster *msg) { return _upb_hasbit(msg, 25); }
+UPB_INLINE const envoy_config_cluster_v3_Cluster_PreconnectPolicy* envoy_config_cluster_v3_Cluster_preconnect_policy(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(136, 248), const envoy_config_cluster_v3_Cluster_PreconnectPolicy*); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_connection_pool_per_downstream_connection(const envoy_config_cluster_v3_Cluster *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(21, 21), bool); }
UPB_INLINE bool envoy_config_cluster_v3_Cluster_has_maglev_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return _upb_getoneofcase(msg, UPB_SIZE(172, 320)) == 52; }
UPB_INLINE const envoy_config_cluster_v3_Cluster_MaglevLbConfig* envoy_config_cluster_v3_Cluster_maglev_lb_config(const envoy_config_cluster_v3_Cluster *msg) { return UPB_READ_ONEOF(msg, const envoy_config_cluster_v3_Cluster_MaglevLbConfig*, UPB_SIZE(168, 312), UPB_SIZE(172, 320), 52, NULL); }
}
return sub;
}
-UPB_INLINE void envoy_config_cluster_v3_Cluster_set_prefetch_policy(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_PrefetchPolicy* value) {
+UPB_INLINE void envoy_config_cluster_v3_Cluster_set_preconnect_policy(envoy_config_cluster_v3_Cluster *msg, envoy_config_cluster_v3_Cluster_PreconnectPolicy* value) {
_upb_sethas(msg, 25);
- *UPB_PTR_AT(msg, UPB_SIZE(136, 248), envoy_config_cluster_v3_Cluster_PrefetchPolicy*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(136, 248), envoy_config_cluster_v3_Cluster_PreconnectPolicy*) = value;
}
-UPB_INLINE struct envoy_config_cluster_v3_Cluster_PrefetchPolicy* envoy_config_cluster_v3_Cluster_mutable_prefetch_policy(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
- struct envoy_config_cluster_v3_Cluster_PrefetchPolicy* sub = (struct envoy_config_cluster_v3_Cluster_PrefetchPolicy*)envoy_config_cluster_v3_Cluster_prefetch_policy(msg);
+UPB_INLINE struct envoy_config_cluster_v3_Cluster_PreconnectPolicy* envoy_config_cluster_v3_Cluster_mutable_preconnect_policy(envoy_config_cluster_v3_Cluster *msg, upb_arena *arena) {
+ struct envoy_config_cluster_v3_Cluster_PreconnectPolicy* sub = (struct envoy_config_cluster_v3_Cluster_PreconnectPolicy*)envoy_config_cluster_v3_Cluster_preconnect_policy(msg);
if (sub == NULL) {
- sub = (struct envoy_config_cluster_v3_Cluster_PrefetchPolicy*)_upb_msg_new(&envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit, arena);
+ sub = (struct envoy_config_cluster_v3_Cluster_PreconnectPolicy*)_upb_msg_new(&envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit, arena);
if (!sub) return NULL;
- envoy_config_cluster_v3_Cluster_set_prefetch_policy(msg, sub);
+ envoy_config_cluster_v3_Cluster_set_preconnect_policy(msg, sub);
}
return sub;
}
UPB_INLINE bool envoy_config_cluster_v3_Cluster_EdsClusterConfig_has_eds_config(const envoy_config_cluster_v3_Cluster_EdsClusterConfig *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct envoy_config_core_v3_ConfigSource* envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(const envoy_config_cluster_v3_Cluster_EdsClusterConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct envoy_config_core_v3_ConfigSource*); }
UPB_INLINE upb_strview envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(const envoy_config_cluster_v3_Cluster_EdsClusterConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_EdsClusterConfig_has_eds_resource_locator(const envoy_config_cluster_v3_Cluster_EdsClusterConfig *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const struct udpa_core_v1_ResourceLocator* envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_resource_locator(const envoy_config_cluster_v3_Cluster_EdsClusterConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const struct udpa_core_v1_ResourceLocator*); }
UPB_INLINE void envoy_config_cluster_v3_Cluster_EdsClusterConfig_set_eds_config(envoy_config_cluster_v3_Cluster_EdsClusterConfig *msg, struct envoy_config_core_v3_ConfigSource* value) {
_upb_sethas(msg, 1);
UPB_INLINE void envoy_config_cluster_v3_Cluster_EdsClusterConfig_set_service_name(envoy_config_cluster_v3_Cluster_EdsClusterConfig *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
}
-UPB_INLINE void envoy_config_cluster_v3_Cluster_EdsClusterConfig_set_eds_resource_locator(envoy_config_cluster_v3_Cluster_EdsClusterConfig *msg, struct udpa_core_v1_ResourceLocator* value) {
- _upb_sethas(msg, 2);
- *UPB_PTR_AT(msg, UPB_SIZE(16, 32), struct udpa_core_v1_ResourceLocator*) = value;
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator* envoy_config_cluster_v3_Cluster_EdsClusterConfig_mutable_eds_resource_locator(envoy_config_cluster_v3_Cluster_EdsClusterConfig *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceLocator* sub = (struct udpa_core_v1_ResourceLocator*)envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_resource_locator(msg);
- if (sub == NULL) {
- sub = (struct udpa_core_v1_ResourceLocator*)_upb_msg_new(&udpa_core_v1_ResourceLocator_msginit, arena);
- if (!sub) return NULL;
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_set_eds_resource_locator(msg, sub);
- }
- return sub;
-}
/* envoy.config.cluster.v3.Cluster.LbSubsetConfig */
return sub;
}
-/* envoy.config.cluster.v3.Cluster.PrefetchPolicy */
+/* envoy.config.cluster.v3.Cluster.PreconnectPolicy */
-UPB_INLINE envoy_config_cluster_v3_Cluster_PrefetchPolicy *envoy_config_cluster_v3_Cluster_PrefetchPolicy_new(upb_arena *arena) {
- return (envoy_config_cluster_v3_Cluster_PrefetchPolicy *)_upb_msg_new(&envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit, arena);
+UPB_INLINE envoy_config_cluster_v3_Cluster_PreconnectPolicy *envoy_config_cluster_v3_Cluster_PreconnectPolicy_new(upb_arena *arena) {
+ return (envoy_config_cluster_v3_Cluster_PreconnectPolicy *)_upb_msg_new(&envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit, arena);
}
-UPB_INLINE envoy_config_cluster_v3_Cluster_PrefetchPolicy *envoy_config_cluster_v3_Cluster_PrefetchPolicy_parse(const char *buf, size_t size,
+UPB_INLINE envoy_config_cluster_v3_Cluster_PreconnectPolicy *envoy_config_cluster_v3_Cluster_PreconnectPolicy_parse(const char *buf, size_t size,
upb_arena *arena) {
- envoy_config_cluster_v3_Cluster_PrefetchPolicy *ret = envoy_config_cluster_v3_Cluster_PrefetchPolicy_new(arena);
- return (ret && upb_decode(buf, size, ret, &envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit, arena)) ? ret : NULL;
+ envoy_config_cluster_v3_Cluster_PreconnectPolicy *ret = envoy_config_cluster_v3_Cluster_PreconnectPolicy_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit, arena)) ? ret : NULL;
}
-UPB_INLINE envoy_config_cluster_v3_Cluster_PrefetchPolicy *envoy_config_cluster_v3_Cluster_PrefetchPolicy_parse_ex(const char *buf, size_t size,
+UPB_INLINE envoy_config_cluster_v3_Cluster_PreconnectPolicy *envoy_config_cluster_v3_Cluster_PreconnectPolicy_parse_ex(const char *buf, size_t size,
upb_arena *arena, int options) {
- envoy_config_cluster_v3_Cluster_PrefetchPolicy *ret = envoy_config_cluster_v3_Cluster_PrefetchPolicy_new(arena);
- return (ret && _upb_decode(buf, size, ret, &envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit, arena, options))
+ envoy_config_cluster_v3_Cluster_PreconnectPolicy *ret = envoy_config_cluster_v3_Cluster_PreconnectPolicy_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit, arena, options))
? ret : NULL;
}
-UPB_INLINE char *envoy_config_cluster_v3_Cluster_PrefetchPolicy_serialize(const envoy_config_cluster_v3_Cluster_PrefetchPolicy *msg, upb_arena *arena, size_t *len) {
- return upb_encode(msg, &envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit, arena, len);
+UPB_INLINE char *envoy_config_cluster_v3_Cluster_PreconnectPolicy_serialize(const envoy_config_cluster_v3_Cluster_PreconnectPolicy *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit, arena, len);
}
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_PrefetchPolicy_has_per_upstream_prefetch_ratio(const envoy_config_cluster_v3_Cluster_PrefetchPolicy *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct google_protobuf_DoubleValue* envoy_config_cluster_v3_Cluster_PrefetchPolicy_per_upstream_prefetch_ratio(const envoy_config_cluster_v3_Cluster_PrefetchPolicy *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct google_protobuf_DoubleValue*); }
-UPB_INLINE bool envoy_config_cluster_v3_Cluster_PrefetchPolicy_has_predictive_prefetch_ratio(const envoy_config_cluster_v3_Cluster_PrefetchPolicy *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const struct google_protobuf_DoubleValue* envoy_config_cluster_v3_Cluster_PrefetchPolicy_predictive_prefetch_ratio(const envoy_config_cluster_v3_Cluster_PrefetchPolicy *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), const struct google_protobuf_DoubleValue*); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_PreconnectPolicy_has_per_upstream_preconnect_ratio(const envoy_config_cluster_v3_Cluster_PreconnectPolicy *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct google_protobuf_DoubleValue* envoy_config_cluster_v3_Cluster_PreconnectPolicy_per_upstream_preconnect_ratio(const envoy_config_cluster_v3_Cluster_PreconnectPolicy *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct google_protobuf_DoubleValue*); }
+UPB_INLINE bool envoy_config_cluster_v3_Cluster_PreconnectPolicy_has_predictive_preconnect_ratio(const envoy_config_cluster_v3_Cluster_PreconnectPolicy *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct google_protobuf_DoubleValue* envoy_config_cluster_v3_Cluster_PreconnectPolicy_predictive_preconnect_ratio(const envoy_config_cluster_v3_Cluster_PreconnectPolicy *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), const struct google_protobuf_DoubleValue*); }
-UPB_INLINE void envoy_config_cluster_v3_Cluster_PrefetchPolicy_set_per_upstream_prefetch_ratio(envoy_config_cluster_v3_Cluster_PrefetchPolicy *msg, struct google_protobuf_DoubleValue* value) {
+UPB_INLINE void envoy_config_cluster_v3_Cluster_PreconnectPolicy_set_per_upstream_preconnect_ratio(envoy_config_cluster_v3_Cluster_PreconnectPolicy *msg, struct google_protobuf_DoubleValue* value) {
_upb_sethas(msg, 1);
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), struct google_protobuf_DoubleValue*) = value;
}
-UPB_INLINE struct google_protobuf_DoubleValue* envoy_config_cluster_v3_Cluster_PrefetchPolicy_mutable_per_upstream_prefetch_ratio(envoy_config_cluster_v3_Cluster_PrefetchPolicy *msg, upb_arena *arena) {
- struct google_protobuf_DoubleValue* sub = (struct google_protobuf_DoubleValue*)envoy_config_cluster_v3_Cluster_PrefetchPolicy_per_upstream_prefetch_ratio(msg);
+UPB_INLINE struct google_protobuf_DoubleValue* envoy_config_cluster_v3_Cluster_PreconnectPolicy_mutable_per_upstream_preconnect_ratio(envoy_config_cluster_v3_Cluster_PreconnectPolicy *msg, upb_arena *arena) {
+ struct google_protobuf_DoubleValue* sub = (struct google_protobuf_DoubleValue*)envoy_config_cluster_v3_Cluster_PreconnectPolicy_per_upstream_preconnect_ratio(msg);
if (sub == NULL) {
sub = (struct google_protobuf_DoubleValue*)_upb_msg_new(&google_protobuf_DoubleValue_msginit, arena);
if (!sub) return NULL;
- envoy_config_cluster_v3_Cluster_PrefetchPolicy_set_per_upstream_prefetch_ratio(msg, sub);
+ envoy_config_cluster_v3_Cluster_PreconnectPolicy_set_per_upstream_preconnect_ratio(msg, sub);
}
return sub;
}
-UPB_INLINE void envoy_config_cluster_v3_Cluster_PrefetchPolicy_set_predictive_prefetch_ratio(envoy_config_cluster_v3_Cluster_PrefetchPolicy *msg, struct google_protobuf_DoubleValue* value) {
+UPB_INLINE void envoy_config_cluster_v3_Cluster_PreconnectPolicy_set_predictive_preconnect_ratio(envoy_config_cluster_v3_Cluster_PreconnectPolicy *msg, struct google_protobuf_DoubleValue* value) {
_upb_sethas(msg, 2);
*UPB_PTR_AT(msg, UPB_SIZE(8, 16), struct google_protobuf_DoubleValue*) = value;
}
-UPB_INLINE struct google_protobuf_DoubleValue* envoy_config_cluster_v3_Cluster_PrefetchPolicy_mutable_predictive_prefetch_ratio(envoy_config_cluster_v3_Cluster_PrefetchPolicy *msg, upb_arena *arena) {
- struct google_protobuf_DoubleValue* sub = (struct google_protobuf_DoubleValue*)envoy_config_cluster_v3_Cluster_PrefetchPolicy_predictive_prefetch_ratio(msg);
+UPB_INLINE struct google_protobuf_DoubleValue* envoy_config_cluster_v3_Cluster_PreconnectPolicy_mutable_predictive_preconnect_ratio(envoy_config_cluster_v3_Cluster_PreconnectPolicy *msg, upb_arena *arena) {
+ struct google_protobuf_DoubleValue* sub = (struct google_protobuf_DoubleValue*)envoy_config_cluster_v3_Cluster_PreconnectPolicy_predictive_preconnect_ratio(msg);
if (sub == NULL) {
sub = (struct google_protobuf_DoubleValue*)_upb_msg_new(&google_protobuf_DoubleValue_msginit, arena);
if (!sub) return NULL;
- envoy_config_cluster_v3_Cluster_PrefetchPolicy_set_predictive_prefetch_ratio(msg, sub);
+ envoy_config_cluster_v3_Cluster_PreconnectPolicy_set_predictive_preconnect_ratio(msg, sub);
}
return sub;
}
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_cluster_v3_OutlierDetection__fields[20] = {
+static const upb_msglayout_field envoy_config_cluster_v3_OutlierDetection__fields[21] = {
{1, UPB_SIZE(4, 8), 1, 1, 11, 1},
{2, UPB_SIZE(8, 16), 2, 0, 11, 1},
{3, UPB_SIZE(12, 24), 3, 0, 11, 1},
{18, UPB_SIZE(68, 136), 17, 1, 11, 1},
{19, UPB_SIZE(72, 144), 18, 1, 11, 1},
{20, UPB_SIZE(76, 152), 19, 1, 11, 1},
+ {21, UPB_SIZE(80, 160), 20, 0, 11, 1},
};
const upb_msglayout envoy_config_cluster_v3_OutlierDetection_msginit = {
&envoy_config_cluster_v3_OutlierDetection_submsgs[0],
&envoy_config_cluster_v3_OutlierDetection__fields[0],
- UPB_SIZE(80, 160), 20, false, 255,
+ UPB_SIZE(88, 168), 21, false, 255,
};
#include "upb/port_undef.inc"
UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_cluster_v3_OutlierDetection_failure_percentage_minimum_hosts(const envoy_config_cluster_v3_OutlierDetection *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 144), const struct google_protobuf_UInt32Value*); }
UPB_INLINE bool envoy_config_cluster_v3_OutlierDetection_has_failure_percentage_request_volume(const envoy_config_cluster_v3_OutlierDetection *msg) { return _upb_hasbit(msg, 19); }
UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_cluster_v3_OutlierDetection_failure_percentage_request_volume(const envoy_config_cluster_v3_OutlierDetection *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 152), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_cluster_v3_OutlierDetection_has_max_ejection_time(const envoy_config_cluster_v3_OutlierDetection *msg) { return _upb_hasbit(msg, 20); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_config_cluster_v3_OutlierDetection_max_ejection_time(const envoy_config_cluster_v3_OutlierDetection *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 160), const struct google_protobuf_Duration*); }
UPB_INLINE void envoy_config_cluster_v3_OutlierDetection_set_consecutive_5xx(envoy_config_cluster_v3_OutlierDetection *msg, struct google_protobuf_UInt32Value* value) {
_upb_sethas(msg, 1);
}
return sub;
}
+UPB_INLINE void envoy_config_cluster_v3_OutlierDetection_set_max_ejection_time(envoy_config_cluster_v3_OutlierDetection *msg, struct google_protobuf_Duration* value) {
+ _upb_sethas(msg, 20);
+ *UPB_PTR_AT(msg, UPB_SIZE(80, 160), struct google_protobuf_Duration*) = value;
+}
+UPB_INLINE struct google_protobuf_Duration* envoy_config_cluster_v3_OutlierDetection_mutable_max_ejection_time(envoy_config_cluster_v3_OutlierDetection *msg, upb_arena *arena) {
+ struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_cluster_v3_OutlierDetection_max_ejection_time(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Duration*)_upb_msg_new(&google_protobuf_Duration_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_cluster_v3_OutlierDetection_set_max_ejection_time(msg, sub);
+ }
+ return sub;
+}
#ifdef __cplusplus
} /* extern "C" */
#include "envoy/type/v3/percent.upb.h"
#include "envoy/type/v3/semantic_version.upb.h"
#include "google/protobuf/any.upb.h"
-#include "google/protobuf/duration.upb.h"
#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "udpa/annotations/migrate.upb.h"
UPB_SIZE(16, 32), 2, false, 255,
};
+static const upb_msglayout *const envoy_config_core_v3_RuntimePercent_submsgs[1] = {
+ &envoy_type_v3_Percent_msginit,
+};
+
+static const upb_msglayout_field envoy_config_core_v3_RuntimePercent__fields[2] = {
+ {1, UPB_SIZE(12, 24), 1, 0, 11, 1},
+ {2, UPB_SIZE(4, 8), 0, 0, 9, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_RuntimePercent_msginit = {
+ &envoy_config_core_v3_RuntimePercent_submsgs[0],
+ &envoy_config_core_v3_RuntimePercent__fields[0],
+ UPB_SIZE(16, 32), 2, false, 255,
+};
+
static const upb_msglayout_field envoy_config_core_v3_RuntimeDouble__fields[2] = {
{1, UPB_SIZE(0, 0), 0, 0, 1, 1},
{2, UPB_SIZE(8, 8), 0, 0, 9, 1},
UPB_SIZE(8, 8), 1, false, 255,
};
+static const upb_msglayout_field envoy_config_core_v3_WatchedDirectory__fields[1] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
+};
+
+const upb_msglayout envoy_config_core_v3_WatchedDirectory_msginit = {
+ NULL,
+ &envoy_config_core_v3_WatchedDirectory__fields[0],
+ UPB_SIZE(8, 16), 1, false, 255,
+};
+
static const upb_msglayout_field envoy_config_core_v3_DataSource__fields[3] = {
{1, UPB_SIZE(0, 0), UPB_SIZE(-9, -17), 0, 9, 1},
{2, UPB_SIZE(0, 0), UPB_SIZE(-9, -17), 0, 12, 1},
struct envoy_config_core_v3_Metadata;
struct envoy_config_core_v3_Metadata_FilterMetadataEntry;
struct envoy_config_core_v3_RuntimeUInt32;
+struct envoy_config_core_v3_RuntimePercent;
struct envoy_config_core_v3_RuntimeDouble;
struct envoy_config_core_v3_RuntimeFeatureFlag;
struct envoy_config_core_v3_HeaderValue;
struct envoy_config_core_v3_HeaderValueOption;
struct envoy_config_core_v3_HeaderMap;
+struct envoy_config_core_v3_WatchedDirectory;
struct envoy_config_core_v3_DataSource;
struct envoy_config_core_v3_RetryPolicy;
struct envoy_config_core_v3_RemoteDataSource;
typedef struct envoy_config_core_v3_Metadata envoy_config_core_v3_Metadata;
typedef struct envoy_config_core_v3_Metadata_FilterMetadataEntry envoy_config_core_v3_Metadata_FilterMetadataEntry;
typedef struct envoy_config_core_v3_RuntimeUInt32 envoy_config_core_v3_RuntimeUInt32;
+typedef struct envoy_config_core_v3_RuntimePercent envoy_config_core_v3_RuntimePercent;
typedef struct envoy_config_core_v3_RuntimeDouble envoy_config_core_v3_RuntimeDouble;
typedef struct envoy_config_core_v3_RuntimeFeatureFlag envoy_config_core_v3_RuntimeFeatureFlag;
typedef struct envoy_config_core_v3_HeaderValue envoy_config_core_v3_HeaderValue;
typedef struct envoy_config_core_v3_HeaderValueOption envoy_config_core_v3_HeaderValueOption;
typedef struct envoy_config_core_v3_HeaderMap envoy_config_core_v3_HeaderMap;
+typedef struct envoy_config_core_v3_WatchedDirectory envoy_config_core_v3_WatchedDirectory;
typedef struct envoy_config_core_v3_DataSource envoy_config_core_v3_DataSource;
typedef struct envoy_config_core_v3_RetryPolicy envoy_config_core_v3_RetryPolicy;
typedef struct envoy_config_core_v3_RemoteDataSource envoy_config_core_v3_RemoteDataSource;
extern const upb_msglayout envoy_config_core_v3_Metadata_msginit;
extern const upb_msglayout envoy_config_core_v3_Metadata_FilterMetadataEntry_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeUInt32_msginit;
+extern const upb_msglayout envoy_config_core_v3_RuntimePercent_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeDouble_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeFeatureFlag_msginit;
extern const upb_msglayout envoy_config_core_v3_HeaderValue_msginit;
extern const upb_msglayout envoy_config_core_v3_HeaderValueOption_msginit;
extern const upb_msglayout envoy_config_core_v3_HeaderMap_msginit;
+extern const upb_msglayout envoy_config_core_v3_WatchedDirectory_msginit;
extern const upb_msglayout envoy_config_core_v3_DataSource_msginit;
extern const upb_msglayout envoy_config_core_v3_RetryPolicy_msginit;
extern const upb_msglayout envoy_config_core_v3_RemoteDataSource_msginit;
struct envoy_config_core_v3_BackoffStrategy;
struct envoy_config_core_v3_HttpUri;
struct envoy_type_v3_FractionalPercent;
+struct envoy_type_v3_Percent;
struct envoy_type_v3_SemanticVersion;
struct google_protobuf_Any;
struct google_protobuf_BoolValue;
extern const upb_msglayout envoy_config_core_v3_BackoffStrategy_msginit;
extern const upb_msglayout envoy_config_core_v3_HttpUri_msginit;
extern const upb_msglayout envoy_type_v3_FractionalPercent_msginit;
+extern const upb_msglayout envoy_type_v3_Percent_msginit;
extern const upb_msglayout envoy_type_v3_SemanticVersion_msginit;
extern const upb_msglayout google_protobuf_Any_msginit;
extern const upb_msglayout google_protobuf_BoolValue_msginit;
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
}
+/* envoy.config.core.v3.RuntimePercent */
+
+UPB_INLINE envoy_config_core_v3_RuntimePercent *envoy_config_core_v3_RuntimePercent_new(upb_arena *arena) {
+ return (envoy_config_core_v3_RuntimePercent *)_upb_msg_new(&envoy_config_core_v3_RuntimePercent_msginit, arena);
+}
+UPB_INLINE envoy_config_core_v3_RuntimePercent *envoy_config_core_v3_RuntimePercent_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_core_v3_RuntimePercent *ret = envoy_config_core_v3_RuntimePercent_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_core_v3_RuntimePercent_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_core_v3_RuntimePercent *envoy_config_core_v3_RuntimePercent_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_core_v3_RuntimePercent *ret = envoy_config_core_v3_RuntimePercent_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_core_v3_RuntimePercent_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_core_v3_RuntimePercent_serialize(const envoy_config_core_v3_RuntimePercent *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_core_v3_RuntimePercent_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_config_core_v3_RuntimePercent_has_default_value(const envoy_config_core_v3_RuntimePercent *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct envoy_type_v3_Percent* envoy_config_core_v3_RuntimePercent_default_value(const envoy_config_core_v3_RuntimePercent *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct envoy_type_v3_Percent*); }
+UPB_INLINE upb_strview envoy_config_core_v3_RuntimePercent_runtime_key(const envoy_config_core_v3_RuntimePercent *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+
+UPB_INLINE void envoy_config_core_v3_RuntimePercent_set_default_value(envoy_config_core_v3_RuntimePercent *msg, struct envoy_type_v3_Percent* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), struct envoy_type_v3_Percent*) = value;
+}
+UPB_INLINE struct envoy_type_v3_Percent* envoy_config_core_v3_RuntimePercent_mutable_default_value(envoy_config_core_v3_RuntimePercent *msg, upb_arena *arena) {
+ struct envoy_type_v3_Percent* sub = (struct envoy_type_v3_Percent*)envoy_config_core_v3_RuntimePercent_default_value(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_type_v3_Percent*)_upb_msg_new(&envoy_type_v3_Percent_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_RuntimePercent_set_default_value(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_core_v3_RuntimePercent_set_runtime_key(envoy_config_core_v3_RuntimePercent *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+}
+
/* envoy.config.core.v3.RuntimeDouble */
UPB_INLINE envoy_config_core_v3_RuntimeDouble *envoy_config_core_v3_RuntimeDouble_new(upb_arena *arena) {
return sub;
}
+/* envoy.config.core.v3.WatchedDirectory */
+
+UPB_INLINE envoy_config_core_v3_WatchedDirectory *envoy_config_core_v3_WatchedDirectory_new(upb_arena *arena) {
+ return (envoy_config_core_v3_WatchedDirectory *)_upb_msg_new(&envoy_config_core_v3_WatchedDirectory_msginit, arena);
+}
+UPB_INLINE envoy_config_core_v3_WatchedDirectory *envoy_config_core_v3_WatchedDirectory_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_core_v3_WatchedDirectory *ret = envoy_config_core_v3_WatchedDirectory_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_core_v3_WatchedDirectory_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_core_v3_WatchedDirectory *envoy_config_core_v3_WatchedDirectory_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_core_v3_WatchedDirectory *ret = envoy_config_core_v3_WatchedDirectory_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_core_v3_WatchedDirectory_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_core_v3_WatchedDirectory_serialize(const envoy_config_core_v3_WatchedDirectory *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_core_v3_WatchedDirectory_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview envoy_config_core_v3_WatchedDirectory_path(const envoy_config_core_v3_WatchedDirectory *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview); }
+
+UPB_INLINE void envoy_config_core_v3_WatchedDirectory_set_path(envoy_config_core_v3_WatchedDirectory *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview) = value;
+}
+
/* envoy.config.core.v3.DataSource */
UPB_INLINE envoy_config_core_v3_DataSource *envoy_config_core_v3_DataSource_new(upb_arena *arena) {
#include "envoy/config/core/v3/grpc_service.upb.h"
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/wrappers.upb.h"
-#include "udpa/core/v1/authority.upb.h"
+#include "xds/core/v3/authority.upb.h"
#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
&envoy_config_core_v3_ApiConfigSource_msginit,
&envoy_config_core_v3_SelfConfigSource_msginit,
&google_protobuf_Duration_msginit,
- &udpa_core_v1_Authority_msginit,
+ &xds_core_v3_Authority_msginit,
};
static const upb_msglayout_field envoy_config_core_v3_ConfigSource__fields[7] = {
struct google_protobuf_DoubleValue;
struct google_protobuf_Duration;
struct google_protobuf_UInt32Value;
-struct udpa_core_v1_Authority;
+struct xds_core_v3_Authority;
extern const upb_msglayout envoy_config_core_v3_GrpcService_msginit;
extern const upb_msglayout google_protobuf_DoubleValue_msginit;
extern const upb_msglayout google_protobuf_Duration_msginit;
extern const upb_msglayout google_protobuf_UInt32Value_msginit;
-extern const upb_msglayout udpa_core_v1_Authority_msginit;
+extern const upb_msglayout xds_core_v3_Authority_msginit;
typedef enum {
envoy_config_core_v3_ApiConfigSource_DEPRECATED_AND_UNAVAILABLE_DO_NOT_USE = 0,
UPB_INLINE const envoy_config_core_v3_SelfConfigSource* envoy_config_core_v3_ConfigSource_self(const envoy_config_core_v3_ConfigSource *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_SelfConfigSource*, UPB_SIZE(16, 24), UPB_SIZE(24, 40), 5, NULL); }
UPB_INLINE int32_t envoy_config_core_v3_ConfigSource_resource_api_version(const envoy_config_core_v3_ConfigSource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
UPB_INLINE bool envoy_config_core_v3_ConfigSource_has_authorities(const envoy_config_core_v3_ConfigSource *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(12, 16)); }
-UPB_INLINE const struct udpa_core_v1_Authority* const* envoy_config_core_v3_ConfigSource_authorities(const envoy_config_core_v3_ConfigSource *msg, size_t *len) { return (const struct udpa_core_v1_Authority* const*)_upb_array_accessor(msg, UPB_SIZE(12, 16), len); }
+UPB_INLINE const struct xds_core_v3_Authority* const* envoy_config_core_v3_ConfigSource_authorities(const envoy_config_core_v3_ConfigSource *msg, size_t *len) { return (const struct xds_core_v3_Authority* const*)_upb_array_accessor(msg, UPB_SIZE(12, 16), len); }
UPB_INLINE void envoy_config_core_v3_ConfigSource_set_path(envoy_config_core_v3_ConfigSource *msg, upb_strview value) {
UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(16, 24), value, UPB_SIZE(24, 40), 1);
UPB_INLINE void envoy_config_core_v3_ConfigSource_set_resource_api_version(envoy_config_core_v3_ConfigSource *msg, int32_t value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
}
-UPB_INLINE struct udpa_core_v1_Authority** envoy_config_core_v3_ConfigSource_mutable_authorities(envoy_config_core_v3_ConfigSource *msg, size_t *len) {
- return (struct udpa_core_v1_Authority**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 16), len);
+UPB_INLINE struct xds_core_v3_Authority** envoy_config_core_v3_ConfigSource_mutable_authorities(envoy_config_core_v3_ConfigSource *msg, size_t *len) {
+ return (struct xds_core_v3_Authority**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 16), len);
}
-UPB_INLINE struct udpa_core_v1_Authority** envoy_config_core_v3_ConfigSource_resize_authorities(envoy_config_core_v3_ConfigSource *msg, size_t len, upb_arena *arena) {
- return (struct udpa_core_v1_Authority**)_upb_array_resize_accessor2(msg, UPB_SIZE(12, 16), len, UPB_SIZE(2, 3), arena);
+UPB_INLINE struct xds_core_v3_Authority** envoy_config_core_v3_ConfigSource_resize_authorities(envoy_config_core_v3_ConfigSource *msg, size_t len, upb_arena *arena) {
+ return (struct xds_core_v3_Authority**)_upb_array_resize_accessor2(msg, UPB_SIZE(12, 16), len, UPB_SIZE(2, 3), arena);
}
-UPB_INLINE struct udpa_core_v1_Authority* envoy_config_core_v3_ConfigSource_add_authorities(envoy_config_core_v3_ConfigSource *msg, upb_arena *arena) {
- struct udpa_core_v1_Authority* sub = (struct udpa_core_v1_Authority*)_upb_msg_new(&udpa_core_v1_Authority_msginit, arena);
+UPB_INLINE struct xds_core_v3_Authority* envoy_config_core_v3_ConfigSource_add_authorities(envoy_config_core_v3_ConfigSource *msg, upb_arena *arena) {
+ struct xds_core_v3_Authority* sub = (struct xds_core_v3_Authority*)_upb_msg_new(&xds_core_v3_Authority_msginit, arena);
bool ok = _upb_array_append_accessor2(
msg, UPB_SIZE(12, 16), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
-#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "validate/validate.upb.h"
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_core_v3_HealthCheck__fields[22] = {
+static const upb_msglayout_field envoy_config_core_v3_HealthCheck__fields[23] = {
{1, UPB_SIZE(20, 32), 1, 7, 11, 1},
{2, UPB_SIZE(24, 40), 2, 7, 11, 1},
{3, UPB_SIZE(28, 48), 3, 7, 11, 1},
{5, UPB_SIZE(36, 64), 5, 9, 11, 1},
{6, UPB_SIZE(40, 72), 6, 9, 11, 1},
{7, UPB_SIZE(44, 80), 7, 6, 11, 1},
- {8, UPB_SIZE(80, 152), UPB_SIZE(-85, -161), 3, 11, 1},
- {9, UPB_SIZE(80, 152), UPB_SIZE(-85, -161), 4, 11, 1},
- {11, UPB_SIZE(80, 152), UPB_SIZE(-85, -161), 2, 11, 1},
+ {8, UPB_SIZE(84, 160), UPB_SIZE(-89, -169), 3, 11, 1},
+ {9, UPB_SIZE(84, 160), UPB_SIZE(-89, -169), 4, 11, 1},
+ {11, UPB_SIZE(84, 160), UPB_SIZE(-89, -169), 2, 11, 1},
{12, UPB_SIZE(48, 88), 8, 7, 11, 1},
- {13, UPB_SIZE(80, 152), UPB_SIZE(-85, -161), 1, 11, 1},
+ {13, UPB_SIZE(84, 160), UPB_SIZE(-89, -169), 1, 11, 1},
{14, UPB_SIZE(52, 96), 9, 7, 11, 1},
{15, UPB_SIZE(56, 104), 10, 7, 11, 1},
{16, UPB_SIZE(60, 112), 11, 7, 11, 1},
{21, UPB_SIZE(68, 128), 13, 5, 11, 1},
{22, UPB_SIZE(72, 136), 14, 0, 11, 1},
{23, UPB_SIZE(76, 144), 15, 8, 11, 1},
+ {24, UPB_SIZE(80, 152), 16, 7, 11, 1},
};
const upb_msglayout envoy_config_core_v3_HealthCheck_msginit = {
&envoy_config_core_v3_HealthCheck_submsgs[0],
&envoy_config_core_v3_HealthCheck__fields[0],
- UPB_SIZE(88, 176), 22, false, 255,
+ UPB_SIZE(96, 176), 23, false, 255,
};
static const upb_msglayout_field envoy_config_core_v3_HealthCheck_Payload__fields[2] = {
envoy_config_core_v3_HealthCheck_health_checker_custom_health_check = 13,
envoy_config_core_v3_HealthCheck_health_checker_NOT_SET = 0
} envoy_config_core_v3_HealthCheck_health_checker_oneofcases;
-UPB_INLINE envoy_config_core_v3_HealthCheck_health_checker_oneofcases envoy_config_core_v3_HealthCheck_health_checker_case(const envoy_config_core_v3_HealthCheck* msg) { return (envoy_config_core_v3_HealthCheck_health_checker_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(84, 160), int32_t); }
+UPB_INLINE envoy_config_core_v3_HealthCheck_health_checker_oneofcases envoy_config_core_v3_HealthCheck_health_checker_case(const envoy_config_core_v3_HealthCheck* msg) { return (envoy_config_core_v3_HealthCheck_health_checker_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(88, 168), int32_t); }
UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_timeout(const envoy_config_core_v3_HealthCheck *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct google_protobuf_Duration* envoy_config_core_v3_HealthCheck_timeout(const envoy_config_core_v3_HealthCheck *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 32), const struct google_protobuf_Duration*); }
UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_core_v3_HealthCheck_alt_port(const envoy_config_core_v3_HealthCheck *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 72), const struct google_protobuf_UInt32Value*); }
UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_reuse_connection(const envoy_config_core_v3_HealthCheck *msg) { return _upb_hasbit(msg, 7); }
UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_core_v3_HealthCheck_reuse_connection(const envoy_config_core_v3_HealthCheck *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 80), const struct google_protobuf_BoolValue*); }
-UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_http_health_check(const envoy_config_core_v3_HealthCheck *msg) { return _upb_getoneofcase(msg, UPB_SIZE(84, 160)) == 8; }
-UPB_INLINE const envoy_config_core_v3_HealthCheck_HttpHealthCheck* envoy_config_core_v3_HealthCheck_http_health_check(const envoy_config_core_v3_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_HealthCheck_HttpHealthCheck*, UPB_SIZE(80, 152), UPB_SIZE(84, 160), 8, NULL); }
-UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_tcp_health_check(const envoy_config_core_v3_HealthCheck *msg) { return _upb_getoneofcase(msg, UPB_SIZE(84, 160)) == 9; }
-UPB_INLINE const envoy_config_core_v3_HealthCheck_TcpHealthCheck* envoy_config_core_v3_HealthCheck_tcp_health_check(const envoy_config_core_v3_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_HealthCheck_TcpHealthCheck*, UPB_SIZE(80, 152), UPB_SIZE(84, 160), 9, NULL); }
-UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_grpc_health_check(const envoy_config_core_v3_HealthCheck *msg) { return _upb_getoneofcase(msg, UPB_SIZE(84, 160)) == 11; }
-UPB_INLINE const envoy_config_core_v3_HealthCheck_GrpcHealthCheck* envoy_config_core_v3_HealthCheck_grpc_health_check(const envoy_config_core_v3_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_HealthCheck_GrpcHealthCheck*, UPB_SIZE(80, 152), UPB_SIZE(84, 160), 11, NULL); }
+UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_http_health_check(const envoy_config_core_v3_HealthCheck *msg) { return _upb_getoneofcase(msg, UPB_SIZE(88, 168)) == 8; }
+UPB_INLINE const envoy_config_core_v3_HealthCheck_HttpHealthCheck* envoy_config_core_v3_HealthCheck_http_health_check(const envoy_config_core_v3_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_HealthCheck_HttpHealthCheck*, UPB_SIZE(84, 160), UPB_SIZE(88, 168), 8, NULL); }
+UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_tcp_health_check(const envoy_config_core_v3_HealthCheck *msg) { return _upb_getoneofcase(msg, UPB_SIZE(88, 168)) == 9; }
+UPB_INLINE const envoy_config_core_v3_HealthCheck_TcpHealthCheck* envoy_config_core_v3_HealthCheck_tcp_health_check(const envoy_config_core_v3_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_HealthCheck_TcpHealthCheck*, UPB_SIZE(84, 160), UPB_SIZE(88, 168), 9, NULL); }
+UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_grpc_health_check(const envoy_config_core_v3_HealthCheck *msg) { return _upb_getoneofcase(msg, UPB_SIZE(88, 168)) == 11; }
+UPB_INLINE const envoy_config_core_v3_HealthCheck_GrpcHealthCheck* envoy_config_core_v3_HealthCheck_grpc_health_check(const envoy_config_core_v3_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_HealthCheck_GrpcHealthCheck*, UPB_SIZE(84, 160), UPB_SIZE(88, 168), 11, NULL); }
UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_no_traffic_interval(const envoy_config_core_v3_HealthCheck *msg) { return _upb_hasbit(msg, 8); }
UPB_INLINE const struct google_protobuf_Duration* envoy_config_core_v3_HealthCheck_no_traffic_interval(const envoy_config_core_v3_HealthCheck *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 88), const struct google_protobuf_Duration*); }
-UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_custom_health_check(const envoy_config_core_v3_HealthCheck *msg) { return _upb_getoneofcase(msg, UPB_SIZE(84, 160)) == 13; }
-UPB_INLINE const envoy_config_core_v3_HealthCheck_CustomHealthCheck* envoy_config_core_v3_HealthCheck_custom_health_check(const envoy_config_core_v3_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_HealthCheck_CustomHealthCheck*, UPB_SIZE(80, 152), UPB_SIZE(84, 160), 13, NULL); }
+UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_custom_health_check(const envoy_config_core_v3_HealthCheck *msg) { return _upb_getoneofcase(msg, UPB_SIZE(88, 168)) == 13; }
+UPB_INLINE const envoy_config_core_v3_HealthCheck_CustomHealthCheck* envoy_config_core_v3_HealthCheck_custom_health_check(const envoy_config_core_v3_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_config_core_v3_HealthCheck_CustomHealthCheck*, UPB_SIZE(84, 160), UPB_SIZE(88, 168), 13, NULL); }
UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_unhealthy_interval(const envoy_config_core_v3_HealthCheck *msg) { return _upb_hasbit(msg, 9); }
UPB_INLINE const struct google_protobuf_Duration* envoy_config_core_v3_HealthCheck_unhealthy_interval(const envoy_config_core_v3_HealthCheck *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 96), const struct google_protobuf_Duration*); }
UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_unhealthy_edge_interval(const envoy_config_core_v3_HealthCheck *msg) { return _upb_hasbit(msg, 10); }
UPB_INLINE const struct envoy_config_core_v3_EventServiceConfig* envoy_config_core_v3_HealthCheck_event_service(const envoy_config_core_v3_HealthCheck *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 136), const struct envoy_config_core_v3_EventServiceConfig*); }
UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_transport_socket_match_criteria(const envoy_config_core_v3_HealthCheck *msg) { return _upb_hasbit(msg, 15); }
UPB_INLINE const struct google_protobuf_Struct* envoy_config_core_v3_HealthCheck_transport_socket_match_criteria(const envoy_config_core_v3_HealthCheck *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 144), const struct google_protobuf_Struct*); }
+UPB_INLINE bool envoy_config_core_v3_HealthCheck_has_no_traffic_healthy_interval(const envoy_config_core_v3_HealthCheck *msg) { return _upb_hasbit(msg, 16); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_config_core_v3_HealthCheck_no_traffic_healthy_interval(const envoy_config_core_v3_HealthCheck *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 152), const struct google_protobuf_Duration*); }
UPB_INLINE void envoy_config_core_v3_HealthCheck_set_timeout(envoy_config_core_v3_HealthCheck *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 1);
return sub;
}
UPB_INLINE void envoy_config_core_v3_HealthCheck_set_http_health_check(envoy_config_core_v3_HealthCheck *msg, envoy_config_core_v3_HealthCheck_HttpHealthCheck* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_core_v3_HealthCheck_HttpHealthCheck*, UPB_SIZE(80, 152), value, UPB_SIZE(84, 160), 8);
+ UPB_WRITE_ONEOF(msg, envoy_config_core_v3_HealthCheck_HttpHealthCheck*, UPB_SIZE(84, 160), value, UPB_SIZE(88, 168), 8);
}
UPB_INLINE struct envoy_config_core_v3_HealthCheck_HttpHealthCheck* envoy_config_core_v3_HealthCheck_mutable_http_health_check(envoy_config_core_v3_HealthCheck *msg, upb_arena *arena) {
struct envoy_config_core_v3_HealthCheck_HttpHealthCheck* sub = (struct envoy_config_core_v3_HealthCheck_HttpHealthCheck*)envoy_config_core_v3_HealthCheck_http_health_check(msg);
return sub;
}
UPB_INLINE void envoy_config_core_v3_HealthCheck_set_tcp_health_check(envoy_config_core_v3_HealthCheck *msg, envoy_config_core_v3_HealthCheck_TcpHealthCheck* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_core_v3_HealthCheck_TcpHealthCheck*, UPB_SIZE(80, 152), value, UPB_SIZE(84, 160), 9);
+ UPB_WRITE_ONEOF(msg, envoy_config_core_v3_HealthCheck_TcpHealthCheck*, UPB_SIZE(84, 160), value, UPB_SIZE(88, 168), 9);
}
UPB_INLINE struct envoy_config_core_v3_HealthCheck_TcpHealthCheck* envoy_config_core_v3_HealthCheck_mutable_tcp_health_check(envoy_config_core_v3_HealthCheck *msg, upb_arena *arena) {
struct envoy_config_core_v3_HealthCheck_TcpHealthCheck* sub = (struct envoy_config_core_v3_HealthCheck_TcpHealthCheck*)envoy_config_core_v3_HealthCheck_tcp_health_check(msg);
return sub;
}
UPB_INLINE void envoy_config_core_v3_HealthCheck_set_grpc_health_check(envoy_config_core_v3_HealthCheck *msg, envoy_config_core_v3_HealthCheck_GrpcHealthCheck* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_core_v3_HealthCheck_GrpcHealthCheck*, UPB_SIZE(80, 152), value, UPB_SIZE(84, 160), 11);
+ UPB_WRITE_ONEOF(msg, envoy_config_core_v3_HealthCheck_GrpcHealthCheck*, UPB_SIZE(84, 160), value, UPB_SIZE(88, 168), 11);
}
UPB_INLINE struct envoy_config_core_v3_HealthCheck_GrpcHealthCheck* envoy_config_core_v3_HealthCheck_mutable_grpc_health_check(envoy_config_core_v3_HealthCheck *msg, upb_arena *arena) {
struct envoy_config_core_v3_HealthCheck_GrpcHealthCheck* sub = (struct envoy_config_core_v3_HealthCheck_GrpcHealthCheck*)envoy_config_core_v3_HealthCheck_grpc_health_check(msg);
return sub;
}
UPB_INLINE void envoy_config_core_v3_HealthCheck_set_custom_health_check(envoy_config_core_v3_HealthCheck *msg, envoy_config_core_v3_HealthCheck_CustomHealthCheck* value) {
- UPB_WRITE_ONEOF(msg, envoy_config_core_v3_HealthCheck_CustomHealthCheck*, UPB_SIZE(80, 152), value, UPB_SIZE(84, 160), 13);
+ UPB_WRITE_ONEOF(msg, envoy_config_core_v3_HealthCheck_CustomHealthCheck*, UPB_SIZE(84, 160), value, UPB_SIZE(88, 168), 13);
}
UPB_INLINE struct envoy_config_core_v3_HealthCheck_CustomHealthCheck* envoy_config_core_v3_HealthCheck_mutable_custom_health_check(envoy_config_core_v3_HealthCheck *msg, upb_arena *arena) {
struct envoy_config_core_v3_HealthCheck_CustomHealthCheck* sub = (struct envoy_config_core_v3_HealthCheck_CustomHealthCheck*)envoy_config_core_v3_HealthCheck_custom_health_check(msg);
}
return sub;
}
+UPB_INLINE void envoy_config_core_v3_HealthCheck_set_no_traffic_healthy_interval(envoy_config_core_v3_HealthCheck *msg, struct google_protobuf_Duration* value) {
+ _upb_sethas(msg, 16);
+ *UPB_PTR_AT(msg, UPB_SIZE(80, 152), struct google_protobuf_Duration*) = value;
+}
+UPB_INLINE struct google_protobuf_Duration* envoy_config_core_v3_HealthCheck_mutable_no_traffic_healthy_interval(envoy_config_core_v3_HealthCheck *msg, upb_arena *arena) {
+ struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_core_v3_HealthCheck_no_traffic_healthy_interval(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Duration*)_upb_msg_new(&google_protobuf_Duration_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_HealthCheck_set_no_traffic_healthy_interval(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.core.v3.HealthCheck.Payload */
#include "upb/msg.h"
#include "envoy/config/core/v3/proxy_protocol.upb.h"
#include "udpa/annotations/status.upb.h"
-#include "validate/validate.upb.h"
#include "upb/port_def.inc"
#include <stddef.h>
#include "upb/msg.h"
#include "envoy/config/core/v3/substitution_format_string.upb.h"
+#include "envoy/config/core/v3/base.upb.h"
+#include "envoy/config/core/v3/extension.upb.h"
#include "google/protobuf/struct.upb.h"
#include "udpa/annotations/status.upb.h"
#include "validate/validate.upb.h"
#include "upb/port_def.inc"
-static const upb_msglayout *const envoy_config_core_v3_SubstitutionFormatString_submsgs[1] = {
+static const upb_msglayout *const envoy_config_core_v3_SubstitutionFormatString_submsgs[3] = {
+ &envoy_config_core_v3_DataSource_msginit,
+ &envoy_config_core_v3_TypedExtensionConfig_msginit,
&google_protobuf_Struct_msginit,
};
-static const upb_msglayout_field envoy_config_core_v3_SubstitutionFormatString__fields[4] = {
- {1, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 0, 9, 1},
- {2, UPB_SIZE(12, 24), UPB_SIZE(-21, -41), 0, 11, 1},
+static const upb_msglayout_field envoy_config_core_v3_SubstitutionFormatString__fields[6] = {
+ {1, UPB_SIZE(16, 32), UPB_SIZE(-25, -49), 0, 9, 1},
+ {2, UPB_SIZE(16, 32), UPB_SIZE(-25, -49), 2, 11, 1},
{3, UPB_SIZE(0, 0), 0, 0, 8, 1},
{4, UPB_SIZE(4, 8), 0, 0, 9, 1},
+ {5, UPB_SIZE(16, 32), UPB_SIZE(-25, -49), 0, 11, 1},
+ {6, UPB_SIZE(12, 24), 0, 1, 11, 3},
};
const upb_msglayout envoy_config_core_v3_SubstitutionFormatString_msginit = {
&envoy_config_core_v3_SubstitutionFormatString_submsgs[0],
&envoy_config_core_v3_SubstitutionFormatString__fields[0],
- UPB_SIZE(24, 48), 4, false, 255,
+ UPB_SIZE(32, 64), 6, false, 255,
};
#include "upb/port_undef.inc"
struct envoy_config_core_v3_SubstitutionFormatString;
typedef struct envoy_config_core_v3_SubstitutionFormatString envoy_config_core_v3_SubstitutionFormatString;
extern const upb_msglayout envoy_config_core_v3_SubstitutionFormatString_msginit;
+struct envoy_config_core_v3_DataSource;
+struct envoy_config_core_v3_TypedExtensionConfig;
struct google_protobuf_Struct;
+extern const upb_msglayout envoy_config_core_v3_DataSource_msginit;
+extern const upb_msglayout envoy_config_core_v3_TypedExtensionConfig_msginit;
extern const upb_msglayout google_protobuf_Struct_msginit;
typedef enum {
envoy_config_core_v3_SubstitutionFormatString_format_text_format = 1,
envoy_config_core_v3_SubstitutionFormatString_format_json_format = 2,
+ envoy_config_core_v3_SubstitutionFormatString_format_text_format_source = 5,
envoy_config_core_v3_SubstitutionFormatString_format_NOT_SET = 0
} envoy_config_core_v3_SubstitutionFormatString_format_oneofcases;
-UPB_INLINE envoy_config_core_v3_SubstitutionFormatString_format_oneofcases envoy_config_core_v3_SubstitutionFormatString_format_case(const envoy_config_core_v3_SubstitutionFormatString* msg) { return (envoy_config_core_v3_SubstitutionFormatString_format_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(20, 40), int32_t); }
+UPB_INLINE envoy_config_core_v3_SubstitutionFormatString_format_oneofcases envoy_config_core_v3_SubstitutionFormatString_format_case(const envoy_config_core_v3_SubstitutionFormatString* msg) { return (envoy_config_core_v3_SubstitutionFormatString_format_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(24, 48), int32_t); }
-UPB_INLINE bool envoy_config_core_v3_SubstitutionFormatString_has_text_format(const envoy_config_core_v3_SubstitutionFormatString *msg) { return _upb_getoneofcase(msg, UPB_SIZE(20, 40)) == 1; }
-UPB_INLINE upb_strview envoy_config_core_v3_SubstitutionFormatString_text_format(const envoy_config_core_v3_SubstitutionFormatString *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(12, 24), UPB_SIZE(20, 40), 1, upb_strview_make("", strlen(""))); }
-UPB_INLINE bool envoy_config_core_v3_SubstitutionFormatString_has_json_format(const envoy_config_core_v3_SubstitutionFormatString *msg) { return _upb_getoneofcase(msg, UPB_SIZE(20, 40)) == 2; }
-UPB_INLINE const struct google_protobuf_Struct* envoy_config_core_v3_SubstitutionFormatString_json_format(const envoy_config_core_v3_SubstitutionFormatString *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Struct*, UPB_SIZE(12, 24), UPB_SIZE(20, 40), 2, NULL); }
+UPB_INLINE bool envoy_config_core_v3_SubstitutionFormatString_has_text_format(const envoy_config_core_v3_SubstitutionFormatString *msg) { return _upb_getoneofcase(msg, UPB_SIZE(24, 48)) == 1; }
+UPB_INLINE upb_strview envoy_config_core_v3_SubstitutionFormatString_text_format(const envoy_config_core_v3_SubstitutionFormatString *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(16, 32), UPB_SIZE(24, 48), 1, upb_strview_make("", strlen(""))); }
+UPB_INLINE bool envoy_config_core_v3_SubstitutionFormatString_has_json_format(const envoy_config_core_v3_SubstitutionFormatString *msg) { return _upb_getoneofcase(msg, UPB_SIZE(24, 48)) == 2; }
+UPB_INLINE const struct google_protobuf_Struct* envoy_config_core_v3_SubstitutionFormatString_json_format(const envoy_config_core_v3_SubstitutionFormatString *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Struct*, UPB_SIZE(16, 32), UPB_SIZE(24, 48), 2, NULL); }
UPB_INLINE bool envoy_config_core_v3_SubstitutionFormatString_omit_empty_values(const envoy_config_core_v3_SubstitutionFormatString *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), bool); }
UPB_INLINE upb_strview envoy_config_core_v3_SubstitutionFormatString_content_type(const envoy_config_core_v3_SubstitutionFormatString *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+UPB_INLINE bool envoy_config_core_v3_SubstitutionFormatString_has_text_format_source(const envoy_config_core_v3_SubstitutionFormatString *msg) { return _upb_getoneofcase(msg, UPB_SIZE(24, 48)) == 5; }
+UPB_INLINE const struct envoy_config_core_v3_DataSource* envoy_config_core_v3_SubstitutionFormatString_text_format_source(const envoy_config_core_v3_SubstitutionFormatString *msg) { return UPB_READ_ONEOF(msg, const struct envoy_config_core_v3_DataSource*, UPB_SIZE(16, 32), UPB_SIZE(24, 48), 5, NULL); }
+UPB_INLINE bool envoy_config_core_v3_SubstitutionFormatString_has_formatters(const envoy_config_core_v3_SubstitutionFormatString *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(12, 24)); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* const* envoy_config_core_v3_SubstitutionFormatString_formatters(const envoy_config_core_v3_SubstitutionFormatString *msg, size_t *len) { return (const struct envoy_config_core_v3_TypedExtensionConfig* const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); }
UPB_INLINE void envoy_config_core_v3_SubstitutionFormatString_set_text_format(envoy_config_core_v3_SubstitutionFormatString *msg, upb_strview value) {
- UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(12, 24), value, UPB_SIZE(20, 40), 1);
+ UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(16, 32), value, UPB_SIZE(24, 48), 1);
}
UPB_INLINE void envoy_config_core_v3_SubstitutionFormatString_set_json_format(envoy_config_core_v3_SubstitutionFormatString *msg, struct google_protobuf_Struct* value) {
- UPB_WRITE_ONEOF(msg, struct google_protobuf_Struct*, UPB_SIZE(12, 24), value, UPB_SIZE(20, 40), 2);
+ UPB_WRITE_ONEOF(msg, struct google_protobuf_Struct*, UPB_SIZE(16, 32), value, UPB_SIZE(24, 48), 2);
}
UPB_INLINE struct google_protobuf_Struct* envoy_config_core_v3_SubstitutionFormatString_mutable_json_format(envoy_config_core_v3_SubstitutionFormatString *msg, upb_arena *arena) {
struct google_protobuf_Struct* sub = (struct google_protobuf_Struct*)envoy_config_core_v3_SubstitutionFormatString_json_format(msg);
UPB_INLINE void envoy_config_core_v3_SubstitutionFormatString_set_content_type(envoy_config_core_v3_SubstitutionFormatString *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
}
+UPB_INLINE void envoy_config_core_v3_SubstitutionFormatString_set_text_format_source(envoy_config_core_v3_SubstitutionFormatString *msg, struct envoy_config_core_v3_DataSource* value) {
+ UPB_WRITE_ONEOF(msg, struct envoy_config_core_v3_DataSource*, UPB_SIZE(16, 32), value, UPB_SIZE(24, 48), 5);
+}
+UPB_INLINE struct envoy_config_core_v3_DataSource* envoy_config_core_v3_SubstitutionFormatString_mutable_text_format_source(envoy_config_core_v3_SubstitutionFormatString *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_DataSource* sub = (struct envoy_config_core_v3_DataSource*)envoy_config_core_v3_SubstitutionFormatString_text_format_source(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_DataSource*)_upb_msg_new(&envoy_config_core_v3_DataSource_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_core_v3_SubstitutionFormatString_set_text_format_source(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig** envoy_config_core_v3_SubstitutionFormatString_mutable_formatters(envoy_config_core_v3_SubstitutionFormatString *msg, size_t *len) {
+ return (struct envoy_config_core_v3_TypedExtensionConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len);
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig** envoy_config_core_v3_SubstitutionFormatString_resize_formatters(envoy_config_core_v3_SubstitutionFormatString *msg, size_t len, upb_arena *arena) {
+ return (struct envoy_config_core_v3_TypedExtensionConfig**)_upb_array_resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_core_v3_SubstitutionFormatString_add_formatters(envoy_config_core_v3_SubstitutionFormatString *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(12, 24), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
#ifdef __cplusplus
} /* extern "C" */
#include "envoy/config/endpoint/v3/endpoint.upb.h"
#include "envoy/config/endpoint/v3/endpoint_components.upb.h"
#include "envoy/type/v3/percent.upb.h"
-#include "google/api/annotations.upb.h"
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "udpa/annotations/status.upb.h"
#include "envoy/config/listener/v3/api_listener.upb.h"
#include "envoy/config/listener/v3/listener_components.upb.h"
#include "envoy/config/listener/v3/udp_listener_config.upb.h"
-#include "google/api/annotations.upb.h"
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/wrappers.upb.h"
-#include "udpa/core/v1/collection_entry.upb.h"
+#include "xds/core/v3/collection_entry.upb.h"
#include "udpa/annotations/security.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "upb/port_def.inc"
static const upb_msglayout *const envoy_config_listener_v3_ListenerCollection_submsgs[1] = {
- &udpa_core_v1_CollectionEntry_msginit,
+ &xds_core_v3_CollectionEntry_msginit,
};
static const upb_msglayout_field envoy_config_listener_v3_ListenerCollection__fields[1] = {
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_listener_v3_Listener__fields[22] = {
+static const upb_msglayout_field envoy_config_listener_v3_Listener__fields[25] = {
{1, UPB_SIZE(16, 16), 0, 0, 9, 1},
{2, UPB_SIZE(24, 32), 1, 1, 11, 1},
- {3, UPB_SIZE(76, 136), 0, 6, 11, 3},
- {5, UPB_SIZE(28, 40), 2, 13, 11, 1},
- {6, UPB_SIZE(32, 48), 3, 2, 11, 1},
- {7, UPB_SIZE(36, 56), 4, 8, 11, 1},
+ {3, UPB_SIZE(88, 160), 0, 6, 11, 3},
+ {4, UPB_SIZE(28, 40), 2, 11, 11, 1},
+ {5, UPB_SIZE(32, 48), 3, 13, 11, 1},
+ {6, UPB_SIZE(36, 56), 4, 2, 11, 1},
+ {7, UPB_SIZE(40, 64), 5, 8, 11, 1},
{8, UPB_SIZE(4, 4), 0, 0, 14, 1},
- {9, UPB_SIZE(80, 144), 0, 9, 11, 3},
- {10, UPB_SIZE(40, 64), 5, 11, 11, 1},
- {11, UPB_SIZE(44, 72), 6, 11, 11, 1},
- {12, UPB_SIZE(48, 80), 7, 13, 11, 1},
- {13, UPB_SIZE(84, 152), 0, 3, 11, 3},
- {15, UPB_SIZE(52, 88), 8, 12, 11, 1},
+ {9, UPB_SIZE(92, 168), 0, 9, 11, 3},
+ {10, UPB_SIZE(44, 72), 6, 11, 11, 1},
+ {11, UPB_SIZE(48, 80), 7, 11, 11, 1},
+ {12, UPB_SIZE(52, 88), 8, 13, 11, 1},
+ {13, UPB_SIZE(96, 176), 0, 3, 11, 3},
+ {15, UPB_SIZE(56, 96), 9, 12, 11, 1},
{16, UPB_SIZE(8, 8), 0, 0, 14, 1},
{17, UPB_SIZE(12, 12), 0, 0, 8, 1},
- {18, UPB_SIZE(56, 96), 9, 10, 11, 1},
- {19, UPB_SIZE(60, 104), 10, 5, 11, 1},
- {20, UPB_SIZE(64, 112), 11, 7, 11, 1},
+ {18, UPB_SIZE(60, 104), 10, 10, 11, 1},
+ {19, UPB_SIZE(64, 112), 11, 5, 11, 1},
+ {20, UPB_SIZE(68, 120), 12, 7, 11, 1},
{21, UPB_SIZE(13, 13), 0, 0, 8, 1},
- {22, UPB_SIZE(88, 160), 0, 0, 11, 3},
- {23, UPB_SIZE(68, 120), 12, 4, 11, 1},
- {24, UPB_SIZE(72, 128), 13, 13, 11, 1},
+ {22, UPB_SIZE(100, 184), 0, 0, 11, 3},
+ {23, UPB_SIZE(72, 128), 13, 4, 11, 1},
+ {24, UPB_SIZE(76, 136), 14, 13, 11, 1},
+ {25, UPB_SIZE(80, 144), 15, 6, 11, 1},
+ {26, UPB_SIZE(84, 152), 16, 11, 11, 1},
};
const upb_msglayout envoy_config_listener_v3_Listener_msginit = {
&envoy_config_listener_v3_Listener_submsgs[0],
&envoy_config_listener_v3_Listener__fields[0],
- UPB_SIZE(96, 176), 22, false, 255,
+ UPB_SIZE(104, 192), 25, false, 255,
};
static const upb_msglayout *const envoy_config_listener_v3_Listener_DeprecatedV1_submsgs[1] = {
struct google_protobuf_BoolValue;
struct google_protobuf_Duration;
struct google_protobuf_UInt32Value;
-struct udpa_core_v1_CollectionEntry;
+struct xds_core_v3_CollectionEntry;
extern const upb_msglayout envoy_config_accesslog_v3_AccessLog_msginit;
extern const upb_msglayout envoy_config_core_v3_Address_msginit;
extern const upb_msglayout envoy_config_core_v3_Metadata_msginit;
extern const upb_msglayout google_protobuf_BoolValue_msginit;
extern const upb_msglayout google_protobuf_Duration_msginit;
extern const upb_msglayout google_protobuf_UInt32Value_msginit;
-extern const upb_msglayout udpa_core_v1_CollectionEntry_msginit;
+extern const upb_msglayout xds_core_v3_CollectionEntry_msginit;
typedef enum {
envoy_config_listener_v3_Listener_DEFAULT = 0,
}
UPB_INLINE bool envoy_config_listener_v3_ListenerCollection_has_entries(const envoy_config_listener_v3_ListenerCollection *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(0, 0)); }
-UPB_INLINE const struct udpa_core_v1_CollectionEntry* const* envoy_config_listener_v3_ListenerCollection_entries(const envoy_config_listener_v3_ListenerCollection *msg, size_t *len) { return (const struct udpa_core_v1_CollectionEntry* const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); }
+UPB_INLINE const struct xds_core_v3_CollectionEntry* const* envoy_config_listener_v3_ListenerCollection_entries(const envoy_config_listener_v3_ListenerCollection *msg, size_t *len) { return (const struct xds_core_v3_CollectionEntry* const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); }
-UPB_INLINE struct udpa_core_v1_CollectionEntry** envoy_config_listener_v3_ListenerCollection_mutable_entries(envoy_config_listener_v3_ListenerCollection *msg, size_t *len) {
- return (struct udpa_core_v1_CollectionEntry**)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len);
+UPB_INLINE struct xds_core_v3_CollectionEntry** envoy_config_listener_v3_ListenerCollection_mutable_entries(envoy_config_listener_v3_ListenerCollection *msg, size_t *len) {
+ return (struct xds_core_v3_CollectionEntry**)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len);
}
-UPB_INLINE struct udpa_core_v1_CollectionEntry** envoy_config_listener_v3_ListenerCollection_resize_entries(envoy_config_listener_v3_ListenerCollection *msg, size_t len, upb_arena *arena) {
- return (struct udpa_core_v1_CollectionEntry**)_upb_array_resize_accessor2(msg, UPB_SIZE(0, 0), len, UPB_SIZE(2, 3), arena);
+UPB_INLINE struct xds_core_v3_CollectionEntry** envoy_config_listener_v3_ListenerCollection_resize_entries(envoy_config_listener_v3_ListenerCollection *msg, size_t len, upb_arena *arena) {
+ return (struct xds_core_v3_CollectionEntry**)_upb_array_resize_accessor2(msg, UPB_SIZE(0, 0), len, UPB_SIZE(2, 3), arena);
}
-UPB_INLINE struct udpa_core_v1_CollectionEntry* envoy_config_listener_v3_ListenerCollection_add_entries(envoy_config_listener_v3_ListenerCollection *msg, upb_arena *arena) {
- struct udpa_core_v1_CollectionEntry* sub = (struct udpa_core_v1_CollectionEntry*)_upb_msg_new(&udpa_core_v1_CollectionEntry_msginit, arena);
+UPB_INLINE struct xds_core_v3_CollectionEntry* envoy_config_listener_v3_ListenerCollection_add_entries(envoy_config_listener_v3_ListenerCollection *msg, upb_arena *arena) {
+ struct xds_core_v3_CollectionEntry* sub = (struct xds_core_v3_CollectionEntry*)_upb_msg_new(&xds_core_v3_CollectionEntry_msginit, arena);
bool ok = _upb_array_append_accessor2(
msg, UPB_SIZE(0, 0), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
UPB_INLINE upb_strview envoy_config_listener_v3_Listener_name(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_strview); }
UPB_INLINE bool envoy_config_listener_v3_Listener_has_address(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct envoy_config_core_v3_Address* envoy_config_listener_v3_Listener_address(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 32), const struct envoy_config_core_v3_Address*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_filter_chains(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(76, 136)); }
-UPB_INLINE const struct envoy_config_listener_v3_FilterChain* const* envoy_config_listener_v3_Listener_filter_chains(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_listener_v3_FilterChain* const*)_upb_array_accessor(msg, UPB_SIZE(76, 136), len); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_per_connection_buffer_limit_bytes(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_per_connection_buffer_limit_bytes(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 40), const struct google_protobuf_UInt32Value*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_metadata(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 3); }
-UPB_INLINE const struct envoy_config_core_v3_Metadata* envoy_config_listener_v3_Listener_metadata(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 48), const struct envoy_config_core_v3_Metadata*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_deprecated_v1(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 4); }
-UPB_INLINE const envoy_config_listener_v3_Listener_DeprecatedV1* envoy_config_listener_v3_Listener_deprecated_v1(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(36, 56), const envoy_config_listener_v3_Listener_DeprecatedV1*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_filter_chains(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(88, 160)); }
+UPB_INLINE const struct envoy_config_listener_v3_FilterChain* const* envoy_config_listener_v3_Listener_filter_chains(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_listener_v3_FilterChain* const*)_upb_array_accessor(msg, UPB_SIZE(88, 160), len); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_use_original_dst(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_use_original_dst(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 40), const struct google_protobuf_BoolValue*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_per_connection_buffer_limit_bytes(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 3); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_per_connection_buffer_limit_bytes(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 48), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_metadata(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 4); }
+UPB_INLINE const struct envoy_config_core_v3_Metadata* envoy_config_listener_v3_Listener_metadata(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(36, 56), const struct envoy_config_core_v3_Metadata*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_deprecated_v1(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 5); }
+UPB_INLINE const envoy_config_listener_v3_Listener_DeprecatedV1* envoy_config_listener_v3_Listener_deprecated_v1(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 64), const envoy_config_listener_v3_Listener_DeprecatedV1*); }
UPB_INLINE int32_t envoy_config_listener_v3_Listener_drain_type(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_listener_filters(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(80, 144)); }
-UPB_INLINE const struct envoy_config_listener_v3_ListenerFilter* const* envoy_config_listener_v3_Listener_listener_filters(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_listener_v3_ListenerFilter* const*)_upb_array_accessor(msg, UPB_SIZE(80, 144), len); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_transparent(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 5); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_transparent(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(40, 64), const struct google_protobuf_BoolValue*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_freebind(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 6); }
-UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_freebind(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 72), const struct google_protobuf_BoolValue*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_tcp_fast_open_queue_length(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 7); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_tcp_fast_open_queue_length(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 80), const struct google_protobuf_UInt32Value*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_socket_options(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(84, 152)); }
-UPB_INLINE const struct envoy_config_core_v3_SocketOption* const* envoy_config_listener_v3_Listener_socket_options(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_core_v3_SocketOption* const*)_upb_array_accessor(msg, UPB_SIZE(84, 152), len); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_listener_filters_timeout(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 8); }
-UPB_INLINE const struct google_protobuf_Duration* envoy_config_listener_v3_Listener_listener_filters_timeout(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 88), const struct google_protobuf_Duration*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_listener_filters(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(92, 168)); }
+UPB_INLINE const struct envoy_config_listener_v3_ListenerFilter* const* envoy_config_listener_v3_Listener_listener_filters(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_listener_v3_ListenerFilter* const*)_upb_array_accessor(msg, UPB_SIZE(92, 168), len); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_transparent(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_transparent(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 72), const struct google_protobuf_BoolValue*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_freebind(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 7); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_freebind(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(48, 80), const struct google_protobuf_BoolValue*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_tcp_fast_open_queue_length(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 8); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_tcp_fast_open_queue_length(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 88), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_socket_options(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(96, 176)); }
+UPB_INLINE const struct envoy_config_core_v3_SocketOption* const* envoy_config_listener_v3_Listener_socket_options(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_core_v3_SocketOption* const*)_upb_array_accessor(msg, UPB_SIZE(96, 176), len); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_listener_filters_timeout(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 9); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_config_listener_v3_Listener_listener_filters_timeout(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 96), const struct google_protobuf_Duration*); }
UPB_INLINE int32_t envoy_config_listener_v3_Listener_traffic_direction(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), int32_t); }
UPB_INLINE bool envoy_config_listener_v3_Listener_continue_on_listener_filters_timeout(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 12), bool); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_udp_listener_config(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 9); }
-UPB_INLINE const struct envoy_config_listener_v3_UdpListenerConfig* envoy_config_listener_v3_Listener_udp_listener_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(56, 96), const struct envoy_config_listener_v3_UdpListenerConfig*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_api_listener(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 10); }
-UPB_INLINE const struct envoy_config_listener_v3_ApiListener* envoy_config_listener_v3_Listener_api_listener(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 104), const struct envoy_config_listener_v3_ApiListener*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_connection_balance_config(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 11); }
-UPB_INLINE const envoy_config_listener_v3_Listener_ConnectionBalanceConfig* envoy_config_listener_v3_Listener_connection_balance_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(64, 112), const envoy_config_listener_v3_Listener_ConnectionBalanceConfig*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_udp_listener_config(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 10); }
+UPB_INLINE const struct envoy_config_listener_v3_UdpListenerConfig* envoy_config_listener_v3_Listener_udp_listener_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(60, 104), const struct envoy_config_listener_v3_UdpListenerConfig*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_api_listener(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 11); }
+UPB_INLINE const struct envoy_config_listener_v3_ApiListener* envoy_config_listener_v3_Listener_api_listener(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(64, 112), const struct envoy_config_listener_v3_ApiListener*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_connection_balance_config(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 12); }
+UPB_INLINE const envoy_config_listener_v3_Listener_ConnectionBalanceConfig* envoy_config_listener_v3_Listener_connection_balance_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 120), const envoy_config_listener_v3_Listener_ConnectionBalanceConfig*); }
UPB_INLINE bool envoy_config_listener_v3_Listener_reuse_port(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(13, 13), bool); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_access_log(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(88, 160)); }
-UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_config_listener_v3_Listener_access_log(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(88, 160), len); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_udp_writer_config(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 12); }
-UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_listener_v3_Listener_udp_writer_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 120), const struct envoy_config_core_v3_TypedExtensionConfig*); }
-UPB_INLINE bool envoy_config_listener_v3_Listener_has_tcp_backlog_size(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 13); }
-UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_tcp_backlog_size(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 128), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_access_log(const envoy_config_listener_v3_Listener *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(100, 184)); }
+UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_config_listener_v3_Listener_access_log(const envoy_config_listener_v3_Listener *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(100, 184), len); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_udp_writer_config(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 13); }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_listener_v3_Listener_udp_writer_config(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 128), const struct envoy_config_core_v3_TypedExtensionConfig*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_tcp_backlog_size(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 14); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_tcp_backlog_size(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(76, 136), const struct google_protobuf_UInt32Value*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_default_filter_chain(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 15); }
+UPB_INLINE const struct envoy_config_listener_v3_FilterChain* envoy_config_listener_v3_Listener_default_filter_chain(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(80, 144), const struct envoy_config_listener_v3_FilterChain*); }
+UPB_INLINE bool envoy_config_listener_v3_Listener_has_bind_to_port(const envoy_config_listener_v3_Listener *msg) { return _upb_hasbit(msg, 16); }
+UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_bind_to_port(const envoy_config_listener_v3_Listener *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(84, 152), const struct google_protobuf_BoolValue*); }
UPB_INLINE void envoy_config_listener_v3_Listener_set_name(envoy_config_listener_v3_Listener *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(16, 16), upb_strview) = value;
return sub;
}
UPB_INLINE struct envoy_config_listener_v3_FilterChain** envoy_config_listener_v3_Listener_mutable_filter_chains(envoy_config_listener_v3_Listener *msg, size_t *len) {
- return (struct envoy_config_listener_v3_FilterChain**)_upb_array_mutable_accessor(msg, UPB_SIZE(76, 136), len);
+ return (struct envoy_config_listener_v3_FilterChain**)_upb_array_mutable_accessor(msg, UPB_SIZE(88, 160), len);
}
UPB_INLINE struct envoy_config_listener_v3_FilterChain** envoy_config_listener_v3_Listener_resize_filter_chains(envoy_config_listener_v3_Listener *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_listener_v3_FilterChain**)_upb_array_resize_accessor2(msg, UPB_SIZE(76, 136), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_listener_v3_FilterChain**)_upb_array_resize_accessor2(msg, UPB_SIZE(88, 160), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_listener_v3_FilterChain* envoy_config_listener_v3_Listener_add_filter_chains(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_FilterChain* sub = (struct envoy_config_listener_v3_FilterChain*)_upb_msg_new(&envoy_config_listener_v3_FilterChain_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(76, 136), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(88, 160), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
-UPB_INLINE void envoy_config_listener_v3_Listener_set_per_connection_buffer_limit_bytes(envoy_config_listener_v3_Listener *msg, struct google_protobuf_UInt32Value* value) {
+UPB_INLINE void envoy_config_listener_v3_Listener_set_use_original_dst(envoy_config_listener_v3_Listener *msg, struct google_protobuf_BoolValue* value) {
_upb_sethas(msg, 2);
- *UPB_PTR_AT(msg, UPB_SIZE(28, 40), struct google_protobuf_UInt32Value*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(28, 40), struct google_protobuf_BoolValue*) = value;
+}
+UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_mutable_use_original_dst(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
+ struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_listener_v3_Listener_use_original_dst(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_BoolValue*)_upb_msg_new(&google_protobuf_BoolValue_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_Listener_set_use_original_dst(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_listener_v3_Listener_set_per_connection_buffer_limit_bytes(envoy_config_listener_v3_Listener *msg, struct google_protobuf_UInt32Value* value) {
+ _upb_sethas(msg, 3);
+ *UPB_PTR_AT(msg, UPB_SIZE(32, 48), struct google_protobuf_UInt32Value*) = value;
}
UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_mutable_per_connection_buffer_limit_bytes(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_listener_v3_Listener_per_connection_buffer_limit_bytes(msg);
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_metadata(envoy_config_listener_v3_Listener *msg, struct envoy_config_core_v3_Metadata* value) {
- _upb_sethas(msg, 3);
- *UPB_PTR_AT(msg, UPB_SIZE(32, 48), struct envoy_config_core_v3_Metadata*) = value;
+ _upb_sethas(msg, 4);
+ *UPB_PTR_AT(msg, UPB_SIZE(36, 56), struct envoy_config_core_v3_Metadata*) = value;
}
UPB_INLINE struct envoy_config_core_v3_Metadata* envoy_config_listener_v3_Listener_mutable_metadata(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_core_v3_Metadata* sub = (struct envoy_config_core_v3_Metadata*)envoy_config_listener_v3_Listener_metadata(msg);
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_deprecated_v1(envoy_config_listener_v3_Listener *msg, envoy_config_listener_v3_Listener_DeprecatedV1* value) {
- _upb_sethas(msg, 4);
- *UPB_PTR_AT(msg, UPB_SIZE(36, 56), envoy_config_listener_v3_Listener_DeprecatedV1*) = value;
+ _upb_sethas(msg, 5);
+ *UPB_PTR_AT(msg, UPB_SIZE(40, 64), envoy_config_listener_v3_Listener_DeprecatedV1*) = value;
}
UPB_INLINE struct envoy_config_listener_v3_Listener_DeprecatedV1* envoy_config_listener_v3_Listener_mutable_deprecated_v1(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_Listener_DeprecatedV1* sub = (struct envoy_config_listener_v3_Listener_DeprecatedV1*)envoy_config_listener_v3_Listener_deprecated_v1(msg);
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
}
UPB_INLINE struct envoy_config_listener_v3_ListenerFilter** envoy_config_listener_v3_Listener_mutable_listener_filters(envoy_config_listener_v3_Listener *msg, size_t *len) {
- return (struct envoy_config_listener_v3_ListenerFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(80, 144), len);
+ return (struct envoy_config_listener_v3_ListenerFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(92, 168), len);
}
UPB_INLINE struct envoy_config_listener_v3_ListenerFilter** envoy_config_listener_v3_Listener_resize_listener_filters(envoy_config_listener_v3_Listener *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_listener_v3_ListenerFilter**)_upb_array_resize_accessor2(msg, UPB_SIZE(80, 144), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_listener_v3_ListenerFilter**)_upb_array_resize_accessor2(msg, UPB_SIZE(92, 168), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_listener_v3_ListenerFilter* envoy_config_listener_v3_Listener_add_listener_filters(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_ListenerFilter* sub = (struct envoy_config_listener_v3_ListenerFilter*)_upb_msg_new(&envoy_config_listener_v3_ListenerFilter_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(80, 144), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(92, 168), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_transparent(envoy_config_listener_v3_Listener *msg, struct google_protobuf_BoolValue* value) {
- _upb_sethas(msg, 5);
- *UPB_PTR_AT(msg, UPB_SIZE(40, 64), struct google_protobuf_BoolValue*) = value;
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(44, 72), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_mutable_transparent(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_listener_v3_Listener_transparent(msg);
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_freebind(envoy_config_listener_v3_Listener *msg, struct google_protobuf_BoolValue* value) {
- _upb_sethas(msg, 6);
- *UPB_PTR_AT(msg, UPB_SIZE(44, 72), struct google_protobuf_BoolValue*) = value;
+ _upb_sethas(msg, 7);
+ *UPB_PTR_AT(msg, UPB_SIZE(48, 80), struct google_protobuf_BoolValue*) = value;
}
UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_mutable_freebind(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_listener_v3_Listener_freebind(msg);
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_tcp_fast_open_queue_length(envoy_config_listener_v3_Listener *msg, struct google_protobuf_UInt32Value* value) {
- _upb_sethas(msg, 7);
- *UPB_PTR_AT(msg, UPB_SIZE(48, 80), struct google_protobuf_UInt32Value*) = value;
+ _upb_sethas(msg, 8);
+ *UPB_PTR_AT(msg, UPB_SIZE(52, 88), struct google_protobuf_UInt32Value*) = value;
}
UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_mutable_tcp_fast_open_queue_length(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_listener_v3_Listener_tcp_fast_open_queue_length(msg);
return sub;
}
UPB_INLINE struct envoy_config_core_v3_SocketOption** envoy_config_listener_v3_Listener_mutable_socket_options(envoy_config_listener_v3_Listener *msg, size_t *len) {
- return (struct envoy_config_core_v3_SocketOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(84, 152), len);
+ return (struct envoy_config_core_v3_SocketOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(96, 176), len);
}
UPB_INLINE struct envoy_config_core_v3_SocketOption** envoy_config_listener_v3_Listener_resize_socket_options(envoy_config_listener_v3_Listener *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_core_v3_SocketOption**)_upb_array_resize_accessor2(msg, UPB_SIZE(84, 152), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_core_v3_SocketOption**)_upb_array_resize_accessor2(msg, UPB_SIZE(96, 176), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_core_v3_SocketOption* envoy_config_listener_v3_Listener_add_socket_options(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_core_v3_SocketOption* sub = (struct envoy_config_core_v3_SocketOption*)_upb_msg_new(&envoy_config_core_v3_SocketOption_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(84, 152), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(96, 176), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_listener_filters_timeout(envoy_config_listener_v3_Listener *msg, struct google_protobuf_Duration* value) {
- _upb_sethas(msg, 8);
- *UPB_PTR_AT(msg, UPB_SIZE(52, 88), struct google_protobuf_Duration*) = value;
+ _upb_sethas(msg, 9);
+ *UPB_PTR_AT(msg, UPB_SIZE(56, 96), struct google_protobuf_Duration*) = value;
}
UPB_INLINE struct google_protobuf_Duration* envoy_config_listener_v3_Listener_mutable_listener_filters_timeout(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_listener_v3_Listener_listener_filters_timeout(msg);
*UPB_PTR_AT(msg, UPB_SIZE(12, 12), bool) = value;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_udp_listener_config(envoy_config_listener_v3_Listener *msg, struct envoy_config_listener_v3_UdpListenerConfig* value) {
- _upb_sethas(msg, 9);
- *UPB_PTR_AT(msg, UPB_SIZE(56, 96), struct envoy_config_listener_v3_UdpListenerConfig*) = value;
+ _upb_sethas(msg, 10);
+ *UPB_PTR_AT(msg, UPB_SIZE(60, 104), struct envoy_config_listener_v3_UdpListenerConfig*) = value;
}
UPB_INLINE struct envoy_config_listener_v3_UdpListenerConfig* envoy_config_listener_v3_Listener_mutable_udp_listener_config(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_UdpListenerConfig* sub = (struct envoy_config_listener_v3_UdpListenerConfig*)envoy_config_listener_v3_Listener_udp_listener_config(msg);
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_api_listener(envoy_config_listener_v3_Listener *msg, struct envoy_config_listener_v3_ApiListener* value) {
- _upb_sethas(msg, 10);
- *UPB_PTR_AT(msg, UPB_SIZE(60, 104), struct envoy_config_listener_v3_ApiListener*) = value;
+ _upb_sethas(msg, 11);
+ *UPB_PTR_AT(msg, UPB_SIZE(64, 112), struct envoy_config_listener_v3_ApiListener*) = value;
}
UPB_INLINE struct envoy_config_listener_v3_ApiListener* envoy_config_listener_v3_Listener_mutable_api_listener(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_ApiListener* sub = (struct envoy_config_listener_v3_ApiListener*)envoy_config_listener_v3_Listener_api_listener(msg);
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_connection_balance_config(envoy_config_listener_v3_Listener *msg, envoy_config_listener_v3_Listener_ConnectionBalanceConfig* value) {
- _upb_sethas(msg, 11);
- *UPB_PTR_AT(msg, UPB_SIZE(64, 112), envoy_config_listener_v3_Listener_ConnectionBalanceConfig*) = value;
+ _upb_sethas(msg, 12);
+ *UPB_PTR_AT(msg, UPB_SIZE(68, 120), envoy_config_listener_v3_Listener_ConnectionBalanceConfig*) = value;
}
UPB_INLINE struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig* envoy_config_listener_v3_Listener_mutable_connection_balance_config(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig* sub = (struct envoy_config_listener_v3_Listener_ConnectionBalanceConfig*)envoy_config_listener_v3_Listener_connection_balance_config(msg);
*UPB_PTR_AT(msg, UPB_SIZE(13, 13), bool) = value;
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_config_listener_v3_Listener_mutable_access_log(envoy_config_listener_v3_Listener *msg, size_t *len) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(88, 160), len);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(100, 184), len);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_config_listener_v3_Listener_resize_access_log(envoy_config_listener_v3_Listener *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(88, 160), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(100, 184), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog* envoy_config_listener_v3_Listener_add_access_log(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_accesslog_v3_AccessLog* sub = (struct envoy_config_accesslog_v3_AccessLog*)_upb_msg_new(&envoy_config_accesslog_v3_AccessLog_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(88, 160), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(100, 184), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_udp_writer_config(envoy_config_listener_v3_Listener *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
- _upb_sethas(msg, 12);
- *UPB_PTR_AT(msg, UPB_SIZE(68, 120), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
+ _upb_sethas(msg, 13);
+ *UPB_PTR_AT(msg, UPB_SIZE(72, 128), struct envoy_config_core_v3_TypedExtensionConfig*) = value;
}
UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_listener_v3_Listener_mutable_udp_writer_config(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_config_listener_v3_Listener_udp_writer_config(msg);
return sub;
}
UPB_INLINE void envoy_config_listener_v3_Listener_set_tcp_backlog_size(envoy_config_listener_v3_Listener *msg, struct google_protobuf_UInt32Value* value) {
- _upb_sethas(msg, 13);
- *UPB_PTR_AT(msg, UPB_SIZE(72, 128), struct google_protobuf_UInt32Value*) = value;
+ _upb_sethas(msg, 14);
+ *UPB_PTR_AT(msg, UPB_SIZE(76, 136), struct google_protobuf_UInt32Value*) = value;
}
UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_listener_v3_Listener_mutable_tcp_backlog_size(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_listener_v3_Listener_tcp_backlog_size(msg);
}
return sub;
}
+UPB_INLINE void envoy_config_listener_v3_Listener_set_default_filter_chain(envoy_config_listener_v3_Listener *msg, struct envoy_config_listener_v3_FilterChain* value) {
+ _upb_sethas(msg, 15);
+ *UPB_PTR_AT(msg, UPB_SIZE(80, 144), struct envoy_config_listener_v3_FilterChain*) = value;
+}
+UPB_INLINE struct envoy_config_listener_v3_FilterChain* envoy_config_listener_v3_Listener_mutable_default_filter_chain(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
+ struct envoy_config_listener_v3_FilterChain* sub = (struct envoy_config_listener_v3_FilterChain*)envoy_config_listener_v3_Listener_default_filter_chain(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_listener_v3_FilterChain*)_upb_msg_new(&envoy_config_listener_v3_FilterChain_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_Listener_set_default_filter_chain(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_listener_v3_Listener_set_bind_to_port(envoy_config_listener_v3_Listener *msg, struct google_protobuf_BoolValue* value) {
+ _upb_sethas(msg, 16);
+ *UPB_PTR_AT(msg, UPB_SIZE(84, 152), struct google_protobuf_BoolValue*) = value;
+}
+UPB_INLINE struct google_protobuf_BoolValue* envoy_config_listener_v3_Listener_mutable_bind_to_port(envoy_config_listener_v3_Listener *msg, upb_arena *arena) {
+ struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_config_listener_v3_Listener_bind_to_port(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_BoolValue*)_upb_msg_new(&google_protobuf_BoolValue_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_Listener_set_bind_to_port(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.listener.v3.Listener.DeprecatedV1 */
#include "envoy/config/listener/v3/listener_components.upb.h"
#include "envoy/config/core/v3/address.upb.h"
#include "envoy/config/core/v3/base.upb.h"
+#include "envoy/config/core/v3/extension.upb.h"
#include "envoy/type/v3/range.upb.h"
#include "google/protobuf/any.upb.h"
#include "google/protobuf/duration.upb.h"
-#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "upb/port_def.inc"
-static const upb_msglayout *const envoy_config_listener_v3_Filter_submsgs[1] = {
+static const upb_msglayout *const envoy_config_listener_v3_Filter_submsgs[2] = {
+ &envoy_config_core_v3_ExtensionConfigSource_msginit,
&google_protobuf_Any_msginit,
};
-static const upb_msglayout_field envoy_config_listener_v3_Filter__fields[2] = {
+static const upb_msglayout_field envoy_config_listener_v3_Filter__fields[3] = {
{1, UPB_SIZE(0, 0), 0, 0, 9, 1},
- {4, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 0, 11, 1},
+ {4, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 1, 11, 1},
+ {5, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 0, 11, 1},
};
const upb_msglayout envoy_config_listener_v3_Filter_msginit = {
&envoy_config_listener_v3_Filter_submsgs[0],
&envoy_config_listener_v3_Filter__fields[0],
- UPB_SIZE(16, 32), 2, false, 255,
+ UPB_SIZE(16, 32), 3, false, 255,
};
static const upb_msglayout *const envoy_config_listener_v3_FilterChainMatch_submsgs[2] = {
UPB_SIZE(56, 96), 10, false, 255,
};
-static const upb_msglayout *const envoy_config_listener_v3_FilterChain_submsgs[6] = {
+static const upb_msglayout *const envoy_config_listener_v3_FilterChain_submsgs[7] = {
&envoy_config_core_v3_Metadata_msginit,
&envoy_config_core_v3_TransportSocket_msginit,
&envoy_config_listener_v3_Filter_msginit,
&envoy_config_listener_v3_FilterChain_OnDemandConfiguration_msginit,
&envoy_config_listener_v3_FilterChainMatch_msginit,
&google_protobuf_BoolValue_msginit,
+ &google_protobuf_Duration_msginit,
};
-static const upb_msglayout_field envoy_config_listener_v3_FilterChain__fields[7] = {
+static const upb_msglayout_field envoy_config_listener_v3_FilterChain__fields[8] = {
{1, UPB_SIZE(12, 24), 1, 4, 11, 1},
- {3, UPB_SIZE(32, 64), 0, 2, 11, 3},
+ {3, UPB_SIZE(36, 72), 0, 2, 11, 3},
{4, UPB_SIZE(16, 32), 2, 5, 11, 1},
{5, UPB_SIZE(20, 40), 3, 0, 11, 1},
{6, UPB_SIZE(24, 48), 4, 1, 11, 1},
{7, UPB_SIZE(4, 8), 0, 0, 9, 1},
{8, UPB_SIZE(28, 56), 5, 3, 11, 1},
+ {9, UPB_SIZE(32, 64), 6, 6, 11, 1},
};
const upb_msglayout envoy_config_listener_v3_FilterChain_msginit = {
&envoy_config_listener_v3_FilterChain_submsgs[0],
&envoy_config_listener_v3_FilterChain__fields[0],
- UPB_SIZE(40, 80), 7, false, 255,
+ UPB_SIZE(40, 80), 8, false, 255,
};
static const upb_msglayout *const envoy_config_listener_v3_FilterChain_OnDemandConfiguration_submsgs[1] = {
extern const upb_msglayout envoy_config_listener_v3_ListenerFilterChainMatchPredicate_MatchSet_msginit;
extern const upb_msglayout envoy_config_listener_v3_ListenerFilter_msginit;
struct envoy_config_core_v3_CidrRange;
+struct envoy_config_core_v3_ExtensionConfigSource;
struct envoy_config_core_v3_Metadata;
struct envoy_config_core_v3_TransportSocket;
struct envoy_type_v3_Int32Range;
struct google_protobuf_Duration;
struct google_protobuf_UInt32Value;
extern const upb_msglayout envoy_config_core_v3_CidrRange_msginit;
+extern const upb_msglayout envoy_config_core_v3_ExtensionConfigSource_msginit;
extern const upb_msglayout envoy_config_core_v3_Metadata_msginit;
extern const upb_msglayout envoy_config_core_v3_TransportSocket_msginit;
extern const upb_msglayout envoy_type_v3_Int32Range_msginit;
typedef enum {
envoy_config_listener_v3_Filter_config_type_typed_config = 4,
+ envoy_config_listener_v3_Filter_config_type_config_discovery = 5,
envoy_config_listener_v3_Filter_config_type_NOT_SET = 0
} envoy_config_listener_v3_Filter_config_type_oneofcases;
UPB_INLINE envoy_config_listener_v3_Filter_config_type_oneofcases envoy_config_listener_v3_Filter_config_type_case(const envoy_config_listener_v3_Filter* msg) { return (envoy_config_listener_v3_Filter_config_type_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(12, 24), int32_t); }
UPB_INLINE upb_strview envoy_config_listener_v3_Filter_name(const envoy_config_listener_v3_Filter *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview); }
UPB_INLINE bool envoy_config_listener_v3_Filter_has_typed_config(const envoy_config_listener_v3_Filter *msg) { return _upb_getoneofcase(msg, UPB_SIZE(12, 24)) == 4; }
UPB_INLINE const struct google_protobuf_Any* envoy_config_listener_v3_Filter_typed_config(const envoy_config_listener_v3_Filter *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Any*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 4, NULL); }
+UPB_INLINE bool envoy_config_listener_v3_Filter_has_config_discovery(const envoy_config_listener_v3_Filter *msg) { return _upb_getoneofcase(msg, UPB_SIZE(12, 24)) == 5; }
+UPB_INLINE const struct envoy_config_core_v3_ExtensionConfigSource* envoy_config_listener_v3_Filter_config_discovery(const envoy_config_listener_v3_Filter *msg) { return UPB_READ_ONEOF(msg, const struct envoy_config_core_v3_ExtensionConfigSource*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 5, NULL); }
UPB_INLINE void envoy_config_listener_v3_Filter_set_name(envoy_config_listener_v3_Filter *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview) = value;
}
return sub;
}
+UPB_INLINE void envoy_config_listener_v3_Filter_set_config_discovery(envoy_config_listener_v3_Filter *msg, struct envoy_config_core_v3_ExtensionConfigSource* value) {
+ UPB_WRITE_ONEOF(msg, struct envoy_config_core_v3_ExtensionConfigSource*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 5);
+}
+UPB_INLINE struct envoy_config_core_v3_ExtensionConfigSource* envoy_config_listener_v3_Filter_mutable_config_discovery(envoy_config_listener_v3_Filter *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_ExtensionConfigSource* sub = (struct envoy_config_core_v3_ExtensionConfigSource*)envoy_config_listener_v3_Filter_config_discovery(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_ExtensionConfigSource*)_upb_msg_new(&envoy_config_core_v3_ExtensionConfigSource_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_Filter_set_config_discovery(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.listener.v3.FilterChainMatch */
UPB_INLINE bool envoy_config_listener_v3_FilterChain_has_filter_chain_match(const envoy_config_listener_v3_FilterChain *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const envoy_config_listener_v3_FilterChainMatch* envoy_config_listener_v3_FilterChain_filter_chain_match(const envoy_config_listener_v3_FilterChain *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const envoy_config_listener_v3_FilterChainMatch*); }
-UPB_INLINE bool envoy_config_listener_v3_FilterChain_has_filters(const envoy_config_listener_v3_FilterChain *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(32, 64)); }
-UPB_INLINE const envoy_config_listener_v3_Filter* const* envoy_config_listener_v3_FilterChain_filters(const envoy_config_listener_v3_FilterChain *msg, size_t *len) { return (const envoy_config_listener_v3_Filter* const*)_upb_array_accessor(msg, UPB_SIZE(32, 64), len); }
+UPB_INLINE bool envoy_config_listener_v3_FilterChain_has_filters(const envoy_config_listener_v3_FilterChain *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(36, 72)); }
+UPB_INLINE const envoy_config_listener_v3_Filter* const* envoy_config_listener_v3_FilterChain_filters(const envoy_config_listener_v3_FilterChain *msg, size_t *len) { return (const envoy_config_listener_v3_Filter* const*)_upb_array_accessor(msg, UPB_SIZE(36, 72), len); }
UPB_INLINE bool envoy_config_listener_v3_FilterChain_has_use_proxy_proto(const envoy_config_listener_v3_FilterChain *msg) { return _upb_hasbit(msg, 2); }
UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_listener_v3_FilterChain_use_proxy_proto(const envoy_config_listener_v3_FilterChain *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_config_listener_v3_FilterChain_has_metadata(const envoy_config_listener_v3_FilterChain *msg) { return _upb_hasbit(msg, 3); }
UPB_INLINE upb_strview envoy_config_listener_v3_FilterChain_name(const envoy_config_listener_v3_FilterChain *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
UPB_INLINE bool envoy_config_listener_v3_FilterChain_has_on_demand_configuration(const envoy_config_listener_v3_FilterChain *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE const envoy_config_listener_v3_FilterChain_OnDemandConfiguration* envoy_config_listener_v3_FilterChain_on_demand_configuration(const envoy_config_listener_v3_FilterChain *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 56), const envoy_config_listener_v3_FilterChain_OnDemandConfiguration*); }
+UPB_INLINE bool envoy_config_listener_v3_FilterChain_has_transport_socket_connect_timeout(const envoy_config_listener_v3_FilterChain *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_config_listener_v3_FilterChain_transport_socket_connect_timeout(const envoy_config_listener_v3_FilterChain *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(32, 64), const struct google_protobuf_Duration*); }
UPB_INLINE void envoy_config_listener_v3_FilterChain_set_filter_chain_match(envoy_config_listener_v3_FilterChain *msg, envoy_config_listener_v3_FilterChainMatch* value) {
_upb_sethas(msg, 1);
return sub;
}
UPB_INLINE envoy_config_listener_v3_Filter** envoy_config_listener_v3_FilterChain_mutable_filters(envoy_config_listener_v3_FilterChain *msg, size_t *len) {
- return (envoy_config_listener_v3_Filter**)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 64), len);
+ return (envoy_config_listener_v3_Filter**)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 72), len);
}
UPB_INLINE envoy_config_listener_v3_Filter** envoy_config_listener_v3_FilterChain_resize_filters(envoy_config_listener_v3_FilterChain *msg, size_t len, upb_arena *arena) {
- return (envoy_config_listener_v3_Filter**)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 64), len, UPB_SIZE(2, 3), arena);
+ return (envoy_config_listener_v3_Filter**)_upb_array_resize_accessor2(msg, UPB_SIZE(36, 72), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_listener_v3_Filter* envoy_config_listener_v3_FilterChain_add_filters(envoy_config_listener_v3_FilterChain *msg, upb_arena *arena) {
struct envoy_config_listener_v3_Filter* sub = (struct envoy_config_listener_v3_Filter*)_upb_msg_new(&envoy_config_listener_v3_Filter_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(32, 64), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(36, 72), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
}
return sub;
}
+UPB_INLINE void envoy_config_listener_v3_FilterChain_set_transport_socket_connect_timeout(envoy_config_listener_v3_FilterChain *msg, struct google_protobuf_Duration* value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(32, 64), struct google_protobuf_Duration*) = value;
+}
+UPB_INLINE struct google_protobuf_Duration* envoy_config_listener_v3_FilterChain_mutable_transport_socket_connect_timeout(envoy_config_listener_v3_FilterChain *msg, upb_arena *arena) {
+ struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_config_listener_v3_FilterChain_transport_socket_connect_timeout(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Duration*)_upb_msg_new(&google_protobuf_Duration_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_listener_v3_FilterChain_set_transport_socket_connect_timeout(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.listener.v3.FilterChain.OnDemandConfiguration */
#include "upb/msg.h"
#include "envoy/config/listener/v3/udp_listener_config.upb.h"
#include "google/protobuf/any.upb.h"
-#include "google/protobuf/struct.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "upb/port_def.inc"
-static const upb_msglayout *const envoy_config_route_v3_RouteConfiguration_submsgs[4] = {
+static const upb_msglayout *const envoy_config_route_v3_RouteConfiguration_submsgs[5] = {
&envoy_config_core_v3_HeaderValueOption_msginit,
&envoy_config_route_v3_Vhds_msginit,
&envoy_config_route_v3_VirtualHost_msginit,
&google_protobuf_BoolValue_msginit,
+ &google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_config_route_v3_RouteConfiguration__fields[10] = {
+static const upb_msglayout_field envoy_config_route_v3_RouteConfiguration__fields[11] = {
{1, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {2, UPB_SIZE(20, 40), 0, 2, 11, 3},
- {3, UPB_SIZE(24, 48), 0, 0, 9, 3},
- {4, UPB_SIZE(28, 56), 0, 0, 11, 3},
- {5, UPB_SIZE(32, 64), 0, 0, 9, 3},
- {6, UPB_SIZE(36, 72), 0, 0, 11, 3},
+ {2, UPB_SIZE(24, 48), 0, 2, 11, 3},
+ {3, UPB_SIZE(28, 56), 0, 0, 9, 3},
+ {4, UPB_SIZE(32, 64), 0, 0, 11, 3},
+ {5, UPB_SIZE(36, 72), 0, 0, 9, 3},
+ {6, UPB_SIZE(40, 80), 0, 0, 11, 3},
{7, UPB_SIZE(12, 24), 1, 3, 11, 1},
- {8, UPB_SIZE(40, 80), 0, 0, 9, 3},
+ {8, UPB_SIZE(44, 88), 0, 0, 9, 3},
{9, UPB_SIZE(16, 32), 2, 1, 11, 1},
{10, UPB_SIZE(1, 1), 0, 0, 8, 1},
+ {11, UPB_SIZE(20, 40), 3, 4, 11, 1},
};
const upb_msglayout envoy_config_route_v3_RouteConfiguration_msginit = {
&envoy_config_route_v3_RouteConfiguration_submsgs[0],
&envoy_config_route_v3_RouteConfiguration__fields[0],
- UPB_SIZE(48, 96), 10, false, 255,
+ UPB_SIZE(48, 96), 11, false, 255,
};
static const upb_msglayout *const envoy_config_route_v3_Vhds_submsgs[1] = {
struct envoy_config_core_v3_HeaderValueOption;
struct envoy_config_route_v3_VirtualHost;
struct google_protobuf_BoolValue;
+struct google_protobuf_UInt32Value;
extern const upb_msglayout envoy_config_core_v3_ConfigSource_msginit;
extern const upb_msglayout envoy_config_core_v3_HeaderValueOption_msginit;
extern const upb_msglayout envoy_config_route_v3_VirtualHost_msginit;
extern const upb_msglayout google_protobuf_BoolValue_msginit;
+extern const upb_msglayout google_protobuf_UInt32Value_msginit;
/* envoy.config.route.v3.RouteConfiguration */
}
UPB_INLINE upb_strview envoy_config_route_v3_RouteConfiguration_name(const envoy_config_route_v3_RouteConfiguration *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
-UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_virtual_hosts(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(20, 40)); }
-UPB_INLINE const struct envoy_config_route_v3_VirtualHost* const* envoy_config_route_v3_RouteConfiguration_virtual_hosts(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (const struct envoy_config_route_v3_VirtualHost* const*)_upb_array_accessor(msg, UPB_SIZE(20, 40), len); }
-UPB_INLINE upb_strview const* envoy_config_route_v3_RouteConfiguration_internal_only_headers(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(24, 48), len); }
-UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_response_headers_to_add(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(28, 56)); }
-UPB_INLINE const struct envoy_config_core_v3_HeaderValueOption* const* envoy_config_route_v3_RouteConfiguration_response_headers_to_add(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (const struct envoy_config_core_v3_HeaderValueOption* const*)_upb_array_accessor(msg, UPB_SIZE(28, 56), len); }
-UPB_INLINE upb_strview const* envoy_config_route_v3_RouteConfiguration_response_headers_to_remove(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(32, 64), len); }
-UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_request_headers_to_add(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(36, 72)); }
-UPB_INLINE const struct envoy_config_core_v3_HeaderValueOption* const* envoy_config_route_v3_RouteConfiguration_request_headers_to_add(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (const struct envoy_config_core_v3_HeaderValueOption* const*)_upb_array_accessor(msg, UPB_SIZE(36, 72), len); }
+UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_virtual_hosts(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(24, 48)); }
+UPB_INLINE const struct envoy_config_route_v3_VirtualHost* const* envoy_config_route_v3_RouteConfiguration_virtual_hosts(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (const struct envoy_config_route_v3_VirtualHost* const*)_upb_array_accessor(msg, UPB_SIZE(24, 48), len); }
+UPB_INLINE upb_strview const* envoy_config_route_v3_RouteConfiguration_internal_only_headers(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(28, 56), len); }
+UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_response_headers_to_add(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(32, 64)); }
+UPB_INLINE const struct envoy_config_core_v3_HeaderValueOption* const* envoy_config_route_v3_RouteConfiguration_response_headers_to_add(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (const struct envoy_config_core_v3_HeaderValueOption* const*)_upb_array_accessor(msg, UPB_SIZE(32, 64), len); }
+UPB_INLINE upb_strview const* envoy_config_route_v3_RouteConfiguration_response_headers_to_remove(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(36, 72), len); }
+UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_request_headers_to_add(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(40, 80)); }
+UPB_INLINE const struct envoy_config_core_v3_HeaderValueOption* const* envoy_config_route_v3_RouteConfiguration_request_headers_to_add(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (const struct envoy_config_core_v3_HeaderValueOption* const*)_upb_array_accessor(msg, UPB_SIZE(40, 80), len); }
UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_validate_clusters(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_route_v3_RouteConfiguration_validate_clusters(const envoy_config_route_v3_RouteConfiguration *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct google_protobuf_BoolValue*); }
-UPB_INLINE upb_strview const* envoy_config_route_v3_RouteConfiguration_request_headers_to_remove(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(40, 80), len); }
+UPB_INLINE upb_strview const* envoy_config_route_v3_RouteConfiguration_request_headers_to_remove(const envoy_config_route_v3_RouteConfiguration *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(44, 88), len); }
UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_vhds(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_hasbit(msg, 2); }
UPB_INLINE const envoy_config_route_v3_Vhds* envoy_config_route_v3_RouteConfiguration_vhds(const envoy_config_route_v3_RouteConfiguration *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const envoy_config_route_v3_Vhds*); }
UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_most_specific_header_mutations_wins(const envoy_config_route_v3_RouteConfiguration *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool); }
+UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_has_max_direct_response_body_size_bytes(const envoy_config_route_v3_RouteConfiguration *msg) { return _upb_hasbit(msg, 3); }
+UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_route_v3_RouteConfiguration_max_direct_response_body_size_bytes(const envoy_config_route_v3_RouteConfiguration *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), const struct google_protobuf_UInt32Value*); }
UPB_INLINE void envoy_config_route_v3_RouteConfiguration_set_name(envoy_config_route_v3_RouteConfiguration *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
}
UPB_INLINE struct envoy_config_route_v3_VirtualHost** envoy_config_route_v3_RouteConfiguration_mutable_virtual_hosts(envoy_config_route_v3_RouteConfiguration *msg, size_t *len) {
- return (struct envoy_config_route_v3_VirtualHost**)_upb_array_mutable_accessor(msg, UPB_SIZE(20, 40), len);
+ return (struct envoy_config_route_v3_VirtualHost**)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 48), len);
}
UPB_INLINE struct envoy_config_route_v3_VirtualHost** envoy_config_route_v3_RouteConfiguration_resize_virtual_hosts(envoy_config_route_v3_RouteConfiguration *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_route_v3_VirtualHost**)_upb_array_resize_accessor2(msg, UPB_SIZE(20, 40), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_route_v3_VirtualHost**)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 48), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_route_v3_VirtualHost* envoy_config_route_v3_RouteConfiguration_add_virtual_hosts(envoy_config_route_v3_RouteConfiguration *msg, upb_arena *arena) {
struct envoy_config_route_v3_VirtualHost* sub = (struct envoy_config_route_v3_VirtualHost*)_upb_msg_new(&envoy_config_route_v3_VirtualHost_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(20, 40), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(24, 48), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE upb_strview* envoy_config_route_v3_RouteConfiguration_mutable_internal_only_headers(envoy_config_route_v3_RouteConfiguration *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 48), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 56), len);
}
UPB_INLINE upb_strview* envoy_config_route_v3_RouteConfiguration_resize_internal_only_headers(envoy_config_route_v3_RouteConfiguration *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 48), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 56), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_add_internal_only_headers(envoy_config_route_v3_RouteConfiguration *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(24, 48), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(28, 56), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE struct envoy_config_core_v3_HeaderValueOption** envoy_config_route_v3_RouteConfiguration_mutable_response_headers_to_add(envoy_config_route_v3_RouteConfiguration *msg, size_t *len) {
- return (struct envoy_config_core_v3_HeaderValueOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 56), len);
+ return (struct envoy_config_core_v3_HeaderValueOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 64), len);
}
UPB_INLINE struct envoy_config_core_v3_HeaderValueOption** envoy_config_route_v3_RouteConfiguration_resize_response_headers_to_add(envoy_config_route_v3_RouteConfiguration *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_core_v3_HeaderValueOption**)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 56), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_core_v3_HeaderValueOption**)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 64), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_core_v3_HeaderValueOption* envoy_config_route_v3_RouteConfiguration_add_response_headers_to_add(envoy_config_route_v3_RouteConfiguration *msg, upb_arena *arena) {
struct envoy_config_core_v3_HeaderValueOption* sub = (struct envoy_config_core_v3_HeaderValueOption*)_upb_msg_new(&envoy_config_core_v3_HeaderValueOption_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(28, 56), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(32, 64), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE upb_strview* envoy_config_route_v3_RouteConfiguration_mutable_response_headers_to_remove(envoy_config_route_v3_RouteConfiguration *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 64), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 72), len);
}
UPB_INLINE upb_strview* envoy_config_route_v3_RouteConfiguration_resize_response_headers_to_remove(envoy_config_route_v3_RouteConfiguration *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 64), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(36, 72), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_add_response_headers_to_remove(envoy_config_route_v3_RouteConfiguration *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(32, 64), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(36, 72), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE struct envoy_config_core_v3_HeaderValueOption** envoy_config_route_v3_RouteConfiguration_mutable_request_headers_to_add(envoy_config_route_v3_RouteConfiguration *msg, size_t *len) {
- return (struct envoy_config_core_v3_HeaderValueOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 72), len);
+ return (struct envoy_config_core_v3_HeaderValueOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(40, 80), len);
}
UPB_INLINE struct envoy_config_core_v3_HeaderValueOption** envoy_config_route_v3_RouteConfiguration_resize_request_headers_to_add(envoy_config_route_v3_RouteConfiguration *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_core_v3_HeaderValueOption**)_upb_array_resize_accessor2(msg, UPB_SIZE(36, 72), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_core_v3_HeaderValueOption**)_upb_array_resize_accessor2(msg, UPB_SIZE(40, 80), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_core_v3_HeaderValueOption* envoy_config_route_v3_RouteConfiguration_add_request_headers_to_add(envoy_config_route_v3_RouteConfiguration *msg, upb_arena *arena) {
struct envoy_config_core_v3_HeaderValueOption* sub = (struct envoy_config_core_v3_HeaderValueOption*)_upb_msg_new(&envoy_config_core_v3_HeaderValueOption_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(36, 72), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(40, 80), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
return sub;
}
UPB_INLINE upb_strview* envoy_config_route_v3_RouteConfiguration_mutable_request_headers_to_remove(envoy_config_route_v3_RouteConfiguration *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(40, 80), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(44, 88), len);
}
UPB_INLINE upb_strview* envoy_config_route_v3_RouteConfiguration_resize_request_headers_to_remove(envoy_config_route_v3_RouteConfiguration *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(40, 80), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(44, 88), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_config_route_v3_RouteConfiguration_add_request_headers_to_remove(envoy_config_route_v3_RouteConfiguration *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(40, 80), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(44, 88), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE void envoy_config_route_v3_RouteConfiguration_set_vhds(envoy_config_route_v3_RouteConfiguration *msg, envoy_config_route_v3_Vhds* value) {
UPB_INLINE void envoy_config_route_v3_RouteConfiguration_set_most_specific_header_mutations_wins(envoy_config_route_v3_RouteConfiguration *msg, bool value) {
*UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool) = value;
}
+UPB_INLINE void envoy_config_route_v3_RouteConfiguration_set_max_direct_response_body_size_bytes(envoy_config_route_v3_RouteConfiguration *msg, struct google_protobuf_UInt32Value* value) {
+ _upb_sethas(msg, 3);
+ *UPB_PTR_AT(msg, UPB_SIZE(20, 40), struct google_protobuf_UInt32Value*) = value;
+}
+UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_route_v3_RouteConfiguration_mutable_max_direct_response_body_size_bytes(envoy_config_route_v3_RouteConfiguration *msg, upb_arena *arena) {
+ struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_config_route_v3_RouteConfiguration_max_direct_response_body_size_bytes(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_UInt32Value*)_upb_msg_new(&google_protobuf_UInt32Value_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_route_v3_RouteConfiguration_set_max_direct_response_body_size_bytes(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.route.v3.Vhds */
#include "envoy/type/v3/range.upb.h"
#include "google/protobuf/any.upb.h"
#include "google/protobuf/duration.upb.h"
-#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/migrate.upb.h"
&envoy_config_core_v3_ProxyProtocolConfig_msginit,
};
-static const upb_msglayout_field envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig__fields[1] = {
+static const upb_msglayout_field envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig__fields[2] = {
{1, UPB_SIZE(4, 8), 1, 0, 11, 1},
+ {2, UPB_SIZE(1, 1), 0, 0, 8, 1},
};
const upb_msglayout envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig_msginit = {
&envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig_submsgs[0],
&envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig__fields[0],
- UPB_SIZE(8, 16), 1, false, 255,
+ UPB_SIZE(8, 16), 2, false, 255,
};
static const upb_msglayout *const envoy_config_route_v3_RouteAction_MaxStreamDuration_submsgs[1] = {
UPB_SIZE(16, 24), 3, false, 255,
};
-static const upb_msglayout_field envoy_config_route_v3_RedirectAction__fields[8] = {
+static const upb_msglayout *const envoy_config_route_v3_RedirectAction_submsgs[1] = {
+ &envoy_type_matcher_v3_RegexMatchAndSubstitute_msginit,
+};
+
+static const upb_msglayout_field envoy_config_route_v3_RedirectAction__fields[9] = {
{1, UPB_SIZE(12, 16), 0, 0, 9, 1},
{2, UPB_SIZE(20, 32), UPB_SIZE(-29, -49), 0, 9, 1},
{3, UPB_SIZE(0, 0), 0, 0, 14, 1},
{6, UPB_SIZE(8, 8), 0, 0, 8, 1},
{7, UPB_SIZE(32, 56), UPB_SIZE(-41, -73), 0, 9, 1},
{8, UPB_SIZE(4, 4), 0, 0, 13, 1},
+ {9, UPB_SIZE(20, 32), UPB_SIZE(-29, -49), 0, 11, 1},
};
const upb_msglayout envoy_config_route_v3_RedirectAction_msginit = {
- NULL,
+ &envoy_config_route_v3_RedirectAction_submsgs[0],
&envoy_config_route_v3_RedirectAction__fields[0],
- UPB_SIZE(48, 80), 8, false, 255,
+ UPB_SIZE(48, 80), 9, false, 255,
};
static const upb_msglayout *const envoy_config_route_v3_DirectResponseAction_submsgs[1] = {
UPB_SIZE(24, 48), 4, false, 255,
};
-static const upb_msglayout *const envoy_config_route_v3_RateLimit_Action_submsgs[7] = {
+static const upb_msglayout *const envoy_config_route_v3_RateLimit_Action_submsgs[9] = {
+ &envoy_config_core_v3_TypedExtensionConfig_msginit,
&envoy_config_route_v3_RateLimit_Action_DestinationCluster_msginit,
&envoy_config_route_v3_RateLimit_Action_DynamicMetaData_msginit,
&envoy_config_route_v3_RateLimit_Action_GenericKey_msginit,
&envoy_config_route_v3_RateLimit_Action_HeaderValueMatch_msginit,
+ &envoy_config_route_v3_RateLimit_Action_MetaData_msginit,
&envoy_config_route_v3_RateLimit_Action_RemoteAddress_msginit,
&envoy_config_route_v3_RateLimit_Action_RequestHeaders_msginit,
&envoy_config_route_v3_RateLimit_Action_SourceCluster_msginit,
};
-static const upb_msglayout_field envoy_config_route_v3_RateLimit_Action__fields[7] = {
- {1, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 6, 11, 1},
- {2, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 0, 11, 1},
- {3, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 5, 11, 1},
- {4, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 4, 11, 1},
- {5, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 2, 11, 1},
- {6, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 3, 11, 1},
- {7, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 1, 11, 1},
+static const upb_msglayout_field envoy_config_route_v3_RateLimit_Action__fields[9] = {
+ {1, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 8, 11, 1},
+ {2, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 1, 11, 1},
+ {3, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 7, 11, 1},
+ {4, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 6, 11, 1},
+ {5, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 3, 11, 1},
+ {6, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 4, 11, 1},
+ {7, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 2, 11, 1},
+ {8, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 5, 11, 1},
+ {9, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 0, 11, 1},
};
const upb_msglayout envoy_config_route_v3_RateLimit_Action_msginit = {
&envoy_config_route_v3_RateLimit_Action_submsgs[0],
&envoy_config_route_v3_RateLimit_Action__fields[0],
- UPB_SIZE(8, 16), 7, false, 255,
+ UPB_SIZE(8, 16), 9, false, 255,
};
const upb_msglayout envoy_config_route_v3_RateLimit_Action_SourceCluster_msginit = {
UPB_SIZE(24, 48), 3, false, 255,
};
+static const upb_msglayout *const envoy_config_route_v3_RateLimit_Action_MetaData_submsgs[1] = {
+ &envoy_type_metadata_v3_MetadataKey_msginit,
+};
+
+static const upb_msglayout_field envoy_config_route_v3_RateLimit_Action_MetaData__fields[4] = {
+ {1, UPB_SIZE(8, 8), 0, 0, 9, 1},
+ {2, UPB_SIZE(24, 40), 1, 0, 11, 1},
+ {3, UPB_SIZE(16, 24), 0, 0, 9, 1},
+ {4, UPB_SIZE(4, 4), 0, 0, 14, 1},
+};
+
+const upb_msglayout envoy_config_route_v3_RateLimit_Action_MetaData_msginit = {
+ &envoy_config_route_v3_RateLimit_Action_MetaData_submsgs[0],
+ &envoy_config_route_v3_RateLimit_Action_MetaData__fields[0],
+ UPB_SIZE(32, 48), 4, false, 255,
+};
+
static const upb_msglayout *const envoy_config_route_v3_RateLimit_Override_submsgs[1] = {
&envoy_config_route_v3_RateLimit_Override_DynamicMetadata_msginit,
};
struct envoy_config_route_v3_RateLimit_Action_GenericKey;
struct envoy_config_route_v3_RateLimit_Action_HeaderValueMatch;
struct envoy_config_route_v3_RateLimit_Action_DynamicMetaData;
+struct envoy_config_route_v3_RateLimit_Action_MetaData;
struct envoy_config_route_v3_RateLimit_Override;
struct envoy_config_route_v3_RateLimit_Override_DynamicMetadata;
struct envoy_config_route_v3_HeaderMatcher;
typedef struct envoy_config_route_v3_RateLimit_Action_GenericKey envoy_config_route_v3_RateLimit_Action_GenericKey;
typedef struct envoy_config_route_v3_RateLimit_Action_HeaderValueMatch envoy_config_route_v3_RateLimit_Action_HeaderValueMatch;
typedef struct envoy_config_route_v3_RateLimit_Action_DynamicMetaData envoy_config_route_v3_RateLimit_Action_DynamicMetaData;
+typedef struct envoy_config_route_v3_RateLimit_Action_MetaData envoy_config_route_v3_RateLimit_Action_MetaData;
typedef struct envoy_config_route_v3_RateLimit_Override envoy_config_route_v3_RateLimit_Override;
typedef struct envoy_config_route_v3_RateLimit_Override_DynamicMetadata envoy_config_route_v3_RateLimit_Override_DynamicMetadata;
typedef struct envoy_config_route_v3_HeaderMatcher envoy_config_route_v3_HeaderMatcher;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Action_GenericKey_msginit;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Action_HeaderValueMatch_msginit;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Action_DynamicMetaData_msginit;
+extern const upb_msglayout envoy_config_route_v3_RateLimit_Action_MetaData_msginit;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Override_msginit;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Override_DynamicMetadata_msginit;
extern const upb_msglayout envoy_config_route_v3_HeaderMatcher_msginit;
extern const upb_msglayout google_protobuf_UInt32Value_msginit;
typedef enum {
+ envoy_config_route_v3_RateLimit_Action_MetaData_DYNAMIC = 0,
+ envoy_config_route_v3_RateLimit_Action_MetaData_ROUTE_ENTRY = 1
+} envoy_config_route_v3_RateLimit_Action_MetaData_Source;
+
+typedef enum {
envoy_config_route_v3_RedirectAction_MOVED_PERMANENTLY = 0,
envoy_config_route_v3_RedirectAction_FOUND = 1,
envoy_config_route_v3_RedirectAction_SEE_OTHER = 2,
UPB_INLINE bool envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig_has_proxy_protocol_config(const envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct envoy_config_core_v3_ProxyProtocolConfig* envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig_proxy_protocol_config(const envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), const struct envoy_config_core_v3_ProxyProtocolConfig*); }
+UPB_INLINE bool envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig_allow_post(const envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool); }
UPB_INLINE void envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig_set_proxy_protocol_config(envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig *msg, struct envoy_config_core_v3_ProxyProtocolConfig* value) {
_upb_sethas(msg, 1);
}
return sub;
}
+UPB_INLINE void envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig_set_allow_post(envoy_config_route_v3_RouteAction_UpgradeConfig_ConnectConfig *msg, bool value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(1, 1), bool) = value;
+}
/* envoy.config.route.v3.RouteAction.MaxStreamDuration */
typedef enum {
envoy_config_route_v3_RedirectAction_path_rewrite_specifier_path_redirect = 2,
envoy_config_route_v3_RedirectAction_path_rewrite_specifier_prefix_rewrite = 5,
+ envoy_config_route_v3_RedirectAction_path_rewrite_specifier_regex_rewrite = 9,
envoy_config_route_v3_RedirectAction_path_rewrite_specifier_NOT_SET = 0
} envoy_config_route_v3_RedirectAction_path_rewrite_specifier_oneofcases;
UPB_INLINE envoy_config_route_v3_RedirectAction_path_rewrite_specifier_oneofcases envoy_config_route_v3_RedirectAction_path_rewrite_specifier_case(const envoy_config_route_v3_RedirectAction* msg) { return (envoy_config_route_v3_RedirectAction_path_rewrite_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(28, 48), int32_t); }
UPB_INLINE bool envoy_config_route_v3_RedirectAction_has_scheme_redirect(const envoy_config_route_v3_RedirectAction *msg) { return _upb_getoneofcase(msg, UPB_SIZE(40, 72)) == 7; }
UPB_INLINE upb_strview envoy_config_route_v3_RedirectAction_scheme_redirect(const envoy_config_route_v3_RedirectAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(32, 56), UPB_SIZE(40, 72), 7, upb_strview_make("", strlen(""))); }
UPB_INLINE uint32_t envoy_config_route_v3_RedirectAction_port_redirect(const envoy_config_route_v3_RedirectAction *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), uint32_t); }
+UPB_INLINE bool envoy_config_route_v3_RedirectAction_has_regex_rewrite(const envoy_config_route_v3_RedirectAction *msg) { return _upb_getoneofcase(msg, UPB_SIZE(28, 48)) == 9; }
+UPB_INLINE const struct envoy_type_matcher_v3_RegexMatchAndSubstitute* envoy_config_route_v3_RedirectAction_regex_rewrite(const envoy_config_route_v3_RedirectAction *msg) { return UPB_READ_ONEOF(msg, const struct envoy_type_matcher_v3_RegexMatchAndSubstitute*, UPB_SIZE(20, 32), UPB_SIZE(28, 48), 9, NULL); }
UPB_INLINE void envoy_config_route_v3_RedirectAction_set_host_redirect(envoy_config_route_v3_RedirectAction *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(12, 16), upb_strview) = value;
UPB_INLINE void envoy_config_route_v3_RedirectAction_set_port_redirect(envoy_config_route_v3_RedirectAction *msg, uint32_t value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), uint32_t) = value;
}
+UPB_INLINE void envoy_config_route_v3_RedirectAction_set_regex_rewrite(envoy_config_route_v3_RedirectAction *msg, struct envoy_type_matcher_v3_RegexMatchAndSubstitute* value) {
+ UPB_WRITE_ONEOF(msg, struct envoy_type_matcher_v3_RegexMatchAndSubstitute*, UPB_SIZE(20, 32), value, UPB_SIZE(28, 48), 9);
+}
+UPB_INLINE struct envoy_type_matcher_v3_RegexMatchAndSubstitute* envoy_config_route_v3_RedirectAction_mutable_regex_rewrite(envoy_config_route_v3_RedirectAction *msg, upb_arena *arena) {
+ struct envoy_type_matcher_v3_RegexMatchAndSubstitute* sub = (struct envoy_type_matcher_v3_RegexMatchAndSubstitute*)envoy_config_route_v3_RedirectAction_regex_rewrite(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_type_matcher_v3_RegexMatchAndSubstitute*)_upb_msg_new(&envoy_type_matcher_v3_RegexMatchAndSubstitute_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_route_v3_RedirectAction_set_regex_rewrite(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.route.v3.DirectResponseAction */
envoy_config_route_v3_RateLimit_Action_action_specifier_generic_key = 5,
envoy_config_route_v3_RateLimit_Action_action_specifier_header_value_match = 6,
envoy_config_route_v3_RateLimit_Action_action_specifier_dynamic_metadata = 7,
+ envoy_config_route_v3_RateLimit_Action_action_specifier_metadata = 8,
+ envoy_config_route_v3_RateLimit_Action_action_specifier_extension = 9,
envoy_config_route_v3_RateLimit_Action_action_specifier_NOT_SET = 0
} envoy_config_route_v3_RateLimit_Action_action_specifier_oneofcases;
UPB_INLINE envoy_config_route_v3_RateLimit_Action_action_specifier_oneofcases envoy_config_route_v3_RateLimit_Action_action_specifier_case(const envoy_config_route_v3_RateLimit_Action* msg) { return (envoy_config_route_v3_RateLimit_Action_action_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(4, 8), int32_t); }
UPB_INLINE const envoy_config_route_v3_RateLimit_Action_HeaderValueMatch* envoy_config_route_v3_RateLimit_Action_header_value_match(const envoy_config_route_v3_RateLimit_Action *msg) { return UPB_READ_ONEOF(msg, const envoy_config_route_v3_RateLimit_Action_HeaderValueMatch*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 6, NULL); }
UPB_INLINE bool envoy_config_route_v3_RateLimit_Action_has_dynamic_metadata(const envoy_config_route_v3_RateLimit_Action *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 7; }
UPB_INLINE const envoy_config_route_v3_RateLimit_Action_DynamicMetaData* envoy_config_route_v3_RateLimit_Action_dynamic_metadata(const envoy_config_route_v3_RateLimit_Action *msg) { return UPB_READ_ONEOF(msg, const envoy_config_route_v3_RateLimit_Action_DynamicMetaData*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 7, NULL); }
+UPB_INLINE bool envoy_config_route_v3_RateLimit_Action_has_metadata(const envoy_config_route_v3_RateLimit_Action *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 8; }
+UPB_INLINE const envoy_config_route_v3_RateLimit_Action_MetaData* envoy_config_route_v3_RateLimit_Action_metadata(const envoy_config_route_v3_RateLimit_Action *msg) { return UPB_READ_ONEOF(msg, const envoy_config_route_v3_RateLimit_Action_MetaData*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 8, NULL); }
+UPB_INLINE bool envoy_config_route_v3_RateLimit_Action_has_extension(const envoy_config_route_v3_RateLimit_Action *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 9; }
+UPB_INLINE const struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_route_v3_RateLimit_Action_extension(const envoy_config_route_v3_RateLimit_Action *msg) { return UPB_READ_ONEOF(msg, const struct envoy_config_core_v3_TypedExtensionConfig*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 9, NULL); }
UPB_INLINE void envoy_config_route_v3_RateLimit_Action_set_source_cluster(envoy_config_route_v3_RateLimit_Action *msg, envoy_config_route_v3_RateLimit_Action_SourceCluster* value) {
UPB_WRITE_ONEOF(msg, envoy_config_route_v3_RateLimit_Action_SourceCluster*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 1);
}
return sub;
}
+UPB_INLINE void envoy_config_route_v3_RateLimit_Action_set_metadata(envoy_config_route_v3_RateLimit_Action *msg, envoy_config_route_v3_RateLimit_Action_MetaData* value) {
+ UPB_WRITE_ONEOF(msg, envoy_config_route_v3_RateLimit_Action_MetaData*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 8);
+}
+UPB_INLINE struct envoy_config_route_v3_RateLimit_Action_MetaData* envoy_config_route_v3_RateLimit_Action_mutable_metadata(envoy_config_route_v3_RateLimit_Action *msg, upb_arena *arena) {
+ struct envoy_config_route_v3_RateLimit_Action_MetaData* sub = (struct envoy_config_route_v3_RateLimit_Action_MetaData*)envoy_config_route_v3_RateLimit_Action_metadata(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_route_v3_RateLimit_Action_MetaData*)_upb_msg_new(&envoy_config_route_v3_RateLimit_Action_MetaData_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_route_v3_RateLimit_Action_set_metadata(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_route_v3_RateLimit_Action_set_extension(envoy_config_route_v3_RateLimit_Action *msg, struct envoy_config_core_v3_TypedExtensionConfig* value) {
+ UPB_WRITE_ONEOF(msg, struct envoy_config_core_v3_TypedExtensionConfig*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 9);
+}
+UPB_INLINE struct envoy_config_core_v3_TypedExtensionConfig* envoy_config_route_v3_RateLimit_Action_mutable_extension(envoy_config_route_v3_RateLimit_Action *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_TypedExtensionConfig* sub = (struct envoy_config_core_v3_TypedExtensionConfig*)envoy_config_route_v3_RateLimit_Action_extension(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_TypedExtensionConfig*)_upb_msg_new(&envoy_config_core_v3_TypedExtensionConfig_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_route_v3_RateLimit_Action_set_extension(msg, sub);
+ }
+ return sub;
+}
/* envoy.config.route.v3.RateLimit.Action.SourceCluster */
*UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
}
+/* envoy.config.route.v3.RateLimit.Action.MetaData */
+
+UPB_INLINE envoy_config_route_v3_RateLimit_Action_MetaData *envoy_config_route_v3_RateLimit_Action_MetaData_new(upb_arena *arena) {
+ return (envoy_config_route_v3_RateLimit_Action_MetaData *)_upb_msg_new(&envoy_config_route_v3_RateLimit_Action_MetaData_msginit, arena);
+}
+UPB_INLINE envoy_config_route_v3_RateLimit_Action_MetaData *envoy_config_route_v3_RateLimit_Action_MetaData_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_config_route_v3_RateLimit_Action_MetaData *ret = envoy_config_route_v3_RateLimit_Action_MetaData_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_config_route_v3_RateLimit_Action_MetaData_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_config_route_v3_RateLimit_Action_MetaData *envoy_config_route_v3_RateLimit_Action_MetaData_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_config_route_v3_RateLimit_Action_MetaData *ret = envoy_config_route_v3_RateLimit_Action_MetaData_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_config_route_v3_RateLimit_Action_MetaData_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_config_route_v3_RateLimit_Action_MetaData_serialize(const envoy_config_route_v3_RateLimit_Action_MetaData *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_config_route_v3_RateLimit_Action_MetaData_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview envoy_config_route_v3_RateLimit_Action_MetaData_descriptor_key(const envoy_config_route_v3_RateLimit_Action_MetaData *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), upb_strview); }
+UPB_INLINE bool envoy_config_route_v3_RateLimit_Action_MetaData_has_metadata_key(const envoy_config_route_v3_RateLimit_Action_MetaData *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct envoy_type_metadata_v3_MetadataKey* envoy_config_route_v3_RateLimit_Action_MetaData_metadata_key(const envoy_config_route_v3_RateLimit_Action_MetaData *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 40), const struct envoy_type_metadata_v3_MetadataKey*); }
+UPB_INLINE upb_strview envoy_config_route_v3_RateLimit_Action_MetaData_default_value(const envoy_config_route_v3_RateLimit_Action_MetaData *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 24), upb_strview); }
+UPB_INLINE int32_t envoy_config_route_v3_RateLimit_Action_MetaData_source(const envoy_config_route_v3_RateLimit_Action_MetaData *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
+
+UPB_INLINE void envoy_config_route_v3_RateLimit_Action_MetaData_set_descriptor_key(envoy_config_route_v3_RateLimit_Action_MetaData *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(8, 8), upb_strview) = value;
+}
+UPB_INLINE void envoy_config_route_v3_RateLimit_Action_MetaData_set_metadata_key(envoy_config_route_v3_RateLimit_Action_MetaData *msg, struct envoy_type_metadata_v3_MetadataKey* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 40), struct envoy_type_metadata_v3_MetadataKey*) = value;
+}
+UPB_INLINE struct envoy_type_metadata_v3_MetadataKey* envoy_config_route_v3_RateLimit_Action_MetaData_mutable_metadata_key(envoy_config_route_v3_RateLimit_Action_MetaData *msg, upb_arena *arena) {
+ struct envoy_type_metadata_v3_MetadataKey* sub = (struct envoy_type_metadata_v3_MetadataKey*)envoy_config_route_v3_RateLimit_Action_MetaData_metadata_key(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_type_metadata_v3_MetadataKey*)_upb_msg_new(&envoy_type_metadata_v3_MetadataKey_msginit, arena);
+ if (!sub) return NULL;
+ envoy_config_route_v3_RateLimit_Action_MetaData_set_metadata_key(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_config_route_v3_RateLimit_Action_MetaData_set_default_value(envoy_config_route_v3_RateLimit_Action_MetaData *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 24), upb_strview) = value;
+}
+UPB_INLINE void envoy_config_route_v3_RateLimit_Action_MetaData_set_source(envoy_config_route_v3_RateLimit_Action_MetaData *msg, int32_t value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
+}
+
/* envoy.config.route.v3.RateLimit.Override */
UPB_INLINE envoy_config_route_v3_RateLimit_Override *envoy_config_route_v3_RateLimit_Override_new(upb_arena *arena) {
#include "upb/msg.h"
#include "envoy/config/trace/v3/http_tracer.upb.h"
#include "google/protobuf/any.upb.h"
-#include "google/protobuf/struct.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "validate/validate.upb.h"
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/clusters/aggregate/v3/cluster.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "envoy/extensions/clusters/aggregate/v3/cluster.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "udpa/annotations/versioning.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout_field envoy_extensions_clusters_aggregate_v3_ClusterConfig__fields[1] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 9, 3},
+};
+
+const upb_msglayout envoy_extensions_clusters_aggregate_v3_ClusterConfig_msginit = {
+ NULL,
+ &envoy_extensions_clusters_aggregate_v3_ClusterConfig__fields[0],
+ UPB_SIZE(8, 8), 1, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/clusters/aggregate/v3/cluster.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_EXTENSIONS_CLUSTERS_AGGREGATE_V3_CLUSTER_PROTO_UPB_H_
+#define ENVOY_EXTENSIONS_CLUSTERS_AGGREGATE_V3_CLUSTER_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct envoy_extensions_clusters_aggregate_v3_ClusterConfig;
+typedef struct envoy_extensions_clusters_aggregate_v3_ClusterConfig envoy_extensions_clusters_aggregate_v3_ClusterConfig;
+extern const upb_msglayout envoy_extensions_clusters_aggregate_v3_ClusterConfig_msginit;
+
+
+/* envoy.extensions.clusters.aggregate.v3.ClusterConfig */
+
+UPB_INLINE envoy_extensions_clusters_aggregate_v3_ClusterConfig *envoy_extensions_clusters_aggregate_v3_ClusterConfig_new(upb_arena *arena) {
+ return (envoy_extensions_clusters_aggregate_v3_ClusterConfig *)_upb_msg_new(&envoy_extensions_clusters_aggregate_v3_ClusterConfig_msginit, arena);
+}
+UPB_INLINE envoy_extensions_clusters_aggregate_v3_ClusterConfig *envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig *ret = envoy_extensions_clusters_aggregate_v3_ClusterConfig_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_extensions_clusters_aggregate_v3_ClusterConfig_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_extensions_clusters_aggregate_v3_ClusterConfig *envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig *ret = envoy_extensions_clusters_aggregate_v3_ClusterConfig_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_extensions_clusters_aggregate_v3_ClusterConfig_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_extensions_clusters_aggregate_v3_ClusterConfig_serialize(const envoy_extensions_clusters_aggregate_v3_ClusterConfig *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_extensions_clusters_aggregate_v3_ClusterConfig_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview const* envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(const envoy_extensions_clusters_aggregate_v3_ClusterConfig *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); }
+
+UPB_INLINE upb_strview* envoy_extensions_clusters_aggregate_v3_ClusterConfig_mutable_clusters(envoy_extensions_clusters_aggregate_v3_ClusterConfig *msg, size_t *len) {
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len);
+}
+UPB_INLINE upb_strview* envoy_extensions_clusters_aggregate_v3_ClusterConfig_resize_clusters(envoy_extensions_clusters_aggregate_v3_ClusterConfig *msg, size_t len, upb_arena *arena) {
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(0, 0), len, UPB_SIZE(3, 4), arena);
+}
+UPB_INLINE bool envoy_extensions_clusters_aggregate_v3_ClusterConfig_add_clusters(envoy_extensions_clusters_aggregate_v3_ClusterConfig *msg, upb_strview val, upb_arena *arena) {
+ return _upb_array_append_accessor2(msg, UPB_SIZE(0, 0), UPB_SIZE(3, 4), &val,
+ arena);
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_EXTENSIONS_CLUSTERS_AGGREGATE_V3_CLUSTER_PROTO_UPB_H_ */
#include "envoy/type/v3/percent.upb.h"
#include "google/protobuf/any.upb.h"
#include "google/protobuf/duration.upb.h"
-#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
-#include "udpa/core/v1/resource_locator.upb.h"
-#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/migrate.upb.h"
#include "udpa/annotations/security.upb.h"
#include "udpa/annotations/status.upb.h"
&google_protobuf_UInt32Value_msginit,
};
-static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager__fields[38] = {
+static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager__fields[40] = {
{1, UPB_SIZE(4, 4), 0, 0, 14, 1},
{2, UPB_SIZE(28, 32), 0, 0, 9, 1},
- {3, UPB_SIZE(136, 248), UPB_SIZE(-141, -257), 11, 11, 1},
- {4, UPB_SIZE(136, 248), UPB_SIZE(-141, -257), 4, 11, 1},
- {5, UPB_SIZE(124, 224), 0, 9, 11, 3},
+ {3, UPB_SIZE(140, 256), UPB_SIZE(-145, -265), 11, 11, 1},
+ {4, UPB_SIZE(140, 256), UPB_SIZE(-145, -265), 4, 11, 1},
+ {5, UPB_SIZE(128, 232), 0, 9, 11, 3},
{6, UPB_SIZE(52, 80), 1, 14, 11, 1},
{7, UPB_SIZE(56, 88), 2, 7, 11, 1},
{8, UPB_SIZE(60, 96), 3, 1, 11, 1},
{9, UPB_SIZE(64, 104), 4, 2, 11, 1},
{10, UPB_SIZE(36, 48), 0, 0, 9, 1},
{12, UPB_SIZE(68, 112), 5, 15, 11, 1},
- {13, UPB_SIZE(128, 232), 0, 0, 11, 3},
+ {13, UPB_SIZE(132, 240), 0, 0, 11, 3},
{14, UPB_SIZE(72, 120), 6, 14, 11, 1},
{15, UPB_SIZE(76, 128), 7, 14, 11, 1},
{16, UPB_SIZE(8, 8), 0, 0, 14, 1},
{20, UPB_SIZE(21, 21), 0, 0, 8, 1},
{21, UPB_SIZE(22, 22), 0, 0, 8, 1},
{22, UPB_SIZE(44, 64), 0, 0, 9, 1},
- {23, UPB_SIZE(132, 240), 0, 8, 11, 3},
+ {23, UPB_SIZE(136, 248), 0, 8, 11, 3},
{24, UPB_SIZE(84, 144), 9, 15, 11, 1},
{25, UPB_SIZE(88, 152), 10, 5, 11, 1},
{26, UPB_SIZE(92, 160), 11, 15, 11, 1},
{28, UPB_SIZE(96, 168), 12, 15, 11, 1},
{29, UPB_SIZE(100, 176), 13, 16, 11, 1},
{30, UPB_SIZE(104, 184), 14, 14, 11, 1},
- {31, UPB_SIZE(136, 248), UPB_SIZE(-141, -257), 13, 11, 1},
+ {31, UPB_SIZE(140, 256), UPB_SIZE(-145, -265), 13, 11, 1},
{32, UPB_SIZE(23, 23), 0, 0, 8, 1},
{33, UPB_SIZE(24, 24), 0, 0, 8, 1},
{34, UPB_SIZE(12, 12), 0, 0, 14, 1},
{38, UPB_SIZE(116, 208), 17, 10, 11, 1},
{39, UPB_SIZE(26, 26), 0, 0, 8, 1},
{40, UPB_SIZE(120, 216), 18, 14, 11, 1},
+ {41, UPB_SIZE(124, 224), 19, 15, 11, 1},
+ {42, UPB_SIZE(148, 268), UPB_SIZE(-153, -273), 0, 8, 1},
};
const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_msginit = {
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_submsgs[0],
&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager__fields[0],
- UPB_SIZE(144, 272), 38, false, 255,
+ UPB_SIZE(160, 288), 40, false, 255,
};
static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_Tracing_submsgs[4] = {
UPB_SIZE(24, 48), 5, false, 255,
};
-static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_Rds_submsgs[2] = {
+static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_Rds_submsgs[1] = {
&envoy_config_core_v3_ConfigSource_msginit,
- &udpa_core_v1_ResourceLocator_msginit,
};
-static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_Rds__fields[3] = {
+static const upb_msglayout_field envoy_extensions_filters_network_http_connection_manager_v3_Rds__fields[2] = {
{1, UPB_SIZE(12, 24), 1, 0, 11, 1},
{2, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {3, UPB_SIZE(16, 32), 2, 1, 11, 1},
};
const upb_msglayout envoy_extensions_filters_network_http_connection_manager_v3_Rds_msginit = {
&envoy_extensions_filters_network_http_connection_manager_v3_Rds_submsgs[0],
&envoy_extensions_filters_network_http_connection_manager_v3_Rds__fields[0],
- UPB_SIZE(24, 48), 3, false, 255,
+ UPB_SIZE(16, 32), 2, false, 255,
};
static const upb_msglayout *const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRouteConfigurationsList_submsgs[1] = {
struct google_protobuf_BoolValue;
struct google_protobuf_Duration;
struct google_protobuf_UInt32Value;
-struct udpa_core_v1_ResourceLocator;
extern const upb_msglayout envoy_config_accesslog_v3_AccessLog_msginit;
extern const upb_msglayout envoy_config_accesslog_v3_AccessLogFilter_msginit;
extern const upb_msglayout envoy_config_core_v3_ConfigSource_msginit;
extern const upb_msglayout google_protobuf_BoolValue_msginit;
extern const upb_msglayout google_protobuf_Duration_msginit;
extern const upb_msglayout google_protobuf_UInt32Value_msginit;
-extern const upb_msglayout udpa_core_v1_ResourceLocator_msginit;
typedef enum {
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_AUTO = 0,
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_scoped_routes = 31,
envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_NOT_SET = 0
} envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases;
-UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_case(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* msg) { return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(140, 256), int32_t); }
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_case(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* msg) { return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(144, 264), int32_t); }
+
+typedef enum {
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_strip_any_host_port = 42,
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_NOT_SET = 0
+} envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_oneofcases;
+UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_oneofcases envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_case(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager* msg) { return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_port_mode_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(152, 272), int32_t); }
UPB_INLINE int32_t envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_codec_type(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stat_prefix(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 32), upb_strview); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_rds(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(140, 256)) == 3; }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_Rds* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_extensions_filters_network_http_connection_manager_v3_Rds*, UPB_SIZE(136, 248), UPB_SIZE(140, 256), 3, NULL); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(140, 256)) == 4; }
-UPB_INLINE const struct envoy_config_route_v3_RouteConfiguration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const struct envoy_config_route_v3_RouteConfiguration*, UPB_SIZE(136, 248), UPB_SIZE(140, 256), 4, NULL); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_http_filters(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(124, 224)); }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http_filters(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* const*)_upb_array_accessor(msg, UPB_SIZE(124, 224), len); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_rds(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(144, 264)) == 3; }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_Rds* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_extensions_filters_network_http_connection_manager_v3_Rds*, UPB_SIZE(140, 256), UPB_SIZE(144, 264), 3, NULL); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(144, 264)) == 4; }
+UPB_INLINE const struct envoy_config_route_v3_RouteConfiguration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const struct envoy_config_route_v3_RouteConfiguration*, UPB_SIZE(140, 256), UPB_SIZE(144, 264), 4, NULL); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_http_filters(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(128, 232)); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http_filters(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* const*)_upb_array_accessor(msg, UPB_SIZE(128, 232), len); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_add_user_agent(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_user_agent(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(52, 80), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_tracing(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 2); }
UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_server_name(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(36, 48), upb_strview); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_drain_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_drain_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(68, 112), const struct google_protobuf_Duration*); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_access_log(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(128, 232)); }
-UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_access_log(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(128, 232), len); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_access_log(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(132, 240)); }
+UPB_INLINE const struct envoy_config_accesslog_v3_AccessLog* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_access_log(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const struct envoy_config_accesslog_v3_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(132, 240), len); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_use_remote_address(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 6); }
UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_use_remote_address(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(72, 120), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_generate_request_id(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 7); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_represent_ipv4_remote_address_as_ipv4_mapped_ipv6(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(21, 21), bool); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_skip_xff_append(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(22, 22), bool); }
UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_via(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(44, 64), upb_strview); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_upgrade_configs(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(132, 240)); }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_upgrade_configs(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* const*)_upb_array_accessor(msg, UPB_SIZE(132, 240), len); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_upgrade_configs(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(136, 248)); }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* const* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_upgrade_configs(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) { return (const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* const*)_upb_array_accessor(msg, UPB_SIZE(136, 248), len); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_stream_idle_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 9); }
UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stream_idle_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(84, 144), const struct google_protobuf_Duration*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_internal_address_config(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 10); }
UPB_INLINE const struct google_protobuf_UInt32Value* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_max_request_headers_kb(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(100, 176), const struct google_protobuf_UInt32Value*); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_normalize_path(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 14); }
UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_normalize_path(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(104, 184), const struct google_protobuf_BoolValue*); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_scoped_routes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(140, 256)) == 31; }
-UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_scoped_routes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*, UPB_SIZE(136, 248), UPB_SIZE(140, 256), 31, NULL); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_scoped_routes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(144, 264)) == 31; }
+UPB_INLINE const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_scoped_routes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*, UPB_SIZE(140, 256), UPB_SIZE(144, 264), 31, NULL); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_preserve_external_request_id(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(23, 23), bool); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_merge_slashes(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 24), bool); }
UPB_INLINE int32_t envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_server_header_transformation(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 12), int32_t); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_matching_host_port(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(26, 26), bool); }
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_stream_error_on_invalid_http_message(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 18); }
UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_stream_error_on_invalid_http_message(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(120, 216), const struct google_protobuf_BoolValue*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_request_headers_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_hasbit(msg, 19); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_headers_timeout(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(124, 224), const struct google_protobuf_Duration*); }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_strip_any_host_port(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return _upb_getoneofcase(msg, UPB_SIZE(152, 272)) == 42; }
+UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_strip_any_host_port(const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(148, 268), UPB_SIZE(152, 272), 42, false); }
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_codec_type(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, int32_t value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
*UPB_PTR_AT(msg, UPB_SIZE(28, 32), upb_strview) = value;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_rds(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_Rds* value) {
- UPB_WRITE_ONEOF(msg, envoy_extensions_filters_network_http_connection_manager_v3_Rds*, UPB_SIZE(136, 248), value, UPB_SIZE(140, 256), 3);
+ UPB_WRITE_ONEOF(msg, envoy_extensions_filters_network_http_connection_manager_v3_Rds*, UPB_SIZE(140, 256), value, UPB_SIZE(144, 264), 3);
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_Rds* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_rds(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_Rds* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_Rds*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(msg);
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_route_config(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct envoy_config_route_v3_RouteConfiguration* value) {
- UPB_WRITE_ONEOF(msg, struct envoy_config_route_v3_RouteConfiguration*, UPB_SIZE(136, 248), value, UPB_SIZE(140, 256), 4);
+ UPB_WRITE_ONEOF(msg, struct envoy_config_route_v3_RouteConfiguration*, UPB_SIZE(140, 256), value, UPB_SIZE(144, 264), 4);
}
UPB_INLINE struct envoy_config_route_v3_RouteConfiguration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_route_config(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_config_route_v3_RouteConfiguration* sub = (struct envoy_config_route_v3_RouteConfiguration*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(msg);
return sub;
}
UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_http_filters(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) {
- return (envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(124, 224), len);
+ return (envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(128, 232), len);
}
UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_resize_http_filters(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t len, upb_arena *arena) {
- return (envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter**)_upb_array_resize_accessor2(msg, UPB_SIZE(124, 224), len, UPB_SIZE(2, 3), arena);
+ return (envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter**)_upb_array_resize_accessor2(msg, UPB_SIZE(128, 232), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_http_filters(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter*)_upb_msg_new(&envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(124, 224), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(128, 232), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
return sub;
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_access_log(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(128, 232), len);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(132, 240), len);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_resize_access_log(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(128, 232), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_accesslog_v3_AccessLog**)_upb_array_resize_accessor2(msg, UPB_SIZE(132, 240), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_accesslog_v3_AccessLog* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_access_log(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_config_accesslog_v3_AccessLog* sub = (struct envoy_config_accesslog_v3_AccessLog*)_upb_msg_new(&envoy_config_accesslog_v3_AccessLog_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(128, 232), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(132, 240), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
*UPB_PTR_AT(msg, UPB_SIZE(44, 64), upb_strview) = value;
}
UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_upgrade_configs(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t *len) {
- return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(132, 240), len);
+ return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(136, 248), len);
}
UPB_INLINE envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig** envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_resize_upgrade_configs(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, size_t len, upb_arena *arena) {
- return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig**)_upb_array_resize_accessor2(msg, UPB_SIZE(132, 240), len, UPB_SIZE(2, 3), arena);
+ return (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig**)_upb_array_resize_accessor2(msg, UPB_SIZE(136, 248), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_add_upgrade_configs(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig*)_upb_msg_new(&envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_UpgradeConfig_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(132, 240), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(136, 248), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
return sub;
}
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_scoped_routes(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* value) {
- UPB_WRITE_ONEOF(msg, envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*, UPB_SIZE(136, 248), value, UPB_SIZE(140, 256), 31);
+ UPB_WRITE_ONEOF(msg, envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*, UPB_SIZE(140, 256), value, UPB_SIZE(144, 264), 31);
}
UPB_INLINE struct envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_scoped_routes(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
struct envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes* sub = (struct envoy_extensions_filters_network_http_connection_manager_v3_ScopedRoutes*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_scoped_routes(msg);
}
return sub;
}
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_request_headers_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, struct google_protobuf_Duration* value) {
+ _upb_sethas(msg, 19);
+ *UPB_PTR_AT(msg, UPB_SIZE(124, 224), struct google_protobuf_Duration*) = value;
+}
+UPB_INLINE struct google_protobuf_Duration* envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_mutable_request_headers_timeout(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, upb_arena *arena) {
+ struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_request_headers_timeout(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Duration*)_upb_msg_new(&google_protobuf_Duration_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_request_headers_timeout(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_set_strip_any_host_port(envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager *msg, bool value) {
+ UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(148, 268), value, UPB_SIZE(152, 272), 42);
+}
/* envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager.Tracing */
UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_Rds_has_config_source(const envoy_extensions_filters_network_http_connection_manager_v3_Rds *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct envoy_config_core_v3_ConfigSource* envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(const envoy_extensions_filters_network_http_connection_manager_v3_Rds *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct envoy_config_core_v3_ConfigSource*); }
UPB_INLINE upb_strview envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(const envoy_extensions_filters_network_http_connection_manager_v3_Rds *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
-UPB_INLINE bool envoy_extensions_filters_network_http_connection_manager_v3_Rds_has_rds_resource_locator(const envoy_extensions_filters_network_http_connection_manager_v3_Rds *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const struct udpa_core_v1_ResourceLocator* envoy_extensions_filters_network_http_connection_manager_v3_Rds_rds_resource_locator(const envoy_extensions_filters_network_http_connection_manager_v3_Rds *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const struct udpa_core_v1_ResourceLocator*); }
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_Rds_set_config_source(envoy_extensions_filters_network_http_connection_manager_v3_Rds *msg, struct envoy_config_core_v3_ConfigSource* value) {
_upb_sethas(msg, 1);
UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_Rds_set_route_config_name(envoy_extensions_filters_network_http_connection_manager_v3_Rds *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
}
-UPB_INLINE void envoy_extensions_filters_network_http_connection_manager_v3_Rds_set_rds_resource_locator(envoy_extensions_filters_network_http_connection_manager_v3_Rds *msg, struct udpa_core_v1_ResourceLocator* value) {
- _upb_sethas(msg, 2);
- *UPB_PTR_AT(msg, UPB_SIZE(16, 32), struct udpa_core_v1_ResourceLocator*) = value;
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator* envoy_extensions_filters_network_http_connection_manager_v3_Rds_mutable_rds_resource_locator(envoy_extensions_filters_network_http_connection_manager_v3_Rds *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceLocator* sub = (struct udpa_core_v1_ResourceLocator*)envoy_extensions_filters_network_http_connection_manager_v3_Rds_rds_resource_locator(msg);
- if (sub == NULL) {
- sub = (struct udpa_core_v1_ResourceLocator*)_upb_msg_new(&udpa_core_v1_ResourceLocator_msginit, arena);
- if (!sub) return NULL;
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_set_rds_resource_locator(msg, sub);
- }
- return sub;
-}
/* envoy.extensions.filters.network.http_connection_manager.v3.ScopedRouteConfigurationsList */
#include <stddef.h>
#include "upb/msg.h"
#include "envoy/extensions/transport_sockets/tls/v3/cert.upb.h"
-#include "udpa/annotations/status.upb.h"
#include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
#include "envoy/extensions/transport_sockets/tls/v3/secret.upb.h"
#include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
#include "envoy/config/core/v3/base.upb.h"
#include "envoy/type/matcher/v3/string.upb.h"
#include "google/protobuf/any.upb.h"
-#include "google/protobuf/struct.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "udpa/annotations/sensitive.upb.h"
#include "udpa/annotations/status.upb.h"
UPB_SIZE(16, 32), 2, false, 255,
};
-static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_TlsCertificate_submsgs[2] = {
+static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_TlsCertificate_submsgs[3] = {
&envoy_config_core_v3_DataSource_msginit,
+ &envoy_config_core_v3_WatchedDirectory_msginit,
&envoy_extensions_transport_sockets_tls_v3_PrivateKeyProvider_msginit,
};
-static const upb_msglayout_field envoy_extensions_transport_sockets_tls_v3_TlsCertificate__fields[6] = {
+static const upb_msglayout_field envoy_extensions_transport_sockets_tls_v3_TlsCertificate__fields[7] = {
{1, UPB_SIZE(4, 8), 1, 0, 11, 1},
{2, UPB_SIZE(8, 16), 2, 0, 11, 1},
{3, UPB_SIZE(12, 24), 3, 0, 11, 1},
{4, UPB_SIZE(16, 32), 4, 0, 11, 1},
- {5, UPB_SIZE(24, 48), 0, 0, 11, 3},
- {6, UPB_SIZE(20, 40), 5, 1, 11, 1},
+ {5, UPB_SIZE(28, 56), 0, 0, 11, 3},
+ {6, UPB_SIZE(20, 40), 5, 2, 11, 1},
+ {7, UPB_SIZE(24, 48), 6, 1, 11, 1},
};
const upb_msglayout envoy_extensions_transport_sockets_tls_v3_TlsCertificate_msginit = {
&envoy_extensions_transport_sockets_tls_v3_TlsCertificate_submsgs[0],
&envoy_extensions_transport_sockets_tls_v3_TlsCertificate__fields[0],
- UPB_SIZE(32, 56), 6, false, 255,
+ UPB_SIZE(32, 64), 7, false, 255,
};
static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_TlsSessionTicketKeys_submsgs[1] = {
UPB_SIZE(8, 8), 1, false, 255,
};
-static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_submsgs[3] = {
+static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_submsgs[4] = {
&envoy_config_core_v3_DataSource_msginit,
+ &envoy_config_core_v3_WatchedDirectory_msginit,
&envoy_type_matcher_v3_StringMatcher_msginit,
&google_protobuf_BoolValue_msginit,
};
-static const upb_msglayout_field envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext__fields[8] = {
+static const upb_msglayout_field envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext__fields[9] = {
{1, UPB_SIZE(12, 16), 1, 0, 11, 1},
- {2, UPB_SIZE(24, 40), 0, 0, 9, 3},
- {3, UPB_SIZE(28, 48), 0, 0, 9, 3},
- {6, UPB_SIZE(16, 24), 2, 2, 11, 1},
+ {2, UPB_SIZE(28, 48), 0, 0, 9, 3},
+ {3, UPB_SIZE(32, 56), 0, 0, 9, 3},
+ {6, UPB_SIZE(16, 24), 2, 3, 11, 1},
{7, UPB_SIZE(20, 32), 3, 0, 11, 1},
{8, UPB_SIZE(8, 8), 0, 0, 8, 1},
- {9, UPB_SIZE(32, 56), 0, 1, 11, 3},
+ {9, UPB_SIZE(36, 64), 0, 2, 11, 3},
{10, UPB_SIZE(4, 4), 0, 0, 14, 1},
+ {11, UPB_SIZE(24, 40), 4, 1, 11, 1},
};
const upb_msglayout envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_msginit = {
&envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_submsgs[0],
&envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext__fields[0],
- UPB_SIZE(40, 64), 8, false, 255,
+ UPB_SIZE(40, 72), 9, false, 255,
};
#include "upb/port_undef.inc"
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_TlsSessionTicketKeys_msginit;
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_msginit;
struct envoy_config_core_v3_DataSource;
+struct envoy_config_core_v3_WatchedDirectory;
struct envoy_type_matcher_v3_StringMatcher;
struct google_protobuf_Any;
struct google_protobuf_BoolValue;
extern const upb_msglayout envoy_config_core_v3_DataSource_msginit;
+extern const upb_msglayout envoy_config_core_v3_WatchedDirectory_msginit;
extern const upb_msglayout envoy_type_matcher_v3_StringMatcher_msginit;
extern const upb_msglayout google_protobuf_Any_msginit;
extern const upb_msglayout google_protobuf_BoolValue_msginit;
UPB_INLINE const struct envoy_config_core_v3_DataSource* envoy_extensions_transport_sockets_tls_v3_TlsCertificate_password(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct envoy_config_core_v3_DataSource*); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_TlsCertificate_has_ocsp_staple(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg) { return _upb_hasbit(msg, 4); }
UPB_INLINE const struct envoy_config_core_v3_DataSource* envoy_extensions_transport_sockets_tls_v3_TlsCertificate_ocsp_staple(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const struct envoy_config_core_v3_DataSource*); }
-UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_TlsCertificate_has_signed_certificate_timestamp(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(24, 48)); }
-UPB_INLINE const struct envoy_config_core_v3_DataSource* const* envoy_extensions_transport_sockets_tls_v3_TlsCertificate_signed_certificate_timestamp(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg, size_t *len) { return (const struct envoy_config_core_v3_DataSource* const*)_upb_array_accessor(msg, UPB_SIZE(24, 48), len); }
+UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_TlsCertificate_has_signed_certificate_timestamp(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(28, 56)); }
+UPB_INLINE const struct envoy_config_core_v3_DataSource* const* envoy_extensions_transport_sockets_tls_v3_TlsCertificate_signed_certificate_timestamp(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg, size_t *len) { return (const struct envoy_config_core_v3_DataSource* const*)_upb_array_accessor(msg, UPB_SIZE(28, 56), len); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_TlsCertificate_has_private_key_provider(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg) { return _upb_hasbit(msg, 5); }
UPB_INLINE const envoy_extensions_transport_sockets_tls_v3_PrivateKeyProvider* envoy_extensions_transport_sockets_tls_v3_TlsCertificate_private_key_provider(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), const envoy_extensions_transport_sockets_tls_v3_PrivateKeyProvider*); }
+UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_TlsCertificate_has_watched_directory(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg) { return _upb_hasbit(msg, 6); }
+UPB_INLINE const struct envoy_config_core_v3_WatchedDirectory* envoy_extensions_transport_sockets_tls_v3_TlsCertificate_watched_directory(const envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 48), const struct envoy_config_core_v3_WatchedDirectory*); }
UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_TlsCertificate_set_certificate_chain(envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg, struct envoy_config_core_v3_DataSource* value) {
_upb_sethas(msg, 1);
return sub;
}
UPB_INLINE struct envoy_config_core_v3_DataSource** envoy_extensions_transport_sockets_tls_v3_TlsCertificate_mutable_signed_certificate_timestamp(envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg, size_t *len) {
- return (struct envoy_config_core_v3_DataSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 48), len);
+ return (struct envoy_config_core_v3_DataSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 56), len);
}
UPB_INLINE struct envoy_config_core_v3_DataSource** envoy_extensions_transport_sockets_tls_v3_TlsCertificate_resize_signed_certificate_timestamp(envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg, size_t len, upb_arena *arena) {
- return (struct envoy_config_core_v3_DataSource**)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 48), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_config_core_v3_DataSource**)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 56), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_config_core_v3_DataSource* envoy_extensions_transport_sockets_tls_v3_TlsCertificate_add_signed_certificate_timestamp(envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg, upb_arena *arena) {
struct envoy_config_core_v3_DataSource* sub = (struct envoy_config_core_v3_DataSource*)_upb_msg_new(&envoy_config_core_v3_DataSource_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(24, 48), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(28, 56), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
}
return sub;
}
+UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_TlsCertificate_set_watched_directory(envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg, struct envoy_config_core_v3_WatchedDirectory* value) {
+ _upb_sethas(msg, 6);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 48), struct envoy_config_core_v3_WatchedDirectory*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_WatchedDirectory* envoy_extensions_transport_sockets_tls_v3_TlsCertificate_mutable_watched_directory(envoy_extensions_transport_sockets_tls_v3_TlsCertificate *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_WatchedDirectory* sub = (struct envoy_config_core_v3_WatchedDirectory*)envoy_extensions_transport_sockets_tls_v3_TlsCertificate_watched_directory(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_WatchedDirectory*)_upb_msg_new(&envoy_config_core_v3_WatchedDirectory_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_transport_sockets_tls_v3_TlsCertificate_set_watched_directory(msg, sub);
+ }
+ return sub;
+}
/* envoy.extensions.transport_sockets.tls.v3.TlsSessionTicketKeys */
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_trusted_ca(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct envoy_config_core_v3_DataSource* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_trusted_ca(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 16), const struct envoy_config_core_v3_DataSource*); }
-UPB_INLINE upb_strview const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_hash(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(24, 40), len); }
-UPB_INLINE upb_strview const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_spki(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(28, 48), len); }
+UPB_INLINE upb_strview const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_hash(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(28, 48), len); }
+UPB_INLINE upb_strview const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_verify_certificate_spki(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(32, 56), len); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_require_signed_certificate_timestamp(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_hasbit(msg, 2); }
UPB_INLINE const struct google_protobuf_BoolValue* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_require_signed_certificate_timestamp(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 24), const struct google_protobuf_BoolValue*); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_crl(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_hasbit(msg, 3); }
UPB_INLINE const struct envoy_config_core_v3_DataSource* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_crl(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 32), const struct envoy_config_core_v3_DataSource*); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_allow_expired_certificate(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 8), bool); }
-UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_match_subject_alt_names(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(32, 56)); }
-UPB_INLINE const struct envoy_type_matcher_v3_StringMatcher* const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_match_subject_alt_names(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (const struct envoy_type_matcher_v3_StringMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(32, 56), len); }
+UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_match_subject_alt_names(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(36, 64)); }
+UPB_INLINE const struct envoy_type_matcher_v3_StringMatcher* const* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_match_subject_alt_names(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) { return (const struct envoy_type_matcher_v3_StringMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(36, 64), len); }
UPB_INLINE int32_t envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_trust_chain_verification(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t); }
+UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_has_watched_directory(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return _upb_hasbit(msg, 4); }
+UPB_INLINE const struct envoy_config_core_v3_WatchedDirectory* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_watched_directory(const envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 40), const struct envoy_config_core_v3_WatchedDirectory*); }
UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_set_trusted_ca(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, struct envoy_config_core_v3_DataSource* value) {
_upb_sethas(msg, 1);
return sub;
}
UPB_INLINE upb_strview* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_mutable_verify_certificate_hash(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 40), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 48), len);
}
UPB_INLINE upb_strview* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_resize_verify_certificate_hash(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 40), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 48), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_add_verify_certificate_hash(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(24, 40), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(28, 48), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE upb_strview* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_mutable_verify_certificate_spki(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 48), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 56), len);
}
UPB_INLINE upb_strview* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_resize_verify_certificate_spki(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 48), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 56), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_add_verify_certificate_spki(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 48), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(32, 56), UPB_SIZE(3, 4), &val,
arena);
}
UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_set_require_signed_certificate_timestamp(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, struct google_protobuf_BoolValue* value) {
*UPB_PTR_AT(msg, UPB_SIZE(8, 8), bool) = value;
}
UPB_INLINE struct envoy_type_matcher_v3_StringMatcher** envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_mutable_match_subject_alt_names(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t *len) {
- return (struct envoy_type_matcher_v3_StringMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 56), len);
+ return (struct envoy_type_matcher_v3_StringMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 64), len);
}
UPB_INLINE struct envoy_type_matcher_v3_StringMatcher** envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_resize_match_subject_alt_names(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, size_t len, upb_arena *arena) {
- return (struct envoy_type_matcher_v3_StringMatcher**)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 56), len, UPB_SIZE(2, 3), arena);
+ return (struct envoy_type_matcher_v3_StringMatcher**)_upb_array_resize_accessor2(msg, UPB_SIZE(36, 64), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_type_matcher_v3_StringMatcher* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_add_match_subject_alt_names(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, upb_arena *arena) {
struct envoy_type_matcher_v3_StringMatcher* sub = (struct envoy_type_matcher_v3_StringMatcher*)_upb_msg_new(&envoy_type_matcher_v3_StringMatcher_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(32, 56), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(36, 64), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_set_trust_chain_verification(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, int32_t value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 4), int32_t) = value;
}
+UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_set_watched_directory(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, struct envoy_config_core_v3_WatchedDirectory* value) {
+ _upb_sethas(msg, 4);
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 40), struct envoy_config_core_v3_WatchedDirectory*) = value;
+}
+UPB_INLINE struct envoy_config_core_v3_WatchedDirectory* envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_mutable_watched_directory(envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_WatchedDirectory* sub = (struct envoy_config_core_v3_WatchedDirectory*)envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_watched_directory(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_WatchedDirectory*)_upb_msg_new(&envoy_config_core_v3_WatchedDirectory_msginit, arena);
+ if (!sub) return NULL;
+ envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_set_watched_directory(msg, sub);
+ }
+ return sub;
+}
#ifdef __cplusplus
} /* extern "C" */
#include "envoy/config/core/v3/base.upb.h"
#include "envoy/config/core/v3/config_source.upb.h"
#include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
-#include "udpa/core/v1/resource_locator.upb.h"
-#include "udpa/annotations/migrate.upb.h"
#include "udpa/annotations/sensitive.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
+#include "validate/validate.upb.h"
#include "upb/port_def.inc"
UPB_SIZE(8, 16), 1, false, 255,
};
-static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_submsgs[2] = {
+static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_submsgs[1] = {
&envoy_config_core_v3_ConfigSource_msginit,
- &udpa_core_v1_ResourceLocator_msginit,
};
-static const upb_msglayout_field envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig__fields[3] = {
+static const upb_msglayout_field envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig__fields[2] = {
{1, UPB_SIZE(4, 8), 0, 0, 9, 1},
{2, UPB_SIZE(12, 24), 1, 0, 11, 1},
- {3, UPB_SIZE(16, 32), 2, 1, 11, 1},
};
const upb_msglayout envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_msginit = {
&envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_submsgs[0],
&envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig__fields[0],
- UPB_SIZE(24, 48), 3, false, 255,
+ UPB_SIZE(16, 32), 2, false, 255,
};
static const upb_msglayout *const envoy_extensions_transport_sockets_tls_v3_Secret_submsgs[4] = {
struct envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext;
struct envoy_extensions_transport_sockets_tls_v3_TlsCertificate;
struct envoy_extensions_transport_sockets_tls_v3_TlsSessionTicketKeys;
-struct udpa_core_v1_ResourceLocator;
extern const upb_msglayout envoy_config_core_v3_ConfigSource_msginit;
extern const upb_msglayout envoy_config_core_v3_DataSource_msginit;
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_msginit;
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_TlsCertificate_msginit;
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_TlsSessionTicketKeys_msginit;
-extern const upb_msglayout udpa_core_v1_ResourceLocator_msginit;
/* envoy.extensions.transport_sockets.tls.v3.GenericSecret */
UPB_INLINE upb_strview envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_name(const envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_has_sds_config(const envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct envoy_config_core_v3_ConfigSource* envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_sds_config(const envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct envoy_config_core_v3_ConfigSource*); }
-UPB_INLINE bool envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_has_sds_resource_locator(const envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const struct udpa_core_v1_ResourceLocator* envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_sds_resource_locator(const envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const struct udpa_core_v1_ResourceLocator*); }
UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_set_name(envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
}
return sub;
}
-UPB_INLINE void envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_set_sds_resource_locator(envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig *msg, struct udpa_core_v1_ResourceLocator* value) {
- _upb_sethas(msg, 2);
- *UPB_PTR_AT(msg, UPB_SIZE(16, 32), struct udpa_core_v1_ResourceLocator*) = value;
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator* envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_mutable_sds_resource_locator(envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceLocator* sub = (struct udpa_core_v1_ResourceLocator*)envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_sds_resource_locator(msg);
- if (sub == NULL) {
- sub = (struct udpa_core_v1_ResourceLocator*)_upb_msg_new(&udpa_core_v1_ResourceLocator_msginit, arena);
- if (!sub) return NULL;
- envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_set_sds_resource_locator(msg, sub);
- }
- return sub;
-}
/* envoy.extensions.transport_sockets.tls.v3.Secret */
#include "envoy/config/core/v3/extension.upb.h"
#include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
#include "envoy/extensions/transport_sockets/tls/v3/secret.upb.h"
-#include "google/protobuf/any.upb.h"
#include "google/protobuf/duration.upb.h"
#include "google/protobuf/wrappers.upb.h"
#include "udpa/annotations/migrate.upb.h"
#include "envoy/service/discovery/v3/discovery.upb.h"
#include "envoy/config/core/v3/base.upb.h"
#include "google/protobuf/any.upb.h"
+#include "google/protobuf/duration.upb.h"
#include "google/rpc/status.upb.h"
-#include "udpa/core/v1/resource_locator.upb.h"
-#include "udpa/core/v1/resource_name.upb.h"
-#include "udpa/annotations/migrate.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
UPB_SIZE(40, 80), 6, false, 255,
};
-static const upb_msglayout *const envoy_service_discovery_v3_DeltaDiscoveryRequest_submsgs[4] = {
+static const upb_msglayout *const envoy_service_discovery_v3_DeltaDiscoveryRequest_submsgs[3] = {
&envoy_config_core_v3_Node_msginit,
&envoy_service_discovery_v3_DeltaDiscoveryRequest_InitialResourceVersionsEntry_msginit,
&google_rpc_Status_msginit,
- &udpa_core_v1_ResourceLocator_msginit,
};
-static const upb_msglayout_field envoy_service_discovery_v3_DeltaDiscoveryRequest__fields[9] = {
+static const upb_msglayout_field envoy_service_discovery_v3_DeltaDiscoveryRequest__fields[7] = {
{1, UPB_SIZE(20, 40), 1, 0, 11, 1},
{2, UPB_SIZE(4, 8), 0, 0, 9, 1},
{3, UPB_SIZE(28, 56), 0, 0, 9, 3},
{5, UPB_SIZE(36, 72), 0, 1, 11, _UPB_LABEL_MAP},
{6, UPB_SIZE(12, 24), 0, 0, 9, 1},
{7, UPB_SIZE(24, 48), 2, 2, 11, 1},
- {8, UPB_SIZE(40, 80), 0, 3, 11, 3},
- {9, UPB_SIZE(44, 88), 0, 3, 11, 3},
};
const upb_msglayout envoy_service_discovery_v3_DeltaDiscoveryRequest_msginit = {
&envoy_service_discovery_v3_DeltaDiscoveryRequest_submsgs[0],
&envoy_service_discovery_v3_DeltaDiscoveryRequest__fields[0],
- UPB_SIZE(48, 96), 9, false, 255,
+ UPB_SIZE(40, 80), 7, false, 255,
};
static const upb_msglayout_field envoy_service_discovery_v3_DeltaDiscoveryRequest_InitialResourceVersionsEntry__fields[2] = {
};
static const upb_msglayout *const envoy_service_discovery_v3_DeltaDiscoveryResponse_submsgs[2] = {
+ &envoy_config_core_v3_ControlPlane_msginit,
&envoy_service_discovery_v3_Resource_msginit,
- &udpa_core_v1_ResourceName_msginit,
};
static const upb_msglayout_field envoy_service_discovery_v3_DeltaDiscoveryResponse__fields[6] = {
- {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
- {2, UPB_SIZE(24, 48), 0, 0, 11, 3},
- {4, UPB_SIZE(8, 16), 0, 0, 9, 1},
- {5, UPB_SIZE(16, 32), 0, 0, 9, 1},
- {6, UPB_SIZE(28, 56), 0, 0, 9, 3},
- {7, UPB_SIZE(32, 64), 0, 1, 11, 3},
+ {1, UPB_SIZE(4, 8), 0, 0, 9, 1},
+ {2, UPB_SIZE(32, 64), 0, 1, 11, 3},
+ {4, UPB_SIZE(12, 24), 0, 0, 9, 1},
+ {5, UPB_SIZE(20, 40), 0, 0, 9, 1},
+ {6, UPB_SIZE(36, 72), 0, 0, 9, 3},
+ {7, UPB_SIZE(28, 56), 1, 0, 11, 1},
};
const upb_msglayout envoy_service_discovery_v3_DeltaDiscoveryResponse_msginit = {
UPB_SIZE(40, 80), 6, false, 255,
};
-static const upb_msglayout *const envoy_service_discovery_v3_Resource_submsgs[2] = {
+static const upb_msglayout *const envoy_service_discovery_v3_Resource_submsgs[3] = {
+ &envoy_service_discovery_v3_Resource_CacheControl_msginit,
&google_protobuf_Any_msginit,
- &udpa_core_v1_ResourceName_msginit,
+ &google_protobuf_Duration_msginit,
};
-static const upb_msglayout_field envoy_service_discovery_v3_Resource__fields[5] = {
+static const upb_msglayout_field envoy_service_discovery_v3_Resource__fields[6] = {
{1, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {2, UPB_SIZE(20, 40), 1, 0, 11, 1},
+ {2, UPB_SIZE(20, 40), 1, 1, 11, 1},
{3, UPB_SIZE(12, 24), 0, 0, 9, 1},
- {4, UPB_SIZE(28, 56), 0, 0, 9, 3},
- {5, UPB_SIZE(24, 48), 2, 1, 11, 1},
+ {4, UPB_SIZE(32, 64), 0, 0, 9, 3},
+ {6, UPB_SIZE(24, 48), 2, 2, 11, 1},
+ {7, UPB_SIZE(28, 56), 3, 0, 11, 1},
};
const upb_msglayout envoy_service_discovery_v3_Resource_msginit = {
&envoy_service_discovery_v3_Resource_submsgs[0],
&envoy_service_discovery_v3_Resource__fields[0],
- UPB_SIZE(32, 64), 5, false, 255,
+ UPB_SIZE(40, 80), 6, false, 255,
+};
+
+static const upb_msglayout_field envoy_service_discovery_v3_Resource_CacheControl__fields[1] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 8, 1},
+};
+
+const upb_msglayout envoy_service_discovery_v3_Resource_CacheControl_msginit = {
+ NULL,
+ &envoy_service_discovery_v3_Resource_CacheControl__fields[0],
+ UPB_SIZE(8, 8), 1, false, 255,
};
#include "upb/port_undef.inc"
struct envoy_service_discovery_v3_DeltaDiscoveryRequest_InitialResourceVersionsEntry;
struct envoy_service_discovery_v3_DeltaDiscoveryResponse;
struct envoy_service_discovery_v3_Resource;
+struct envoy_service_discovery_v3_Resource_CacheControl;
typedef struct envoy_service_discovery_v3_DiscoveryRequest envoy_service_discovery_v3_DiscoveryRequest;
typedef struct envoy_service_discovery_v3_DiscoveryResponse envoy_service_discovery_v3_DiscoveryResponse;
typedef struct envoy_service_discovery_v3_DeltaDiscoveryRequest envoy_service_discovery_v3_DeltaDiscoveryRequest;
typedef struct envoy_service_discovery_v3_DeltaDiscoveryRequest_InitialResourceVersionsEntry envoy_service_discovery_v3_DeltaDiscoveryRequest_InitialResourceVersionsEntry;
typedef struct envoy_service_discovery_v3_DeltaDiscoveryResponse envoy_service_discovery_v3_DeltaDiscoveryResponse;
typedef struct envoy_service_discovery_v3_Resource envoy_service_discovery_v3_Resource;
+typedef struct envoy_service_discovery_v3_Resource_CacheControl envoy_service_discovery_v3_Resource_CacheControl;
extern const upb_msglayout envoy_service_discovery_v3_DiscoveryRequest_msginit;
extern const upb_msglayout envoy_service_discovery_v3_DiscoveryResponse_msginit;
extern const upb_msglayout envoy_service_discovery_v3_DeltaDiscoveryRequest_msginit;
extern const upb_msglayout envoy_service_discovery_v3_DeltaDiscoveryRequest_InitialResourceVersionsEntry_msginit;
extern const upb_msglayout envoy_service_discovery_v3_DeltaDiscoveryResponse_msginit;
extern const upb_msglayout envoy_service_discovery_v3_Resource_msginit;
+extern const upb_msglayout envoy_service_discovery_v3_Resource_CacheControl_msginit;
struct envoy_config_core_v3_ControlPlane;
struct envoy_config_core_v3_Node;
struct google_protobuf_Any;
+struct google_protobuf_Duration;
struct google_rpc_Status;
-struct udpa_core_v1_ResourceLocator;
-struct udpa_core_v1_ResourceName;
extern const upb_msglayout envoy_config_core_v3_ControlPlane_msginit;
extern const upb_msglayout envoy_config_core_v3_Node_msginit;
extern const upb_msglayout google_protobuf_Any_msginit;
+extern const upb_msglayout google_protobuf_Duration_msginit;
extern const upb_msglayout google_rpc_Status_msginit;
-extern const upb_msglayout udpa_core_v1_ResourceLocator_msginit;
-extern const upb_msglayout udpa_core_v1_ResourceName_msginit;
/* envoy.service.discovery.v3.DiscoveryRequest */
UPB_INLINE upb_strview envoy_service_discovery_v3_DeltaDiscoveryRequest_response_nonce(const envoy_service_discovery_v3_DeltaDiscoveryRequest *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
UPB_INLINE bool envoy_service_discovery_v3_DeltaDiscoveryRequest_has_error_detail(const envoy_service_discovery_v3_DeltaDiscoveryRequest *msg) { return _upb_hasbit(msg, 2); }
UPB_INLINE const struct google_rpc_Status* envoy_service_discovery_v3_DeltaDiscoveryRequest_error_detail(const envoy_service_discovery_v3_DeltaDiscoveryRequest *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 48), const struct google_rpc_Status*); }
-UPB_INLINE bool envoy_service_discovery_v3_DeltaDiscoveryRequest_has_udpa_resources_subscribe(const envoy_service_discovery_v3_DeltaDiscoveryRequest *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(40, 80)); }
-UPB_INLINE const struct udpa_core_v1_ResourceLocator* const* envoy_service_discovery_v3_DeltaDiscoveryRequest_udpa_resources_subscribe(const envoy_service_discovery_v3_DeltaDiscoveryRequest *msg, size_t *len) { return (const struct udpa_core_v1_ResourceLocator* const*)_upb_array_accessor(msg, UPB_SIZE(40, 80), len); }
-UPB_INLINE bool envoy_service_discovery_v3_DeltaDiscoveryRequest_has_udpa_resources_unsubscribe(const envoy_service_discovery_v3_DeltaDiscoveryRequest *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(44, 88)); }
-UPB_INLINE const struct udpa_core_v1_ResourceLocator* const* envoy_service_discovery_v3_DeltaDiscoveryRequest_udpa_resources_unsubscribe(const envoy_service_discovery_v3_DeltaDiscoveryRequest *msg, size_t *len) { return (const struct udpa_core_v1_ResourceLocator* const*)_upb_array_accessor(msg, UPB_SIZE(44, 88), len); }
UPB_INLINE void envoy_service_discovery_v3_DeltaDiscoveryRequest_set_node(envoy_service_discovery_v3_DeltaDiscoveryRequest *msg, struct envoy_config_core_v3_Node* value) {
_upb_sethas(msg, 1);
}
return sub;
}
-UPB_INLINE struct udpa_core_v1_ResourceLocator** envoy_service_discovery_v3_DeltaDiscoveryRequest_mutable_udpa_resources_subscribe(envoy_service_discovery_v3_DeltaDiscoveryRequest *msg, size_t *len) {
- return (struct udpa_core_v1_ResourceLocator**)_upb_array_mutable_accessor(msg, UPB_SIZE(40, 80), len);
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator** envoy_service_discovery_v3_DeltaDiscoveryRequest_resize_udpa_resources_subscribe(envoy_service_discovery_v3_DeltaDiscoveryRequest *msg, size_t len, upb_arena *arena) {
- return (struct udpa_core_v1_ResourceLocator**)_upb_array_resize_accessor2(msg, UPB_SIZE(40, 80), len, UPB_SIZE(2, 3), arena);
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator* envoy_service_discovery_v3_DeltaDiscoveryRequest_add_udpa_resources_subscribe(envoy_service_discovery_v3_DeltaDiscoveryRequest *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceLocator* sub = (struct udpa_core_v1_ResourceLocator*)_upb_msg_new(&udpa_core_v1_ResourceLocator_msginit, arena);
- bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(40, 80), UPB_SIZE(2, 3), &sub, arena);
- if (!ok) return NULL;
- return sub;
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator** envoy_service_discovery_v3_DeltaDiscoveryRequest_mutable_udpa_resources_unsubscribe(envoy_service_discovery_v3_DeltaDiscoveryRequest *msg, size_t *len) {
- return (struct udpa_core_v1_ResourceLocator**)_upb_array_mutable_accessor(msg, UPB_SIZE(44, 88), len);
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator** envoy_service_discovery_v3_DeltaDiscoveryRequest_resize_udpa_resources_unsubscribe(envoy_service_discovery_v3_DeltaDiscoveryRequest *msg, size_t len, upb_arena *arena) {
- return (struct udpa_core_v1_ResourceLocator**)_upb_array_resize_accessor2(msg, UPB_SIZE(44, 88), len, UPB_SIZE(2, 3), arena);
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator* envoy_service_discovery_v3_DeltaDiscoveryRequest_add_udpa_resources_unsubscribe(envoy_service_discovery_v3_DeltaDiscoveryRequest *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceLocator* sub = (struct udpa_core_v1_ResourceLocator*)_upb_msg_new(&udpa_core_v1_ResourceLocator_msginit, arena);
- bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(44, 88), UPB_SIZE(2, 3), &sub, arena);
- if (!ok) return NULL;
- return sub;
-}
/* envoy.service.discovery.v3.DeltaDiscoveryRequest.InitialResourceVersionsEntry */
return upb_encode(msg, &envoy_service_discovery_v3_DeltaDiscoveryResponse_msginit, arena, len);
}
-UPB_INLINE upb_strview envoy_service_discovery_v3_DeltaDiscoveryResponse_system_version_info(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview); }
-UPB_INLINE bool envoy_service_discovery_v3_DeltaDiscoveryResponse_has_resources(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(24, 48)); }
-UPB_INLINE const envoy_service_discovery_v3_Resource* const* envoy_service_discovery_v3_DeltaDiscoveryResponse_resources(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t *len) { return (const envoy_service_discovery_v3_Resource* const*)_upb_array_accessor(msg, UPB_SIZE(24, 48), len); }
-UPB_INLINE upb_strview envoy_service_discovery_v3_DeltaDiscoveryResponse_type_url(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_strview); }
-UPB_INLINE upb_strview envoy_service_discovery_v3_DeltaDiscoveryResponse_nonce(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), upb_strview); }
-UPB_INLINE upb_strview const* envoy_service_discovery_v3_DeltaDiscoveryResponse_removed_resources(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(28, 56), len); }
-UPB_INLINE bool envoy_service_discovery_v3_DeltaDiscoveryResponse_has_udpa_removed_resources(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(32, 64)); }
-UPB_INLINE const struct udpa_core_v1_ResourceName* const* envoy_service_discovery_v3_DeltaDiscoveryResponse_udpa_removed_resources(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t *len) { return (const struct udpa_core_v1_ResourceName* const*)_upb_array_accessor(msg, UPB_SIZE(32, 64), len); }
+UPB_INLINE upb_strview envoy_service_discovery_v3_DeltaDiscoveryResponse_system_version_info(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+UPB_INLINE bool envoy_service_discovery_v3_DeltaDiscoveryResponse_has_resources(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(32, 64)); }
+UPB_INLINE const envoy_service_discovery_v3_Resource* const* envoy_service_discovery_v3_DeltaDiscoveryResponse_resources(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t *len) { return (const envoy_service_discovery_v3_Resource* const*)_upb_array_accessor(msg, UPB_SIZE(32, 64), len); }
+UPB_INLINE upb_strview envoy_service_discovery_v3_DeltaDiscoveryResponse_type_url(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
+UPB_INLINE upb_strview envoy_service_discovery_v3_DeltaDiscoveryResponse_nonce(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview); }
+UPB_INLINE upb_strview const* envoy_service_discovery_v3_DeltaDiscoveryResponse_removed_resources(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(36, 72), len); }
+UPB_INLINE bool envoy_service_discovery_v3_DeltaDiscoveryResponse_has_control_plane(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct envoy_config_core_v3_ControlPlane* envoy_service_discovery_v3_DeltaDiscoveryResponse_control_plane(const envoy_service_discovery_v3_DeltaDiscoveryResponse *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 56), const struct envoy_config_core_v3_ControlPlane*); }
UPB_INLINE void envoy_service_discovery_v3_DeltaDiscoveryResponse_set_system_version_info(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
}
UPB_INLINE envoy_service_discovery_v3_Resource** envoy_service_discovery_v3_DeltaDiscoveryResponse_mutable_resources(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t *len) {
- return (envoy_service_discovery_v3_Resource**)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 48), len);
+ return (envoy_service_discovery_v3_Resource**)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 64), len);
}
UPB_INLINE envoy_service_discovery_v3_Resource** envoy_service_discovery_v3_DeltaDiscoveryResponse_resize_resources(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t len, upb_arena *arena) {
- return (envoy_service_discovery_v3_Resource**)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 48), len, UPB_SIZE(2, 3), arena);
+ return (envoy_service_discovery_v3_Resource**)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 64), len, UPB_SIZE(2, 3), arena);
}
UPB_INLINE struct envoy_service_discovery_v3_Resource* envoy_service_discovery_v3_DeltaDiscoveryResponse_add_resources(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, upb_arena *arena) {
struct envoy_service_discovery_v3_Resource* sub = (struct envoy_service_discovery_v3_Resource*)_upb_msg_new(&envoy_service_discovery_v3_Resource_msginit, arena);
bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(24, 48), UPB_SIZE(2, 3), &sub, arena);
+ msg, UPB_SIZE(32, 64), UPB_SIZE(2, 3), &sub, arena);
if (!ok) return NULL;
return sub;
}
UPB_INLINE void envoy_service_discovery_v3_DeltaDiscoveryResponse_set_type_url(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(8, 16), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
}
UPB_INLINE void envoy_service_discovery_v3_DeltaDiscoveryResponse_set_nonce(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(16, 32), upb_strview) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview) = value;
}
UPB_INLINE upb_strview* envoy_service_discovery_v3_DeltaDiscoveryResponse_mutable_removed_resources(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 56), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 72), len);
}
UPB_INLINE upb_strview* envoy_service_discovery_v3_DeltaDiscoveryResponse_resize_removed_resources(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 56), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(36, 72), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_service_discovery_v3_DeltaDiscoveryResponse_add_removed_resources(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 56), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(36, 72), UPB_SIZE(3, 4), &val,
arena);
}
-UPB_INLINE struct udpa_core_v1_ResourceName** envoy_service_discovery_v3_DeltaDiscoveryResponse_mutable_udpa_removed_resources(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t *len) {
- return (struct udpa_core_v1_ResourceName**)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 64), len);
-}
-UPB_INLINE struct udpa_core_v1_ResourceName** envoy_service_discovery_v3_DeltaDiscoveryResponse_resize_udpa_removed_resources(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, size_t len, upb_arena *arena) {
- return (struct udpa_core_v1_ResourceName**)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 64), len, UPB_SIZE(2, 3), arena);
+UPB_INLINE void envoy_service_discovery_v3_DeltaDiscoveryResponse_set_control_plane(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, struct envoy_config_core_v3_ControlPlane* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(28, 56), struct envoy_config_core_v3_ControlPlane*) = value;
}
-UPB_INLINE struct udpa_core_v1_ResourceName* envoy_service_discovery_v3_DeltaDiscoveryResponse_add_udpa_removed_resources(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceName* sub = (struct udpa_core_v1_ResourceName*)_upb_msg_new(&udpa_core_v1_ResourceName_msginit, arena);
- bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(32, 64), UPB_SIZE(2, 3), &sub, arena);
- if (!ok) return NULL;
+UPB_INLINE struct envoy_config_core_v3_ControlPlane* envoy_service_discovery_v3_DeltaDiscoveryResponse_mutable_control_plane(envoy_service_discovery_v3_DeltaDiscoveryResponse *msg, upb_arena *arena) {
+ struct envoy_config_core_v3_ControlPlane* sub = (struct envoy_config_core_v3_ControlPlane*)envoy_service_discovery_v3_DeltaDiscoveryResponse_control_plane(msg);
+ if (sub == NULL) {
+ sub = (struct envoy_config_core_v3_ControlPlane*)_upb_msg_new(&envoy_config_core_v3_ControlPlane_msginit, arena);
+ if (!sub) return NULL;
+ envoy_service_discovery_v3_DeltaDiscoveryResponse_set_control_plane(msg, sub);
+ }
return sub;
}
UPB_INLINE bool envoy_service_discovery_v3_Resource_has_resource(const envoy_service_discovery_v3_Resource *msg) { return _upb_hasbit(msg, 1); }
UPB_INLINE const struct google_protobuf_Any* envoy_service_discovery_v3_Resource_resource(const envoy_service_discovery_v3_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), const struct google_protobuf_Any*); }
UPB_INLINE upb_strview envoy_service_discovery_v3_Resource_name(const envoy_service_discovery_v3_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
-UPB_INLINE upb_strview const* envoy_service_discovery_v3_Resource_aliases(const envoy_service_discovery_v3_Resource *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(28, 56), len); }
-UPB_INLINE bool envoy_service_discovery_v3_Resource_has_udpa_resource_name(const envoy_service_discovery_v3_Resource *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const struct udpa_core_v1_ResourceName* envoy_service_discovery_v3_Resource_udpa_resource_name(const envoy_service_discovery_v3_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 48), const struct udpa_core_v1_ResourceName*); }
+UPB_INLINE upb_strview const* envoy_service_discovery_v3_Resource_aliases(const envoy_service_discovery_v3_Resource *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(32, 64), len); }
+UPB_INLINE bool envoy_service_discovery_v3_Resource_has_ttl(const envoy_service_discovery_v3_Resource *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct google_protobuf_Duration* envoy_service_discovery_v3_Resource_ttl(const envoy_service_discovery_v3_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(24, 48), const struct google_protobuf_Duration*); }
+UPB_INLINE bool envoy_service_discovery_v3_Resource_has_cache_control(const envoy_service_discovery_v3_Resource *msg) { return _upb_hasbit(msg, 3); }
+UPB_INLINE const envoy_service_discovery_v3_Resource_CacheControl* envoy_service_discovery_v3_Resource_cache_control(const envoy_service_discovery_v3_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 56), const envoy_service_discovery_v3_Resource_CacheControl*); }
UPB_INLINE void envoy_service_discovery_v3_Resource_set_version(envoy_service_discovery_v3_Resource *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
*UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
}
UPB_INLINE upb_strview* envoy_service_discovery_v3_Resource_mutable_aliases(envoy_service_discovery_v3_Resource *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 56), len);
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 64), len);
}
UPB_INLINE upb_strview* envoy_service_discovery_v3_Resource_resize_aliases(envoy_service_discovery_v3_Resource *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 56), len, UPB_SIZE(3, 4), arena);
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(32, 64), len, UPB_SIZE(3, 4), arena);
}
UPB_INLINE bool envoy_service_discovery_v3_Resource_add_aliases(envoy_service_discovery_v3_Resource *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(28, 56), UPB_SIZE(3, 4), &val,
+ return _upb_array_append_accessor2(msg, UPB_SIZE(32, 64), UPB_SIZE(3, 4), &val,
arena);
}
-UPB_INLINE void envoy_service_discovery_v3_Resource_set_udpa_resource_name(envoy_service_discovery_v3_Resource *msg, struct udpa_core_v1_ResourceName* value) {
+UPB_INLINE void envoy_service_discovery_v3_Resource_set_ttl(envoy_service_discovery_v3_Resource *msg, struct google_protobuf_Duration* value) {
_upb_sethas(msg, 2);
- *UPB_PTR_AT(msg, UPB_SIZE(24, 48), struct udpa_core_v1_ResourceName*) = value;
+ *UPB_PTR_AT(msg, UPB_SIZE(24, 48), struct google_protobuf_Duration*) = value;
+}
+UPB_INLINE struct google_protobuf_Duration* envoy_service_discovery_v3_Resource_mutable_ttl(envoy_service_discovery_v3_Resource *msg, upb_arena *arena) {
+ struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_service_discovery_v3_Resource_ttl(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Duration*)_upb_msg_new(&google_protobuf_Duration_msginit, arena);
+ if (!sub) return NULL;
+ envoy_service_discovery_v3_Resource_set_ttl(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void envoy_service_discovery_v3_Resource_set_cache_control(envoy_service_discovery_v3_Resource *msg, envoy_service_discovery_v3_Resource_CacheControl* value) {
+ _upb_sethas(msg, 3);
+ *UPB_PTR_AT(msg, UPB_SIZE(28, 56), envoy_service_discovery_v3_Resource_CacheControl*) = value;
}
-UPB_INLINE struct udpa_core_v1_ResourceName* envoy_service_discovery_v3_Resource_mutable_udpa_resource_name(envoy_service_discovery_v3_Resource *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceName* sub = (struct udpa_core_v1_ResourceName*)envoy_service_discovery_v3_Resource_udpa_resource_name(msg);
+UPB_INLINE struct envoy_service_discovery_v3_Resource_CacheControl* envoy_service_discovery_v3_Resource_mutable_cache_control(envoy_service_discovery_v3_Resource *msg, upb_arena *arena) {
+ struct envoy_service_discovery_v3_Resource_CacheControl* sub = (struct envoy_service_discovery_v3_Resource_CacheControl*)envoy_service_discovery_v3_Resource_cache_control(msg);
if (sub == NULL) {
- sub = (struct udpa_core_v1_ResourceName*)_upb_msg_new(&udpa_core_v1_ResourceName_msginit, arena);
+ sub = (struct envoy_service_discovery_v3_Resource_CacheControl*)_upb_msg_new(&envoy_service_discovery_v3_Resource_CacheControl_msginit, arena);
if (!sub) return NULL;
- envoy_service_discovery_v3_Resource_set_udpa_resource_name(msg, sub);
+ envoy_service_discovery_v3_Resource_set_cache_control(msg, sub);
}
return sub;
}
+/* envoy.service.discovery.v3.Resource.CacheControl */
+
+UPB_INLINE envoy_service_discovery_v3_Resource_CacheControl *envoy_service_discovery_v3_Resource_CacheControl_new(upb_arena *arena) {
+ return (envoy_service_discovery_v3_Resource_CacheControl *)_upb_msg_new(&envoy_service_discovery_v3_Resource_CacheControl_msginit, arena);
+}
+UPB_INLINE envoy_service_discovery_v3_Resource_CacheControl *envoy_service_discovery_v3_Resource_CacheControl_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ envoy_service_discovery_v3_Resource_CacheControl *ret = envoy_service_discovery_v3_Resource_CacheControl_new(arena);
+ return (ret && upb_decode(buf, size, ret, &envoy_service_discovery_v3_Resource_CacheControl_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE envoy_service_discovery_v3_Resource_CacheControl *envoy_service_discovery_v3_Resource_CacheControl_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ envoy_service_discovery_v3_Resource_CacheControl *ret = envoy_service_discovery_v3_Resource_CacheControl_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &envoy_service_discovery_v3_Resource_CacheControl_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *envoy_service_discovery_v3_Resource_CacheControl_serialize(const envoy_service_discovery_v3_Resource_CacheControl *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &envoy_service_discovery_v3_Resource_CacheControl_msginit, arena, len);
+}
+
+UPB_INLINE bool envoy_service_discovery_v3_Resource_CacheControl_do_not_cache(const envoy_service_discovery_v3_Resource_CacheControl *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), bool); }
+
+UPB_INLINE void envoy_service_discovery_v3_Resource_CacheControl_set_do_not_cache(envoy_service_discovery_v3_Resource_CacheControl *msg, bool value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(0, 0), bool) = value;
+}
+
#ifdef __cplusplus
} /* extern "C" */
#endif
#include "envoy/service/endpoint/v3/eds.upb.h"
#include "envoy/service/discovery/v3/discovery.upb.h"
#include "google/api/annotations.upb.h"
-#include "google/protobuf/duration.upb.h"
-#include "google/protobuf/wrappers.upb.h"
#include "envoy/annotations/resource.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
-#include "validate/validate.upb.h"
#include "upb/port_def.inc"
#include "envoy/service/listener/v3/lds.upb.h"
#include "envoy/service/discovery/v3/discovery.upb.h"
#include "google/api/annotations.upb.h"
-#include "google/protobuf/duration.upb.h"
-#include "google/protobuf/wrappers.upb.h"
#include "envoy/annotations/resource.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
-#include "validate/validate.upb.h"
#include "upb/port_def.inc"
#include "google/protobuf/duration.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
-#include "validate/validate.upb.h"
#include "upb/port_def.inc"
#include "envoy/service/route/v3/rds.upb.h"
#include "envoy/service/discovery/v3/discovery.upb.h"
#include "google/api/annotations.upb.h"
-#include "google/protobuf/wrappers.upb.h"
#include "envoy/annotations/resource.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
-#include "validate/validate.upb.h"
#include "upb/port_def.inc"
#include "upb/msg.h"
#include "envoy/type/matcher/v3/string.upb.h"
#include "envoy/type/matcher/v3/regex.upb.h"
-#include "envoy/annotations/deprecation.upb.h"
#include "udpa/annotations/status.upb.h"
#include "udpa/annotations/versioning.upb.h"
#include "validate/validate.upb.h"
UPB_SIZE(16, 32), 9, false, 255,
};
-static const upb_msglayout *const google_api_expr_v1alpha1_SourceInfo_submsgs[1] = {
+static const upb_msglayout *const google_api_expr_v1alpha1_SourceInfo_submsgs[2] = {
+ &google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_msginit,
&google_api_expr_v1alpha1_SourceInfo_PositionsEntry_msginit,
};
-static const upb_msglayout_field google_api_expr_v1alpha1_SourceInfo__fields[4] = {
+static const upb_msglayout_field google_api_expr_v1alpha1_SourceInfo__fields[5] = {
{1, UPB_SIZE(0, 0), 0, 0, 9, 1},
{2, UPB_SIZE(8, 16), 0, 0, 9, 1},
{3, UPB_SIZE(16, 32), 0, 0, 5, _UPB_LABEL_PACKED},
- {4, UPB_SIZE(20, 40), 0, 0, 11, _UPB_LABEL_MAP},
+ {4, UPB_SIZE(20, 40), 0, 1, 11, _UPB_LABEL_MAP},
+ {5, UPB_SIZE(24, 48), 0, 0, 11, _UPB_LABEL_MAP},
};
const upb_msglayout google_api_expr_v1alpha1_SourceInfo_msginit = {
&google_api_expr_v1alpha1_SourceInfo_submsgs[0],
&google_api_expr_v1alpha1_SourceInfo__fields[0],
- UPB_SIZE(24, 48), 4, false, 255,
+ UPB_SIZE(32, 64), 5, false, 255,
};
static const upb_msglayout_field google_api_expr_v1alpha1_SourceInfo_PositionsEntry__fields[2] = {
UPB_SIZE(16, 32), 2, false, 255,
};
+static const upb_msglayout *const google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_submsgs[1] = {
+ &google_api_expr_v1alpha1_Expr_msginit,
+};
+
+static const upb_msglayout_field google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry__fields[2] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 3, 1},
+ {2, UPB_SIZE(8, 16), 0, 0, 11, 1},
+};
+
+const upb_msglayout google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_msginit = {
+ &google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_submsgs[0],
+ &google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry__fields[0],
+ UPB_SIZE(16, 32), 2, false, 255,
+};
+
static const upb_msglayout_field google_api_expr_v1alpha1_SourcePosition__fields[4] = {
{1, UPB_SIZE(12, 16), 0, 0, 9, 1},
{2, UPB_SIZE(0, 0), 0, 0, 5, 1},
struct google_api_expr_v1alpha1_Constant;
struct google_api_expr_v1alpha1_SourceInfo;
struct google_api_expr_v1alpha1_SourceInfo_PositionsEntry;
+struct google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry;
struct google_api_expr_v1alpha1_SourcePosition;
typedef struct google_api_expr_v1alpha1_ParsedExpr google_api_expr_v1alpha1_ParsedExpr;
typedef struct google_api_expr_v1alpha1_Expr google_api_expr_v1alpha1_Expr;
typedef struct google_api_expr_v1alpha1_Constant google_api_expr_v1alpha1_Constant;
typedef struct google_api_expr_v1alpha1_SourceInfo google_api_expr_v1alpha1_SourceInfo;
typedef struct google_api_expr_v1alpha1_SourceInfo_PositionsEntry google_api_expr_v1alpha1_SourceInfo_PositionsEntry;
+typedef struct google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry;
typedef struct google_api_expr_v1alpha1_SourcePosition google_api_expr_v1alpha1_SourcePosition;
extern const upb_msglayout google_api_expr_v1alpha1_ParsedExpr_msginit;
extern const upb_msglayout google_api_expr_v1alpha1_Expr_msginit;
extern const upb_msglayout google_api_expr_v1alpha1_Constant_msginit;
extern const upb_msglayout google_api_expr_v1alpha1_SourceInfo_msginit;
extern const upb_msglayout google_api_expr_v1alpha1_SourceInfo_PositionsEntry_msginit;
+extern const upb_msglayout google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_msginit;
extern const upb_msglayout google_api_expr_v1alpha1_SourcePosition_msginit;
struct google_protobuf_Duration;
struct google_protobuf_Timestamp;
UPB_INLINE size_t google_api_expr_v1alpha1_SourceInfo_positions_size(const google_api_expr_v1alpha1_SourceInfo *msg) {return _upb_msg_map_size(msg, UPB_SIZE(20, 40)); }
UPB_INLINE bool google_api_expr_v1alpha1_SourceInfo_positions_get(const google_api_expr_v1alpha1_SourceInfo *msg, int64_t key, int32_t *val) { return _upb_msg_map_get(msg, UPB_SIZE(20, 40), &key, sizeof(key), val, sizeof(*val)); }
UPB_INLINE const google_api_expr_v1alpha1_SourceInfo_PositionsEntry* google_api_expr_v1alpha1_SourceInfo_positions_next(const google_api_expr_v1alpha1_SourceInfo *msg, size_t* iter) { return (const google_api_expr_v1alpha1_SourceInfo_PositionsEntry*)_upb_msg_map_next(msg, UPB_SIZE(20, 40), iter); }
+UPB_INLINE bool google_api_expr_v1alpha1_SourceInfo_has_macro_calls(const google_api_expr_v1alpha1_SourceInfo *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(24, 48)); }
+UPB_INLINE size_t google_api_expr_v1alpha1_SourceInfo_macro_calls_size(const google_api_expr_v1alpha1_SourceInfo *msg) {return _upb_msg_map_size(msg, UPB_SIZE(24, 48)); }
+UPB_INLINE bool google_api_expr_v1alpha1_SourceInfo_macro_calls_get(const google_api_expr_v1alpha1_SourceInfo *msg, int64_t key, google_api_expr_v1alpha1_Expr* *val) { return _upb_msg_map_get(msg, UPB_SIZE(24, 48), &key, sizeof(key), val, sizeof(*val)); }
+UPB_INLINE const google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry* google_api_expr_v1alpha1_SourceInfo_macro_calls_next(const google_api_expr_v1alpha1_SourceInfo *msg, size_t* iter) { return (const google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry*)_upb_msg_map_next(msg, UPB_SIZE(24, 48), iter); }
UPB_INLINE void google_api_expr_v1alpha1_SourceInfo_set_syntax_version(google_api_expr_v1alpha1_SourceInfo *msg, upb_strview value) {
*UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview) = value;
UPB_INLINE bool google_api_expr_v1alpha1_SourceInfo_positions_set(google_api_expr_v1alpha1_SourceInfo *msg, int64_t key, int32_t val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(20, 40), &key, sizeof(key), &val, sizeof(val), a); }
UPB_INLINE bool google_api_expr_v1alpha1_SourceInfo_positions_delete(google_api_expr_v1alpha1_SourceInfo *msg, int64_t key) { return _upb_msg_map_delete(msg, UPB_SIZE(20, 40), &key, sizeof(key)); }
UPB_INLINE google_api_expr_v1alpha1_SourceInfo_PositionsEntry* google_api_expr_v1alpha1_SourceInfo_positions_nextmutable(google_api_expr_v1alpha1_SourceInfo *msg, size_t* iter) { return (google_api_expr_v1alpha1_SourceInfo_PositionsEntry*)_upb_msg_map_next(msg, UPB_SIZE(20, 40), iter); }
+UPB_INLINE void google_api_expr_v1alpha1_SourceInfo_macro_calls_clear(google_api_expr_v1alpha1_SourceInfo *msg) { _upb_msg_map_clear(msg, UPB_SIZE(24, 48)); }
+UPB_INLINE bool google_api_expr_v1alpha1_SourceInfo_macro_calls_set(google_api_expr_v1alpha1_SourceInfo *msg, int64_t key, google_api_expr_v1alpha1_Expr* val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(24, 48), &key, sizeof(key), &val, sizeof(val), a); }
+UPB_INLINE bool google_api_expr_v1alpha1_SourceInfo_macro_calls_delete(google_api_expr_v1alpha1_SourceInfo *msg, int64_t key) { return _upb_msg_map_delete(msg, UPB_SIZE(24, 48), &key, sizeof(key)); }
+UPB_INLINE google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry* google_api_expr_v1alpha1_SourceInfo_macro_calls_nextmutable(google_api_expr_v1alpha1_SourceInfo *msg, size_t* iter) { return (google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry*)_upb_msg_map_next(msg, UPB_SIZE(24, 48), iter); }
/* google.api.expr.v1alpha1.SourceInfo.PositionsEntry */
_upb_msg_map_set_value(msg, &value, sizeof(int32_t));
}
+/* google.api.expr.v1alpha1.SourceInfo.MacroCallsEntry */
+
+UPB_INLINE int64_t google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_key(const google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry *msg) {
+ int64_t ret;
+ _upb_msg_map_key(msg, &ret, sizeof(ret));
+ return ret;
+}
+UPB_INLINE bool google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_has_value(const google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); }
+UPB_INLINE const google_api_expr_v1alpha1_Expr* google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_value(const google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry *msg) {
+ google_api_expr_v1alpha1_Expr* ret;
+ _upb_msg_map_value(msg, &ret, sizeof(ret));
+ return ret;
+}
+
+UPB_INLINE void google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_set_value(google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry *msg, google_api_expr_v1alpha1_Expr* value) {
+ _upb_msg_map_set_value(msg, &value, sizeof(google_api_expr_v1alpha1_Expr*));
+}
+
/* google.api.expr.v1alpha1.SourcePosition */
UPB_INLINE google_api_expr_v1alpha1_SourcePosition *google_api_expr_v1alpha1_SourcePosition_new(upb_arena *arena) {
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * src/proto/grpc/auth/v1/authz_policy.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "src/proto/grpc/auth/v1/authz_policy.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout_field grpc_auth_v1_Peer__fields[1] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 9, 3},
+};
+
+const upb_msglayout grpc_auth_v1_Peer_msginit = {
+ NULL,
+ &grpc_auth_v1_Peer__fields[0],
+ UPB_SIZE(8, 8), 1, false, 255,
+};
+
+static const upb_msglayout_field grpc_auth_v1_Header__fields[2] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
+ {2, UPB_SIZE(8, 16), 0, 0, 9, 3},
+};
+
+const upb_msglayout grpc_auth_v1_Header_msginit = {
+ NULL,
+ &grpc_auth_v1_Header__fields[0],
+ UPB_SIZE(16, 32), 2, false, 255,
+};
+
+static const upb_msglayout *const grpc_auth_v1_Request_submsgs[1] = {
+ &grpc_auth_v1_Header_msginit,
+};
+
+static const upb_msglayout_field grpc_auth_v1_Request__fields[2] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 9, 3},
+ {3, UPB_SIZE(4, 8), 0, 0, 11, 3},
+};
+
+const upb_msglayout grpc_auth_v1_Request_msginit = {
+ &grpc_auth_v1_Request_submsgs[0],
+ &grpc_auth_v1_Request__fields[0],
+ UPB_SIZE(8, 16), 2, false, 255,
+};
+
+static const upb_msglayout *const grpc_auth_v1_Rule_submsgs[2] = {
+ &grpc_auth_v1_Peer_msginit,
+ &grpc_auth_v1_Request_msginit,
+};
+
+static const upb_msglayout_field grpc_auth_v1_Rule__fields[3] = {
+ {1, UPB_SIZE(4, 8), 0, 0, 9, 1},
+ {2, UPB_SIZE(12, 24), 1, 0, 11, 1},
+ {3, UPB_SIZE(16, 32), 2, 1, 11, 1},
+};
+
+const upb_msglayout grpc_auth_v1_Rule_msginit = {
+ &grpc_auth_v1_Rule_submsgs[0],
+ &grpc_auth_v1_Rule__fields[0],
+ UPB_SIZE(24, 48), 3, false, 255,
+};
+
+static const upb_msglayout *const grpc_auth_v1_AuthorizationPolicy_submsgs[1] = {
+ &grpc_auth_v1_Rule_msginit,
+};
+
+static const upb_msglayout_field grpc_auth_v1_AuthorizationPolicy__fields[3] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
+ {2, UPB_SIZE(8, 16), 0, 0, 11, 3},
+ {3, UPB_SIZE(12, 24), 0, 0, 11, 3},
+};
+
+const upb_msglayout grpc_auth_v1_AuthorizationPolicy_msginit = {
+ &grpc_auth_v1_AuthorizationPolicy_submsgs[0],
+ &grpc_auth_v1_AuthorizationPolicy__fields[0],
+ UPB_SIZE(16, 32), 3, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * src/proto/grpc/auth/v1/authz_policy.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef SRC_PROTO_GRPC_AUTH_V1_AUTHZ_POLICY_PROTO_UPB_H_
+#define SRC_PROTO_GRPC_AUTH_V1_AUTHZ_POLICY_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct grpc_auth_v1_Peer;
+struct grpc_auth_v1_Header;
+struct grpc_auth_v1_Request;
+struct grpc_auth_v1_Rule;
+struct grpc_auth_v1_AuthorizationPolicy;
+typedef struct grpc_auth_v1_Peer grpc_auth_v1_Peer;
+typedef struct grpc_auth_v1_Header grpc_auth_v1_Header;
+typedef struct grpc_auth_v1_Request grpc_auth_v1_Request;
+typedef struct grpc_auth_v1_Rule grpc_auth_v1_Rule;
+typedef struct grpc_auth_v1_AuthorizationPolicy grpc_auth_v1_AuthorizationPolicy;
+extern const upb_msglayout grpc_auth_v1_Peer_msginit;
+extern const upb_msglayout grpc_auth_v1_Header_msginit;
+extern const upb_msglayout grpc_auth_v1_Request_msginit;
+extern const upb_msglayout grpc_auth_v1_Rule_msginit;
+extern const upb_msglayout grpc_auth_v1_AuthorizationPolicy_msginit;
+
+
+/* grpc.auth.v1.Peer */
+
+UPB_INLINE grpc_auth_v1_Peer *grpc_auth_v1_Peer_new(upb_arena *arena) {
+ return (grpc_auth_v1_Peer *)_upb_msg_new(&grpc_auth_v1_Peer_msginit, arena);
+}
+UPB_INLINE grpc_auth_v1_Peer *grpc_auth_v1_Peer_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ grpc_auth_v1_Peer *ret = grpc_auth_v1_Peer_new(arena);
+ return (ret && upb_decode(buf, size, ret, &grpc_auth_v1_Peer_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE grpc_auth_v1_Peer *grpc_auth_v1_Peer_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ grpc_auth_v1_Peer *ret = grpc_auth_v1_Peer_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &grpc_auth_v1_Peer_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *grpc_auth_v1_Peer_serialize(const grpc_auth_v1_Peer *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &grpc_auth_v1_Peer_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview const* grpc_auth_v1_Peer_principals(const grpc_auth_v1_Peer *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); }
+
+UPB_INLINE upb_strview* grpc_auth_v1_Peer_mutable_principals(grpc_auth_v1_Peer *msg, size_t *len) {
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len);
+}
+UPB_INLINE upb_strview* grpc_auth_v1_Peer_resize_principals(grpc_auth_v1_Peer *msg, size_t len, upb_arena *arena) {
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(0, 0), len, UPB_SIZE(3, 4), arena);
+}
+UPB_INLINE bool grpc_auth_v1_Peer_add_principals(grpc_auth_v1_Peer *msg, upb_strview val, upb_arena *arena) {
+ return _upb_array_append_accessor2(msg, UPB_SIZE(0, 0), UPB_SIZE(3, 4), &val,
+ arena);
+}
+
+/* grpc.auth.v1.Header */
+
+UPB_INLINE grpc_auth_v1_Header *grpc_auth_v1_Header_new(upb_arena *arena) {
+ return (grpc_auth_v1_Header *)_upb_msg_new(&grpc_auth_v1_Header_msginit, arena);
+}
+UPB_INLINE grpc_auth_v1_Header *grpc_auth_v1_Header_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ grpc_auth_v1_Header *ret = grpc_auth_v1_Header_new(arena);
+ return (ret && upb_decode(buf, size, ret, &grpc_auth_v1_Header_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE grpc_auth_v1_Header *grpc_auth_v1_Header_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ grpc_auth_v1_Header *ret = grpc_auth_v1_Header_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &grpc_auth_v1_Header_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *grpc_auth_v1_Header_serialize(const grpc_auth_v1_Header *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &grpc_auth_v1_Header_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview grpc_auth_v1_Header_key(const grpc_auth_v1_Header *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview); }
+UPB_INLINE upb_strview const* grpc_auth_v1_Header_values(const grpc_auth_v1_Header *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); }
+
+UPB_INLINE void grpc_auth_v1_Header_set_key(grpc_auth_v1_Header *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview) = value;
+}
+UPB_INLINE upb_strview* grpc_auth_v1_Header_mutable_values(grpc_auth_v1_Header *msg, size_t *len) {
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len);
+}
+UPB_INLINE upb_strview* grpc_auth_v1_Header_resize_values(grpc_auth_v1_Header *msg, size_t len, upb_arena *arena) {
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(8, 16), len, UPB_SIZE(3, 4), arena);
+}
+UPB_INLINE bool grpc_auth_v1_Header_add_values(grpc_auth_v1_Header *msg, upb_strview val, upb_arena *arena) {
+ return _upb_array_append_accessor2(msg, UPB_SIZE(8, 16), UPB_SIZE(3, 4), &val,
+ arena);
+}
+
+/* grpc.auth.v1.Request */
+
+UPB_INLINE grpc_auth_v1_Request *grpc_auth_v1_Request_new(upb_arena *arena) {
+ return (grpc_auth_v1_Request *)_upb_msg_new(&grpc_auth_v1_Request_msginit, arena);
+}
+UPB_INLINE grpc_auth_v1_Request *grpc_auth_v1_Request_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ grpc_auth_v1_Request *ret = grpc_auth_v1_Request_new(arena);
+ return (ret && upb_decode(buf, size, ret, &grpc_auth_v1_Request_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE grpc_auth_v1_Request *grpc_auth_v1_Request_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ grpc_auth_v1_Request *ret = grpc_auth_v1_Request_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &grpc_auth_v1_Request_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *grpc_auth_v1_Request_serialize(const grpc_auth_v1_Request *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &grpc_auth_v1_Request_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview const* grpc_auth_v1_Request_paths(const grpc_auth_v1_Request *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); }
+UPB_INLINE bool grpc_auth_v1_Request_has_headers(const grpc_auth_v1_Request *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(4, 8)); }
+UPB_INLINE const grpc_auth_v1_Header* const* grpc_auth_v1_Request_headers(const grpc_auth_v1_Request *msg, size_t *len) { return (const grpc_auth_v1_Header* const*)_upb_array_accessor(msg, UPB_SIZE(4, 8), len); }
+
+UPB_INLINE upb_strview* grpc_auth_v1_Request_mutable_paths(grpc_auth_v1_Request *msg, size_t *len) {
+ return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len);
+}
+UPB_INLINE upb_strview* grpc_auth_v1_Request_resize_paths(grpc_auth_v1_Request *msg, size_t len, upb_arena *arena) {
+ return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(0, 0), len, UPB_SIZE(3, 4), arena);
+}
+UPB_INLINE bool grpc_auth_v1_Request_add_paths(grpc_auth_v1_Request *msg, upb_strview val, upb_arena *arena) {
+ return _upb_array_append_accessor2(msg, UPB_SIZE(0, 0), UPB_SIZE(3, 4), &val,
+ arena);
+}
+UPB_INLINE grpc_auth_v1_Header** grpc_auth_v1_Request_mutable_headers(grpc_auth_v1_Request *msg, size_t *len) {
+ return (grpc_auth_v1_Header**)_upb_array_mutable_accessor(msg, UPB_SIZE(4, 8), len);
+}
+UPB_INLINE grpc_auth_v1_Header** grpc_auth_v1_Request_resize_headers(grpc_auth_v1_Request *msg, size_t len, upb_arena *arena) {
+ return (grpc_auth_v1_Header**)_upb_array_resize_accessor2(msg, UPB_SIZE(4, 8), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct grpc_auth_v1_Header* grpc_auth_v1_Request_add_headers(grpc_auth_v1_Request *msg, upb_arena *arena) {
+ struct grpc_auth_v1_Header* sub = (struct grpc_auth_v1_Header*)_upb_msg_new(&grpc_auth_v1_Header_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(4, 8), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
+
+/* grpc.auth.v1.Rule */
+
+UPB_INLINE grpc_auth_v1_Rule *grpc_auth_v1_Rule_new(upb_arena *arena) {
+ return (grpc_auth_v1_Rule *)_upb_msg_new(&grpc_auth_v1_Rule_msginit, arena);
+}
+UPB_INLINE grpc_auth_v1_Rule *grpc_auth_v1_Rule_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ grpc_auth_v1_Rule *ret = grpc_auth_v1_Rule_new(arena);
+ return (ret && upb_decode(buf, size, ret, &grpc_auth_v1_Rule_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE grpc_auth_v1_Rule *grpc_auth_v1_Rule_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ grpc_auth_v1_Rule *ret = grpc_auth_v1_Rule_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &grpc_auth_v1_Rule_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *grpc_auth_v1_Rule_serialize(const grpc_auth_v1_Rule *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &grpc_auth_v1_Rule_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview grpc_auth_v1_Rule_name(const grpc_auth_v1_Rule *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+UPB_INLINE bool grpc_auth_v1_Rule_has_source(const grpc_auth_v1_Rule *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const grpc_auth_v1_Peer* grpc_auth_v1_Rule_source(const grpc_auth_v1_Rule *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const grpc_auth_v1_Peer*); }
+UPB_INLINE bool grpc_auth_v1_Rule_has_request(const grpc_auth_v1_Rule *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const grpc_auth_v1_Request* grpc_auth_v1_Rule_request(const grpc_auth_v1_Rule *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const grpc_auth_v1_Request*); }
+
+UPB_INLINE void grpc_auth_v1_Rule_set_name(grpc_auth_v1_Rule *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+}
+UPB_INLINE void grpc_auth_v1_Rule_set_source(grpc_auth_v1_Rule *msg, grpc_auth_v1_Peer* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), grpc_auth_v1_Peer*) = value;
+}
+UPB_INLINE struct grpc_auth_v1_Peer* grpc_auth_v1_Rule_mutable_source(grpc_auth_v1_Rule *msg, upb_arena *arena) {
+ struct grpc_auth_v1_Peer* sub = (struct grpc_auth_v1_Peer*)grpc_auth_v1_Rule_source(msg);
+ if (sub == NULL) {
+ sub = (struct grpc_auth_v1_Peer*)_upb_msg_new(&grpc_auth_v1_Peer_msginit, arena);
+ if (!sub) return NULL;
+ grpc_auth_v1_Rule_set_source(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void grpc_auth_v1_Rule_set_request(grpc_auth_v1_Rule *msg, grpc_auth_v1_Request* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 32), grpc_auth_v1_Request*) = value;
+}
+UPB_INLINE struct grpc_auth_v1_Request* grpc_auth_v1_Rule_mutable_request(grpc_auth_v1_Rule *msg, upb_arena *arena) {
+ struct grpc_auth_v1_Request* sub = (struct grpc_auth_v1_Request*)grpc_auth_v1_Rule_request(msg);
+ if (sub == NULL) {
+ sub = (struct grpc_auth_v1_Request*)_upb_msg_new(&grpc_auth_v1_Request_msginit, arena);
+ if (!sub) return NULL;
+ grpc_auth_v1_Rule_set_request(msg, sub);
+ }
+ return sub;
+}
+
+/* grpc.auth.v1.AuthorizationPolicy */
+
+UPB_INLINE grpc_auth_v1_AuthorizationPolicy *grpc_auth_v1_AuthorizationPolicy_new(upb_arena *arena) {
+ return (grpc_auth_v1_AuthorizationPolicy *)_upb_msg_new(&grpc_auth_v1_AuthorizationPolicy_msginit, arena);
+}
+UPB_INLINE grpc_auth_v1_AuthorizationPolicy *grpc_auth_v1_AuthorizationPolicy_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ grpc_auth_v1_AuthorizationPolicy *ret = grpc_auth_v1_AuthorizationPolicy_new(arena);
+ return (ret && upb_decode(buf, size, ret, &grpc_auth_v1_AuthorizationPolicy_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE grpc_auth_v1_AuthorizationPolicy *grpc_auth_v1_AuthorizationPolicy_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ grpc_auth_v1_AuthorizationPolicy *ret = grpc_auth_v1_AuthorizationPolicy_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &grpc_auth_v1_AuthorizationPolicy_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *grpc_auth_v1_AuthorizationPolicy_serialize(const grpc_auth_v1_AuthorizationPolicy *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &grpc_auth_v1_AuthorizationPolicy_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview grpc_auth_v1_AuthorizationPolicy_name(const grpc_auth_v1_AuthorizationPolicy *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview); }
+UPB_INLINE bool grpc_auth_v1_AuthorizationPolicy_has_deny_rules(const grpc_auth_v1_AuthorizationPolicy *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(8, 16)); }
+UPB_INLINE const grpc_auth_v1_Rule* const* grpc_auth_v1_AuthorizationPolicy_deny_rules(const grpc_auth_v1_AuthorizationPolicy *msg, size_t *len) { return (const grpc_auth_v1_Rule* const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); }
+UPB_INLINE bool grpc_auth_v1_AuthorizationPolicy_has_allow_rules(const grpc_auth_v1_AuthorizationPolicy *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(12, 24)); }
+UPB_INLINE const grpc_auth_v1_Rule* const* grpc_auth_v1_AuthorizationPolicy_allow_rules(const grpc_auth_v1_AuthorizationPolicy *msg, size_t *len) { return (const grpc_auth_v1_Rule* const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); }
+
+UPB_INLINE void grpc_auth_v1_AuthorizationPolicy_set_name(grpc_auth_v1_AuthorizationPolicy *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview) = value;
+}
+UPB_INLINE grpc_auth_v1_Rule** grpc_auth_v1_AuthorizationPolicy_mutable_deny_rules(grpc_auth_v1_AuthorizationPolicy *msg, size_t *len) {
+ return (grpc_auth_v1_Rule**)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len);
+}
+UPB_INLINE grpc_auth_v1_Rule** grpc_auth_v1_AuthorizationPolicy_resize_deny_rules(grpc_auth_v1_AuthorizationPolicy *msg, size_t len, upb_arena *arena) {
+ return (grpc_auth_v1_Rule**)_upb_array_resize_accessor2(msg, UPB_SIZE(8, 16), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct grpc_auth_v1_Rule* grpc_auth_v1_AuthorizationPolicy_add_deny_rules(grpc_auth_v1_AuthorizationPolicy *msg, upb_arena *arena) {
+ struct grpc_auth_v1_Rule* sub = (struct grpc_auth_v1_Rule*)_upb_msg_new(&grpc_auth_v1_Rule_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(8, 16), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
+UPB_INLINE grpc_auth_v1_Rule** grpc_auth_v1_AuthorizationPolicy_mutable_allow_rules(grpc_auth_v1_AuthorizationPolicy *msg, size_t *len) {
+ return (grpc_auth_v1_Rule**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len);
+}
+UPB_INLINE grpc_auth_v1_Rule** grpc_auth_v1_AuthorizationPolicy_resize_allow_rules(grpc_auth_v1_AuthorizationPolicy *msg, size_t len, upb_arena *arena) {
+ return (grpc_auth_v1_Rule**)_upb_array_resize_accessor2(msg, UPB_SIZE(12, 24), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct grpc_auth_v1_Rule* grpc_auth_v1_AuthorizationPolicy_add_allow_rules(grpc_auth_v1_AuthorizationPolicy *msg, upb_arena *arena) {
+ struct grpc_auth_v1_Rule* sub = (struct grpc_auth_v1_Rule*)_upb_msg_new(&grpc_auth_v1_Rule_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(12, 24), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* SRC_PROTO_GRPC_AUTH_V1_AUTHZ_POLICY_PROTO_UPB_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/authority.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_AUTHORITY_PROTO_UPB_H_
-#define UDPA_CORE_V1_AUTHORITY_PROTO_UPB_H_
-
-#include "upb/msg.h"
-#include "upb/decode.h"
-#include "upb/decode_fast.h"
-#include "upb/encode.h"
-
-#include "upb/port_def.inc"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct udpa_core_v1_Authority;
-typedef struct udpa_core_v1_Authority udpa_core_v1_Authority;
-extern const upb_msglayout udpa_core_v1_Authority_msginit;
-
-
-/* udpa.core.v1.Authority */
-
-UPB_INLINE udpa_core_v1_Authority *udpa_core_v1_Authority_new(upb_arena *arena) {
- return (udpa_core_v1_Authority *)_upb_msg_new(&udpa_core_v1_Authority_msginit, arena);
-}
-UPB_INLINE udpa_core_v1_Authority *udpa_core_v1_Authority_parse(const char *buf, size_t size,
- upb_arena *arena) {
- udpa_core_v1_Authority *ret = udpa_core_v1_Authority_new(arena);
- return (ret && upb_decode(buf, size, ret, &udpa_core_v1_Authority_msginit, arena)) ? ret : NULL;
-}
-UPB_INLINE udpa_core_v1_Authority *udpa_core_v1_Authority_parse_ex(const char *buf, size_t size,
- upb_arena *arena, int options) {
- udpa_core_v1_Authority *ret = udpa_core_v1_Authority_new(arena);
- return (ret && _upb_decode(buf, size, ret, &udpa_core_v1_Authority_msginit, arena, options))
- ? ret : NULL;
-}
-UPB_INLINE char *udpa_core_v1_Authority_serialize(const udpa_core_v1_Authority *msg, upb_arena *arena, size_t *len) {
- return upb_encode(msg, &udpa_core_v1_Authority_msginit, arena, len);
-}
-
-UPB_INLINE upb_strview udpa_core_v1_Authority_name(const udpa_core_v1_Authority *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview); }
-
-UPB_INLINE void udpa_core_v1_Authority_set_name(udpa_core_v1_Authority *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview) = value;
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_AUTHORITY_PROTO_UPB_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/collection_entry.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include <stddef.h>
-#include "upb/msg.h"
-#include "udpa/core/v1/collection_entry.upb.h"
-#include "google/protobuf/any.upb.h"
-#include "udpa/annotations/status.upb.h"
-#include "udpa/core/v1/resource_locator.upb.h"
-#include "validate/validate.upb.h"
-
-#include "upb/port_def.inc"
-
-static const upb_msglayout *const udpa_core_v1_CollectionEntry_submsgs[2] = {
- &udpa_core_v1_CollectionEntry_InlineEntry_msginit,
- &udpa_core_v1_ResourceLocator_msginit,
-};
-
-static const upb_msglayout_field udpa_core_v1_CollectionEntry__fields[2] = {
- {1, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 1, 11, 1},
- {2, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 0, 11, 1},
-};
-
-const upb_msglayout udpa_core_v1_CollectionEntry_msginit = {
- &udpa_core_v1_CollectionEntry_submsgs[0],
- &udpa_core_v1_CollectionEntry__fields[0],
- UPB_SIZE(8, 16), 2, false, 255,
-};
-
-static const upb_msglayout *const udpa_core_v1_CollectionEntry_InlineEntry_submsgs[1] = {
- &google_protobuf_Any_msginit,
-};
-
-static const upb_msglayout_field udpa_core_v1_CollectionEntry_InlineEntry__fields[3] = {
- {1, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {2, UPB_SIZE(12, 24), 0, 0, 9, 1},
- {3, UPB_SIZE(20, 40), 1, 0, 11, 1},
-};
-
-const upb_msglayout udpa_core_v1_CollectionEntry_InlineEntry_msginit = {
- &udpa_core_v1_CollectionEntry_InlineEntry_submsgs[0],
- &udpa_core_v1_CollectionEntry_InlineEntry__fields[0],
- UPB_SIZE(24, 48), 3, false, 255,
-};
-
-#include "upb/port_undef.inc"
-
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/collection_entry.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_COLLECTION_ENTRY_PROTO_UPB_H_
-#define UDPA_CORE_V1_COLLECTION_ENTRY_PROTO_UPB_H_
-
-#include "upb/msg.h"
-#include "upb/decode.h"
-#include "upb/decode_fast.h"
-#include "upb/encode.h"
-
-#include "upb/port_def.inc"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct udpa_core_v1_CollectionEntry;
-struct udpa_core_v1_CollectionEntry_InlineEntry;
-typedef struct udpa_core_v1_CollectionEntry udpa_core_v1_CollectionEntry;
-typedef struct udpa_core_v1_CollectionEntry_InlineEntry udpa_core_v1_CollectionEntry_InlineEntry;
-extern const upb_msglayout udpa_core_v1_CollectionEntry_msginit;
-extern const upb_msglayout udpa_core_v1_CollectionEntry_InlineEntry_msginit;
-struct google_protobuf_Any;
-struct udpa_core_v1_ResourceLocator;
-extern const upb_msglayout google_protobuf_Any_msginit;
-extern const upb_msglayout udpa_core_v1_ResourceLocator_msginit;
-
-
-/* udpa.core.v1.CollectionEntry */
-
-UPB_INLINE udpa_core_v1_CollectionEntry *udpa_core_v1_CollectionEntry_new(upb_arena *arena) {
- return (udpa_core_v1_CollectionEntry *)_upb_msg_new(&udpa_core_v1_CollectionEntry_msginit, arena);
-}
-UPB_INLINE udpa_core_v1_CollectionEntry *udpa_core_v1_CollectionEntry_parse(const char *buf, size_t size,
- upb_arena *arena) {
- udpa_core_v1_CollectionEntry *ret = udpa_core_v1_CollectionEntry_new(arena);
- return (ret && upb_decode(buf, size, ret, &udpa_core_v1_CollectionEntry_msginit, arena)) ? ret : NULL;
-}
-UPB_INLINE udpa_core_v1_CollectionEntry *udpa_core_v1_CollectionEntry_parse_ex(const char *buf, size_t size,
- upb_arena *arena, int options) {
- udpa_core_v1_CollectionEntry *ret = udpa_core_v1_CollectionEntry_new(arena);
- return (ret && _upb_decode(buf, size, ret, &udpa_core_v1_CollectionEntry_msginit, arena, options))
- ? ret : NULL;
-}
-UPB_INLINE char *udpa_core_v1_CollectionEntry_serialize(const udpa_core_v1_CollectionEntry *msg, upb_arena *arena, size_t *len) {
- return upb_encode(msg, &udpa_core_v1_CollectionEntry_msginit, arena, len);
-}
-
-typedef enum {
- udpa_core_v1_CollectionEntry_resource_specifier_locator = 1,
- udpa_core_v1_CollectionEntry_resource_specifier_inline_entry = 2,
- udpa_core_v1_CollectionEntry_resource_specifier_NOT_SET = 0
-} udpa_core_v1_CollectionEntry_resource_specifier_oneofcases;
-UPB_INLINE udpa_core_v1_CollectionEntry_resource_specifier_oneofcases udpa_core_v1_CollectionEntry_resource_specifier_case(const udpa_core_v1_CollectionEntry* msg) { return (udpa_core_v1_CollectionEntry_resource_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(4, 8), int32_t); }
-
-UPB_INLINE bool udpa_core_v1_CollectionEntry_has_locator(const udpa_core_v1_CollectionEntry *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 1; }
-UPB_INLINE const struct udpa_core_v1_ResourceLocator* udpa_core_v1_CollectionEntry_locator(const udpa_core_v1_CollectionEntry *msg) { return UPB_READ_ONEOF(msg, const struct udpa_core_v1_ResourceLocator*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 1, NULL); }
-UPB_INLINE bool udpa_core_v1_CollectionEntry_has_inline_entry(const udpa_core_v1_CollectionEntry *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 2; }
-UPB_INLINE const udpa_core_v1_CollectionEntry_InlineEntry* udpa_core_v1_CollectionEntry_inline_entry(const udpa_core_v1_CollectionEntry *msg) { return UPB_READ_ONEOF(msg, const udpa_core_v1_CollectionEntry_InlineEntry*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 2, NULL); }
-
-UPB_INLINE void udpa_core_v1_CollectionEntry_set_locator(udpa_core_v1_CollectionEntry *msg, struct udpa_core_v1_ResourceLocator* value) {
- UPB_WRITE_ONEOF(msg, struct udpa_core_v1_ResourceLocator*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 1);
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator* udpa_core_v1_CollectionEntry_mutable_locator(udpa_core_v1_CollectionEntry *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceLocator* sub = (struct udpa_core_v1_ResourceLocator*)udpa_core_v1_CollectionEntry_locator(msg);
- if (sub == NULL) {
- sub = (struct udpa_core_v1_ResourceLocator*)_upb_msg_new(&udpa_core_v1_ResourceLocator_msginit, arena);
- if (!sub) return NULL;
- udpa_core_v1_CollectionEntry_set_locator(msg, sub);
- }
- return sub;
-}
-UPB_INLINE void udpa_core_v1_CollectionEntry_set_inline_entry(udpa_core_v1_CollectionEntry *msg, udpa_core_v1_CollectionEntry_InlineEntry* value) {
- UPB_WRITE_ONEOF(msg, udpa_core_v1_CollectionEntry_InlineEntry*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 2);
-}
-UPB_INLINE struct udpa_core_v1_CollectionEntry_InlineEntry* udpa_core_v1_CollectionEntry_mutable_inline_entry(udpa_core_v1_CollectionEntry *msg, upb_arena *arena) {
- struct udpa_core_v1_CollectionEntry_InlineEntry* sub = (struct udpa_core_v1_CollectionEntry_InlineEntry*)udpa_core_v1_CollectionEntry_inline_entry(msg);
- if (sub == NULL) {
- sub = (struct udpa_core_v1_CollectionEntry_InlineEntry*)_upb_msg_new(&udpa_core_v1_CollectionEntry_InlineEntry_msginit, arena);
- if (!sub) return NULL;
- udpa_core_v1_CollectionEntry_set_inline_entry(msg, sub);
- }
- return sub;
-}
-
-/* udpa.core.v1.CollectionEntry.InlineEntry */
-
-UPB_INLINE udpa_core_v1_CollectionEntry_InlineEntry *udpa_core_v1_CollectionEntry_InlineEntry_new(upb_arena *arena) {
- return (udpa_core_v1_CollectionEntry_InlineEntry *)_upb_msg_new(&udpa_core_v1_CollectionEntry_InlineEntry_msginit, arena);
-}
-UPB_INLINE udpa_core_v1_CollectionEntry_InlineEntry *udpa_core_v1_CollectionEntry_InlineEntry_parse(const char *buf, size_t size,
- upb_arena *arena) {
- udpa_core_v1_CollectionEntry_InlineEntry *ret = udpa_core_v1_CollectionEntry_InlineEntry_new(arena);
- return (ret && upb_decode(buf, size, ret, &udpa_core_v1_CollectionEntry_InlineEntry_msginit, arena)) ? ret : NULL;
-}
-UPB_INLINE udpa_core_v1_CollectionEntry_InlineEntry *udpa_core_v1_CollectionEntry_InlineEntry_parse_ex(const char *buf, size_t size,
- upb_arena *arena, int options) {
- udpa_core_v1_CollectionEntry_InlineEntry *ret = udpa_core_v1_CollectionEntry_InlineEntry_new(arena);
- return (ret && _upb_decode(buf, size, ret, &udpa_core_v1_CollectionEntry_InlineEntry_msginit, arena, options))
- ? ret : NULL;
-}
-UPB_INLINE char *udpa_core_v1_CollectionEntry_InlineEntry_serialize(const udpa_core_v1_CollectionEntry_InlineEntry *msg, upb_arena *arena, size_t *len) {
- return upb_encode(msg, &udpa_core_v1_CollectionEntry_InlineEntry_msginit, arena, len);
-}
-
-UPB_INLINE upb_strview udpa_core_v1_CollectionEntry_InlineEntry_name(const udpa_core_v1_CollectionEntry_InlineEntry *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
-UPB_INLINE upb_strview udpa_core_v1_CollectionEntry_InlineEntry_version(const udpa_core_v1_CollectionEntry_InlineEntry *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
-UPB_INLINE bool udpa_core_v1_CollectionEntry_InlineEntry_has_resource(const udpa_core_v1_CollectionEntry_InlineEntry *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct google_protobuf_Any* udpa_core_v1_CollectionEntry_InlineEntry_resource(const udpa_core_v1_CollectionEntry_InlineEntry *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), const struct google_protobuf_Any*); }
-
-UPB_INLINE void udpa_core_v1_CollectionEntry_InlineEntry_set_name(udpa_core_v1_CollectionEntry_InlineEntry *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
-}
-UPB_INLINE void udpa_core_v1_CollectionEntry_InlineEntry_set_version(udpa_core_v1_CollectionEntry_InlineEntry *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
-}
-UPB_INLINE void udpa_core_v1_CollectionEntry_InlineEntry_set_resource(udpa_core_v1_CollectionEntry_InlineEntry *msg, struct google_protobuf_Any* value) {
- _upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(20, 40), struct google_protobuf_Any*) = value;
-}
-UPB_INLINE struct google_protobuf_Any* udpa_core_v1_CollectionEntry_InlineEntry_mutable_resource(udpa_core_v1_CollectionEntry_InlineEntry *msg, upb_arena *arena) {
- struct google_protobuf_Any* sub = (struct google_protobuf_Any*)udpa_core_v1_CollectionEntry_InlineEntry_resource(msg);
- if (sub == NULL) {
- sub = (struct google_protobuf_Any*)_upb_msg_new(&google_protobuf_Any_msginit, arena);
- if (!sub) return NULL;
- udpa_core_v1_CollectionEntry_InlineEntry_set_resource(msg, sub);
- }
- return sub;
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_COLLECTION_ENTRY_PROTO_UPB_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/context_params.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include <stddef.h>
-#include "upb/msg.h"
-#include "udpa/core/v1/context_params.upb.h"
-#include "udpa/annotations/status.upb.h"
-
-#include "upb/port_def.inc"
-
-static const upb_msglayout *const udpa_core_v1_ContextParams_submsgs[1] = {
- &udpa_core_v1_ContextParams_ParamsEntry_msginit,
-};
-
-static const upb_msglayout_field udpa_core_v1_ContextParams__fields[1] = {
- {1, UPB_SIZE(0, 0), 0, 0, 11, _UPB_LABEL_MAP},
-};
-
-const upb_msglayout udpa_core_v1_ContextParams_msginit = {
- &udpa_core_v1_ContextParams_submsgs[0],
- &udpa_core_v1_ContextParams__fields[0],
- UPB_SIZE(8, 8), 1, false, 255,
-};
-
-static const upb_msglayout_field udpa_core_v1_ContextParams_ParamsEntry__fields[2] = {
- {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
- {2, UPB_SIZE(8, 16), 0, 0, 9, 1},
-};
-
-const upb_msglayout udpa_core_v1_ContextParams_ParamsEntry_msginit = {
- NULL,
- &udpa_core_v1_ContextParams_ParamsEntry__fields[0],
- UPB_SIZE(16, 32), 2, false, 255,
-};
-
-#include "upb/port_undef.inc"
-
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/context_params.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_CONTEXT_PARAMS_PROTO_UPB_H_
-#define UDPA_CORE_V1_CONTEXT_PARAMS_PROTO_UPB_H_
-
-#include "upb/msg.h"
-#include "upb/decode.h"
-#include "upb/decode_fast.h"
-#include "upb/encode.h"
-
-#include "upb/port_def.inc"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct udpa_core_v1_ContextParams;
-struct udpa_core_v1_ContextParams_ParamsEntry;
-typedef struct udpa_core_v1_ContextParams udpa_core_v1_ContextParams;
-typedef struct udpa_core_v1_ContextParams_ParamsEntry udpa_core_v1_ContextParams_ParamsEntry;
-extern const upb_msglayout udpa_core_v1_ContextParams_msginit;
-extern const upb_msglayout udpa_core_v1_ContextParams_ParamsEntry_msginit;
-
-
-/* udpa.core.v1.ContextParams */
-
-UPB_INLINE udpa_core_v1_ContextParams *udpa_core_v1_ContextParams_new(upb_arena *arena) {
- return (udpa_core_v1_ContextParams *)_upb_msg_new(&udpa_core_v1_ContextParams_msginit, arena);
-}
-UPB_INLINE udpa_core_v1_ContextParams *udpa_core_v1_ContextParams_parse(const char *buf, size_t size,
- upb_arena *arena) {
- udpa_core_v1_ContextParams *ret = udpa_core_v1_ContextParams_new(arena);
- return (ret && upb_decode(buf, size, ret, &udpa_core_v1_ContextParams_msginit, arena)) ? ret : NULL;
-}
-UPB_INLINE udpa_core_v1_ContextParams *udpa_core_v1_ContextParams_parse_ex(const char *buf, size_t size,
- upb_arena *arena, int options) {
- udpa_core_v1_ContextParams *ret = udpa_core_v1_ContextParams_new(arena);
- return (ret && _upb_decode(buf, size, ret, &udpa_core_v1_ContextParams_msginit, arena, options))
- ? ret : NULL;
-}
-UPB_INLINE char *udpa_core_v1_ContextParams_serialize(const udpa_core_v1_ContextParams *msg, upb_arena *arena, size_t *len) {
- return upb_encode(msg, &udpa_core_v1_ContextParams_msginit, arena, len);
-}
-
-UPB_INLINE bool udpa_core_v1_ContextParams_has_params(const udpa_core_v1_ContextParams *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(0, 0)); }
-UPB_INLINE size_t udpa_core_v1_ContextParams_params_size(const udpa_core_v1_ContextParams *msg) {return _upb_msg_map_size(msg, UPB_SIZE(0, 0)); }
-UPB_INLINE bool udpa_core_v1_ContextParams_params_get(const udpa_core_v1_ContextParams *msg, upb_strview key, upb_strview *val) { return _upb_msg_map_get(msg, UPB_SIZE(0, 0), &key, 0, val, 0); }
-UPB_INLINE const udpa_core_v1_ContextParams_ParamsEntry* udpa_core_v1_ContextParams_params_next(const udpa_core_v1_ContextParams *msg, size_t* iter) { return (const udpa_core_v1_ContextParams_ParamsEntry*)_upb_msg_map_next(msg, UPB_SIZE(0, 0), iter); }
-
-UPB_INLINE void udpa_core_v1_ContextParams_params_clear(udpa_core_v1_ContextParams *msg) { _upb_msg_map_clear(msg, UPB_SIZE(0, 0)); }
-UPB_INLINE bool udpa_core_v1_ContextParams_params_set(udpa_core_v1_ContextParams *msg, upb_strview key, upb_strview val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(0, 0), &key, 0, &val, 0, a); }
-UPB_INLINE bool udpa_core_v1_ContextParams_params_delete(udpa_core_v1_ContextParams *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(0, 0), &key, 0); }
-UPB_INLINE udpa_core_v1_ContextParams_ParamsEntry* udpa_core_v1_ContextParams_params_nextmutable(udpa_core_v1_ContextParams *msg, size_t* iter) { return (udpa_core_v1_ContextParams_ParamsEntry*)_upb_msg_map_next(msg, UPB_SIZE(0, 0), iter); }
-
-/* udpa.core.v1.ContextParams.ParamsEntry */
-
-UPB_INLINE upb_strview udpa_core_v1_ContextParams_ParamsEntry_key(const udpa_core_v1_ContextParams_ParamsEntry *msg) {
- upb_strview ret;
- _upb_msg_map_key(msg, &ret, 0);
- return ret;
-}
-UPB_INLINE upb_strview udpa_core_v1_ContextParams_ParamsEntry_value(const udpa_core_v1_ContextParams_ParamsEntry *msg) {
- upb_strview ret;
- _upb_msg_map_value(msg, &ret, 0);
- return ret;
-}
-
-UPB_INLINE void udpa_core_v1_ContextParams_ParamsEntry_set_value(udpa_core_v1_ContextParams_ParamsEntry *msg, upb_strview value) {
- _upb_msg_map_set_value(msg, &value, 0);
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_CONTEXT_PARAMS_PROTO_UPB_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_RESOURCE_PROTO_UPB_H_
-#define UDPA_CORE_V1_RESOURCE_PROTO_UPB_H_
-
-#include "upb/msg.h"
-#include "upb/decode.h"
-#include "upb/decode_fast.h"
-#include "upb/encode.h"
-
-#include "upb/port_def.inc"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct udpa_core_v1_Resource;
-typedef struct udpa_core_v1_Resource udpa_core_v1_Resource;
-extern const upb_msglayout udpa_core_v1_Resource_msginit;
-struct google_protobuf_Any;
-struct udpa_core_v1_ResourceName;
-extern const upb_msglayout google_protobuf_Any_msginit;
-extern const upb_msglayout udpa_core_v1_ResourceName_msginit;
-
-
-/* udpa.core.v1.Resource */
-
-UPB_INLINE udpa_core_v1_Resource *udpa_core_v1_Resource_new(upb_arena *arena) {
- return (udpa_core_v1_Resource *)_upb_msg_new(&udpa_core_v1_Resource_msginit, arena);
-}
-UPB_INLINE udpa_core_v1_Resource *udpa_core_v1_Resource_parse(const char *buf, size_t size,
- upb_arena *arena) {
- udpa_core_v1_Resource *ret = udpa_core_v1_Resource_new(arena);
- return (ret && upb_decode(buf, size, ret, &udpa_core_v1_Resource_msginit, arena)) ? ret : NULL;
-}
-UPB_INLINE udpa_core_v1_Resource *udpa_core_v1_Resource_parse_ex(const char *buf, size_t size,
- upb_arena *arena, int options) {
- udpa_core_v1_Resource *ret = udpa_core_v1_Resource_new(arena);
- return (ret && _upb_decode(buf, size, ret, &udpa_core_v1_Resource_msginit, arena, options))
- ? ret : NULL;
-}
-UPB_INLINE char *udpa_core_v1_Resource_serialize(const udpa_core_v1_Resource *msg, upb_arena *arena, size_t *len) {
- return upb_encode(msg, &udpa_core_v1_Resource_msginit, arena, len);
-}
-
-UPB_INLINE bool udpa_core_v1_Resource_has_name(const udpa_core_v1_Resource *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct udpa_core_v1_ResourceName* udpa_core_v1_Resource_name(const udpa_core_v1_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct udpa_core_v1_ResourceName*); }
-UPB_INLINE upb_strview udpa_core_v1_Resource_version(const udpa_core_v1_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
-UPB_INLINE bool udpa_core_v1_Resource_has_resource(const udpa_core_v1_Resource *msg) { return _upb_hasbit(msg, 2); }
-UPB_INLINE const struct google_protobuf_Any* udpa_core_v1_Resource_resource(const udpa_core_v1_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const struct google_protobuf_Any*); }
-
-UPB_INLINE void udpa_core_v1_Resource_set_name(udpa_core_v1_Resource *msg, struct udpa_core_v1_ResourceName* value) {
- _upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(12, 24), struct udpa_core_v1_ResourceName*) = value;
-}
-UPB_INLINE struct udpa_core_v1_ResourceName* udpa_core_v1_Resource_mutable_name(udpa_core_v1_Resource *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceName* sub = (struct udpa_core_v1_ResourceName*)udpa_core_v1_Resource_name(msg);
- if (sub == NULL) {
- sub = (struct udpa_core_v1_ResourceName*)_upb_msg_new(&udpa_core_v1_ResourceName_msginit, arena);
- if (!sub) return NULL;
- udpa_core_v1_Resource_set_name(msg, sub);
- }
- return sub;
-}
-UPB_INLINE void udpa_core_v1_Resource_set_version(udpa_core_v1_Resource *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
-}
-UPB_INLINE void udpa_core_v1_Resource_set_resource(udpa_core_v1_Resource *msg, struct google_protobuf_Any* value) {
- _upb_sethas(msg, 2);
- *UPB_PTR_AT(msg, UPB_SIZE(16, 32), struct google_protobuf_Any*) = value;
-}
-UPB_INLINE struct google_protobuf_Any* udpa_core_v1_Resource_mutable_resource(udpa_core_v1_Resource *msg, upb_arena *arena) {
- struct google_protobuf_Any* sub = (struct google_protobuf_Any*)udpa_core_v1_Resource_resource(msg);
- if (sub == NULL) {
- sub = (struct google_protobuf_Any*)_upb_msg_new(&google_protobuf_Any_msginit, arena);
- if (!sub) return NULL;
- udpa_core_v1_Resource_set_resource(msg, sub);
- }
- return sub;
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_RESOURCE_PROTO_UPB_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource_locator.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include <stddef.h>
-#include "upb/msg.h"
-#include "udpa/core/v1/resource_locator.upb.h"
-#include "udpa/annotations/status.upb.h"
-#include "udpa/core/v1/context_params.upb.h"
-#include "validate/validate.upb.h"
-
-#include "upb/port_def.inc"
-
-static const upb_msglayout *const udpa_core_v1_ResourceLocator_submsgs[2] = {
- &udpa_core_v1_ContextParams_msginit,
- &udpa_core_v1_ResourceLocator_Directive_msginit,
-};
-
-static const upb_msglayout_field udpa_core_v1_ResourceLocator__fields[6] = {
- {1, UPB_SIZE(0, 0), 0, 0, 14, 1},
- {2, UPB_SIZE(20, 40), 0, 0, 9, 3},
- {3, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {4, UPB_SIZE(12, 24), 0, 0, 9, 1},
- {5, UPB_SIZE(28, 56), UPB_SIZE(-33, -65), 0, 11, 1},
- {6, UPB_SIZE(24, 48), 0, 1, 11, 3},
-};
-
-const upb_msglayout udpa_core_v1_ResourceLocator_msginit = {
- &udpa_core_v1_ResourceLocator_submsgs[0],
- &udpa_core_v1_ResourceLocator__fields[0],
- UPB_SIZE(40, 80), 6, false, 255,
-};
-
-static const upb_msglayout *const udpa_core_v1_ResourceLocator_Directive_submsgs[1] = {
- &udpa_core_v1_ResourceLocator_msginit,
-};
-
-static const upb_msglayout_field udpa_core_v1_ResourceLocator_Directive__fields[2] = {
- {1, UPB_SIZE(0, 0), UPB_SIZE(-9, -17), 0, 11, 1},
- {2, UPB_SIZE(0, 0), UPB_SIZE(-9, -17), 0, 9, 1},
-};
-
-const upb_msglayout udpa_core_v1_ResourceLocator_Directive_msginit = {
- &udpa_core_v1_ResourceLocator_Directive_submsgs[0],
- &udpa_core_v1_ResourceLocator_Directive__fields[0],
- UPB_SIZE(16, 32), 2, false, 255,
-};
-
-#include "upb/port_undef.inc"
-
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource_locator.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_RESOURCE_LOCATOR_PROTO_UPB_H_
-#define UDPA_CORE_V1_RESOURCE_LOCATOR_PROTO_UPB_H_
-
-#include "upb/msg.h"
-#include "upb/decode.h"
-#include "upb/decode_fast.h"
-#include "upb/encode.h"
-
-#include "upb/port_def.inc"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct udpa_core_v1_ResourceLocator;
-struct udpa_core_v1_ResourceLocator_Directive;
-typedef struct udpa_core_v1_ResourceLocator udpa_core_v1_ResourceLocator;
-typedef struct udpa_core_v1_ResourceLocator_Directive udpa_core_v1_ResourceLocator_Directive;
-extern const upb_msglayout udpa_core_v1_ResourceLocator_msginit;
-extern const upb_msglayout udpa_core_v1_ResourceLocator_Directive_msginit;
-struct udpa_core_v1_ContextParams;
-extern const upb_msglayout udpa_core_v1_ContextParams_msginit;
-
-typedef enum {
- udpa_core_v1_ResourceLocator_UDPA = 0,
- udpa_core_v1_ResourceLocator_HTTP = 1,
- udpa_core_v1_ResourceLocator_FILE = 2
-} udpa_core_v1_ResourceLocator_Scheme;
-
-
-/* udpa.core.v1.ResourceLocator */
-
-UPB_INLINE udpa_core_v1_ResourceLocator *udpa_core_v1_ResourceLocator_new(upb_arena *arena) {
- return (udpa_core_v1_ResourceLocator *)_upb_msg_new(&udpa_core_v1_ResourceLocator_msginit, arena);
-}
-UPB_INLINE udpa_core_v1_ResourceLocator *udpa_core_v1_ResourceLocator_parse(const char *buf, size_t size,
- upb_arena *arena) {
- udpa_core_v1_ResourceLocator *ret = udpa_core_v1_ResourceLocator_new(arena);
- return (ret && upb_decode(buf, size, ret, &udpa_core_v1_ResourceLocator_msginit, arena)) ? ret : NULL;
-}
-UPB_INLINE udpa_core_v1_ResourceLocator *udpa_core_v1_ResourceLocator_parse_ex(const char *buf, size_t size,
- upb_arena *arena, int options) {
- udpa_core_v1_ResourceLocator *ret = udpa_core_v1_ResourceLocator_new(arena);
- return (ret && _upb_decode(buf, size, ret, &udpa_core_v1_ResourceLocator_msginit, arena, options))
- ? ret : NULL;
-}
-UPB_INLINE char *udpa_core_v1_ResourceLocator_serialize(const udpa_core_v1_ResourceLocator *msg, upb_arena *arena, size_t *len) {
- return upb_encode(msg, &udpa_core_v1_ResourceLocator_msginit, arena, len);
-}
-
-typedef enum {
- udpa_core_v1_ResourceLocator_context_param_specifier_exact_context = 5,
- udpa_core_v1_ResourceLocator_context_param_specifier_NOT_SET = 0
-} udpa_core_v1_ResourceLocator_context_param_specifier_oneofcases;
-UPB_INLINE udpa_core_v1_ResourceLocator_context_param_specifier_oneofcases udpa_core_v1_ResourceLocator_context_param_specifier_case(const udpa_core_v1_ResourceLocator* msg) { return (udpa_core_v1_ResourceLocator_context_param_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(32, 64), int32_t); }
-
-UPB_INLINE int32_t udpa_core_v1_ResourceLocator_scheme(const udpa_core_v1_ResourceLocator *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), int32_t); }
-UPB_INLINE upb_strview const* udpa_core_v1_ResourceLocator_id(const udpa_core_v1_ResourceLocator *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(20, 40), len); }
-UPB_INLINE upb_strview udpa_core_v1_ResourceLocator_authority(const udpa_core_v1_ResourceLocator *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
-UPB_INLINE upb_strview udpa_core_v1_ResourceLocator_resource_type(const udpa_core_v1_ResourceLocator *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
-UPB_INLINE bool udpa_core_v1_ResourceLocator_has_exact_context(const udpa_core_v1_ResourceLocator *msg) { return _upb_getoneofcase(msg, UPB_SIZE(32, 64)) == 5; }
-UPB_INLINE const struct udpa_core_v1_ContextParams* udpa_core_v1_ResourceLocator_exact_context(const udpa_core_v1_ResourceLocator *msg) { return UPB_READ_ONEOF(msg, const struct udpa_core_v1_ContextParams*, UPB_SIZE(28, 56), UPB_SIZE(32, 64), 5, NULL); }
-UPB_INLINE bool udpa_core_v1_ResourceLocator_has_directives(const udpa_core_v1_ResourceLocator *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(24, 48)); }
-UPB_INLINE const udpa_core_v1_ResourceLocator_Directive* const* udpa_core_v1_ResourceLocator_directives(const udpa_core_v1_ResourceLocator *msg, size_t *len) { return (const udpa_core_v1_ResourceLocator_Directive* const*)_upb_array_accessor(msg, UPB_SIZE(24, 48), len); }
-
-UPB_INLINE void udpa_core_v1_ResourceLocator_set_scheme(udpa_core_v1_ResourceLocator *msg, int32_t value) {
- *UPB_PTR_AT(msg, UPB_SIZE(0, 0), int32_t) = value;
-}
-UPB_INLINE upb_strview* udpa_core_v1_ResourceLocator_mutable_id(udpa_core_v1_ResourceLocator *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(20, 40), len);
-}
-UPB_INLINE upb_strview* udpa_core_v1_ResourceLocator_resize_id(udpa_core_v1_ResourceLocator *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(20, 40), len, UPB_SIZE(3, 4), arena);
-}
-UPB_INLINE bool udpa_core_v1_ResourceLocator_add_id(udpa_core_v1_ResourceLocator *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(20, 40), UPB_SIZE(3, 4), &val,
- arena);
-}
-UPB_INLINE void udpa_core_v1_ResourceLocator_set_authority(udpa_core_v1_ResourceLocator *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
-}
-UPB_INLINE void udpa_core_v1_ResourceLocator_set_resource_type(udpa_core_v1_ResourceLocator *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
-}
-UPB_INLINE void udpa_core_v1_ResourceLocator_set_exact_context(udpa_core_v1_ResourceLocator *msg, struct udpa_core_v1_ContextParams* value) {
- UPB_WRITE_ONEOF(msg, struct udpa_core_v1_ContextParams*, UPB_SIZE(28, 56), value, UPB_SIZE(32, 64), 5);
-}
-UPB_INLINE struct udpa_core_v1_ContextParams* udpa_core_v1_ResourceLocator_mutable_exact_context(udpa_core_v1_ResourceLocator *msg, upb_arena *arena) {
- struct udpa_core_v1_ContextParams* sub = (struct udpa_core_v1_ContextParams*)udpa_core_v1_ResourceLocator_exact_context(msg);
- if (sub == NULL) {
- sub = (struct udpa_core_v1_ContextParams*)_upb_msg_new(&udpa_core_v1_ContextParams_msginit, arena);
- if (!sub) return NULL;
- udpa_core_v1_ResourceLocator_set_exact_context(msg, sub);
- }
- return sub;
-}
-UPB_INLINE udpa_core_v1_ResourceLocator_Directive** udpa_core_v1_ResourceLocator_mutable_directives(udpa_core_v1_ResourceLocator *msg, size_t *len) {
- return (udpa_core_v1_ResourceLocator_Directive**)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 48), len);
-}
-UPB_INLINE udpa_core_v1_ResourceLocator_Directive** udpa_core_v1_ResourceLocator_resize_directives(udpa_core_v1_ResourceLocator *msg, size_t len, upb_arena *arena) {
- return (udpa_core_v1_ResourceLocator_Directive**)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 48), len, UPB_SIZE(2, 3), arena);
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator_Directive* udpa_core_v1_ResourceLocator_add_directives(udpa_core_v1_ResourceLocator *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceLocator_Directive* sub = (struct udpa_core_v1_ResourceLocator_Directive*)_upb_msg_new(&udpa_core_v1_ResourceLocator_Directive_msginit, arena);
- bool ok = _upb_array_append_accessor2(
- msg, UPB_SIZE(24, 48), UPB_SIZE(2, 3), &sub, arena);
- if (!ok) return NULL;
- return sub;
-}
-
-/* udpa.core.v1.ResourceLocator.Directive */
-
-UPB_INLINE udpa_core_v1_ResourceLocator_Directive *udpa_core_v1_ResourceLocator_Directive_new(upb_arena *arena) {
- return (udpa_core_v1_ResourceLocator_Directive *)_upb_msg_new(&udpa_core_v1_ResourceLocator_Directive_msginit, arena);
-}
-UPB_INLINE udpa_core_v1_ResourceLocator_Directive *udpa_core_v1_ResourceLocator_Directive_parse(const char *buf, size_t size,
- upb_arena *arena) {
- udpa_core_v1_ResourceLocator_Directive *ret = udpa_core_v1_ResourceLocator_Directive_new(arena);
- return (ret && upb_decode(buf, size, ret, &udpa_core_v1_ResourceLocator_Directive_msginit, arena)) ? ret : NULL;
-}
-UPB_INLINE udpa_core_v1_ResourceLocator_Directive *udpa_core_v1_ResourceLocator_Directive_parse_ex(const char *buf, size_t size,
- upb_arena *arena, int options) {
- udpa_core_v1_ResourceLocator_Directive *ret = udpa_core_v1_ResourceLocator_Directive_new(arena);
- return (ret && _upb_decode(buf, size, ret, &udpa_core_v1_ResourceLocator_Directive_msginit, arena, options))
- ? ret : NULL;
-}
-UPB_INLINE char *udpa_core_v1_ResourceLocator_Directive_serialize(const udpa_core_v1_ResourceLocator_Directive *msg, upb_arena *arena, size_t *len) {
- return upb_encode(msg, &udpa_core_v1_ResourceLocator_Directive_msginit, arena, len);
-}
-
-typedef enum {
- udpa_core_v1_ResourceLocator_Directive_directive_alt = 1,
- udpa_core_v1_ResourceLocator_Directive_directive_entry = 2,
- udpa_core_v1_ResourceLocator_Directive_directive_NOT_SET = 0
-} udpa_core_v1_ResourceLocator_Directive_directive_oneofcases;
-UPB_INLINE udpa_core_v1_ResourceLocator_Directive_directive_oneofcases udpa_core_v1_ResourceLocator_Directive_directive_case(const udpa_core_v1_ResourceLocator_Directive* msg) { return (udpa_core_v1_ResourceLocator_Directive_directive_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(8, 16), int32_t); }
-
-UPB_INLINE bool udpa_core_v1_ResourceLocator_Directive_has_alt(const udpa_core_v1_ResourceLocator_Directive *msg) { return _upb_getoneofcase(msg, UPB_SIZE(8, 16)) == 1; }
-UPB_INLINE const udpa_core_v1_ResourceLocator* udpa_core_v1_ResourceLocator_Directive_alt(const udpa_core_v1_ResourceLocator_Directive *msg) { return UPB_READ_ONEOF(msg, const udpa_core_v1_ResourceLocator*, UPB_SIZE(0, 0), UPB_SIZE(8, 16), 1, NULL); }
-UPB_INLINE bool udpa_core_v1_ResourceLocator_Directive_has_entry(const udpa_core_v1_ResourceLocator_Directive *msg) { return _upb_getoneofcase(msg, UPB_SIZE(8, 16)) == 2; }
-UPB_INLINE upb_strview udpa_core_v1_ResourceLocator_Directive_entry(const udpa_core_v1_ResourceLocator_Directive *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(0, 0), UPB_SIZE(8, 16), 2, upb_strview_make("", strlen(""))); }
-
-UPB_INLINE void udpa_core_v1_ResourceLocator_Directive_set_alt(udpa_core_v1_ResourceLocator_Directive *msg, udpa_core_v1_ResourceLocator* value) {
- UPB_WRITE_ONEOF(msg, udpa_core_v1_ResourceLocator*, UPB_SIZE(0, 0), value, UPB_SIZE(8, 16), 1);
-}
-UPB_INLINE struct udpa_core_v1_ResourceLocator* udpa_core_v1_ResourceLocator_Directive_mutable_alt(udpa_core_v1_ResourceLocator_Directive *msg, upb_arena *arena) {
- struct udpa_core_v1_ResourceLocator* sub = (struct udpa_core_v1_ResourceLocator*)udpa_core_v1_ResourceLocator_Directive_alt(msg);
- if (sub == NULL) {
- sub = (struct udpa_core_v1_ResourceLocator*)_upb_msg_new(&udpa_core_v1_ResourceLocator_msginit, arena);
- if (!sub) return NULL;
- udpa_core_v1_ResourceLocator_Directive_set_alt(msg, sub);
- }
- return sub;
-}
-UPB_INLINE void udpa_core_v1_ResourceLocator_Directive_set_entry(udpa_core_v1_ResourceLocator_Directive *msg, upb_strview value) {
- UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(0, 0), value, UPB_SIZE(8, 16), 2);
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_RESOURCE_LOCATOR_PROTO_UPB_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource_name.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include <stddef.h>
-#include "upb/msg.h"
-#include "udpa/core/v1/resource_name.upb.h"
-#include "udpa/annotations/status.upb.h"
-#include "udpa/core/v1/context_params.upb.h"
-#include "validate/validate.upb.h"
-
-#include "upb/port_def.inc"
-
-static const upb_msglayout *const udpa_core_v1_ResourceName_submsgs[1] = {
- &udpa_core_v1_ContextParams_msginit,
-};
-
-static const upb_msglayout_field udpa_core_v1_ResourceName__fields[4] = {
- {1, UPB_SIZE(24, 48), 0, 0, 9, 3},
- {2, UPB_SIZE(4, 8), 0, 0, 9, 1},
- {3, UPB_SIZE(12, 24), 0, 0, 9, 1},
- {4, UPB_SIZE(20, 40), 1, 0, 11, 1},
-};
-
-const upb_msglayout udpa_core_v1_ResourceName_msginit = {
- &udpa_core_v1_ResourceName_submsgs[0],
- &udpa_core_v1_ResourceName__fields[0],
- UPB_SIZE(32, 64), 4, false, 255,
-};
-
-#include "upb/port_undef.inc"
-
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource_name.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_RESOURCE_NAME_PROTO_UPB_H_
-#define UDPA_CORE_V1_RESOURCE_NAME_PROTO_UPB_H_
-
-#include "upb/msg.h"
-#include "upb/decode.h"
-#include "upb/decode_fast.h"
-#include "upb/encode.h"
-
-#include "upb/port_def.inc"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct udpa_core_v1_ResourceName;
-typedef struct udpa_core_v1_ResourceName udpa_core_v1_ResourceName;
-extern const upb_msglayout udpa_core_v1_ResourceName_msginit;
-struct udpa_core_v1_ContextParams;
-extern const upb_msglayout udpa_core_v1_ContextParams_msginit;
-
-
-/* udpa.core.v1.ResourceName */
-
-UPB_INLINE udpa_core_v1_ResourceName *udpa_core_v1_ResourceName_new(upb_arena *arena) {
- return (udpa_core_v1_ResourceName *)_upb_msg_new(&udpa_core_v1_ResourceName_msginit, arena);
-}
-UPB_INLINE udpa_core_v1_ResourceName *udpa_core_v1_ResourceName_parse(const char *buf, size_t size,
- upb_arena *arena) {
- udpa_core_v1_ResourceName *ret = udpa_core_v1_ResourceName_new(arena);
- return (ret && upb_decode(buf, size, ret, &udpa_core_v1_ResourceName_msginit, arena)) ? ret : NULL;
-}
-UPB_INLINE udpa_core_v1_ResourceName *udpa_core_v1_ResourceName_parse_ex(const char *buf, size_t size,
- upb_arena *arena, int options) {
- udpa_core_v1_ResourceName *ret = udpa_core_v1_ResourceName_new(arena);
- return (ret && _upb_decode(buf, size, ret, &udpa_core_v1_ResourceName_msginit, arena, options))
- ? ret : NULL;
-}
-UPB_INLINE char *udpa_core_v1_ResourceName_serialize(const udpa_core_v1_ResourceName *msg, upb_arena *arena, size_t *len) {
- return upb_encode(msg, &udpa_core_v1_ResourceName_msginit, arena, len);
-}
-
-UPB_INLINE upb_strview const* udpa_core_v1_ResourceName_id(const udpa_core_v1_ResourceName *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(24, 48), len); }
-UPB_INLINE upb_strview udpa_core_v1_ResourceName_authority(const udpa_core_v1_ResourceName *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
-UPB_INLINE upb_strview udpa_core_v1_ResourceName_resource_type(const udpa_core_v1_ResourceName *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
-UPB_INLINE bool udpa_core_v1_ResourceName_has_context(const udpa_core_v1_ResourceName *msg) { return _upb_hasbit(msg, 1); }
-UPB_INLINE const struct udpa_core_v1_ContextParams* udpa_core_v1_ResourceName_context(const udpa_core_v1_ResourceName *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), const struct udpa_core_v1_ContextParams*); }
-
-UPB_INLINE upb_strview* udpa_core_v1_ResourceName_mutable_id(udpa_core_v1_ResourceName *msg, size_t *len) {
- return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(24, 48), len);
-}
-UPB_INLINE upb_strview* udpa_core_v1_ResourceName_resize_id(udpa_core_v1_ResourceName *msg, size_t len, upb_arena *arena) {
- return (upb_strview*)_upb_array_resize_accessor2(msg, UPB_SIZE(24, 48), len, UPB_SIZE(3, 4), arena);
-}
-UPB_INLINE bool udpa_core_v1_ResourceName_add_id(udpa_core_v1_ResourceName *msg, upb_strview val, upb_arena *arena) {
- return _upb_array_append_accessor2(msg, UPB_SIZE(24, 48), UPB_SIZE(3, 4), &val,
- arena);
-}
-UPB_INLINE void udpa_core_v1_ResourceName_set_authority(udpa_core_v1_ResourceName *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
-}
-UPB_INLINE void udpa_core_v1_ResourceName_set_resource_type(udpa_core_v1_ResourceName *msg, upb_strview value) {
- *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
-}
-UPB_INLINE void udpa_core_v1_ResourceName_set_context(udpa_core_v1_ResourceName *msg, struct udpa_core_v1_ContextParams* value) {
- _upb_sethas(msg, 1);
- *UPB_PTR_AT(msg, UPB_SIZE(20, 40), struct udpa_core_v1_ContextParams*) = value;
-}
-UPB_INLINE struct udpa_core_v1_ContextParams* udpa_core_v1_ResourceName_mutable_context(udpa_core_v1_ResourceName *msg, upb_arena *arena) {
- struct udpa_core_v1_ContextParams* sub = (struct udpa_core_v1_ContextParams*)udpa_core_v1_ResourceName_context(msg);
- if (sub == NULL) {
- sub = (struct udpa_core_v1_ContextParams*)_upb_msg_new(&udpa_core_v1_ContextParams_msginit, arena);
- if (!sub) return NULL;
- udpa_core_v1_ResourceName_set_context(msg, sub);
- }
- return sub;
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_RESOURCE_NAME_PROTO_UPB_H_ */
/* This file was generated by upbc (the upb compiler) from the input
* file:
*
- * udpa/core/v1/authority.proto
+ * xds/core/v3/authority.proto
*
* Do not edit -- your changes will be discarded when the file is
* regenerated. */
#include <stddef.h>
#include "upb/msg.h"
-#include "udpa/core/v1/authority.upb.h"
+#include "xds/core/v3/authority.upb.h"
#include "udpa/annotations/status.upb.h"
#include "validate/validate.upb.h"
#include "upb/port_def.inc"
-static const upb_msglayout_field udpa_core_v1_Authority__fields[1] = {
+static const upb_msglayout_field xds_core_v3_Authority__fields[1] = {
{1, UPB_SIZE(0, 0), 0, 0, 9, 1},
};
-const upb_msglayout udpa_core_v1_Authority_msginit = {
+const upb_msglayout xds_core_v3_Authority_msginit = {
NULL,
- &udpa_core_v1_Authority__fields[0],
+ &xds_core_v3_Authority__fields[0],
UPB_SIZE(8, 16), 1, false, 255,
};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/authority.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_AUTHORITY_PROTO_UPB_H_
+#define XDS_CORE_V3_AUTHORITY_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct xds_core_v3_Authority;
+typedef struct xds_core_v3_Authority xds_core_v3_Authority;
+extern const upb_msglayout xds_core_v3_Authority_msginit;
+
+
+/* xds.core.v3.Authority */
+
+UPB_INLINE xds_core_v3_Authority *xds_core_v3_Authority_new(upb_arena *arena) {
+ return (xds_core_v3_Authority *)_upb_msg_new(&xds_core_v3_Authority_msginit, arena);
+}
+UPB_INLINE xds_core_v3_Authority *xds_core_v3_Authority_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ xds_core_v3_Authority *ret = xds_core_v3_Authority_new(arena);
+ return (ret && upb_decode(buf, size, ret, &xds_core_v3_Authority_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE xds_core_v3_Authority *xds_core_v3_Authority_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ xds_core_v3_Authority *ret = xds_core_v3_Authority_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &xds_core_v3_Authority_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *xds_core_v3_Authority_serialize(const xds_core_v3_Authority *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &xds_core_v3_Authority_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview xds_core_v3_Authority_name(const xds_core_v3_Authority *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview); }
+
+UPB_INLINE void xds_core_v3_Authority_set_name(xds_core_v3_Authority *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(0, 0), upb_strview) = value;
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_AUTHORITY_PROTO_UPB_H_ */
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/collection_entry.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "xds/core/v3/collection_entry.upb.h"
+#include "google/protobuf/any.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "xds/core/v3/resource_locator.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const xds_core_v3_CollectionEntry_submsgs[2] = {
+ &xds_core_v3_CollectionEntry_InlineEntry_msginit,
+ &xds_core_v3_ResourceLocator_msginit,
+};
+
+static const upb_msglayout_field xds_core_v3_CollectionEntry__fields[2] = {
+ {1, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 1, 11, 1},
+ {2, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 0, 11, 1},
+};
+
+const upb_msglayout xds_core_v3_CollectionEntry_msginit = {
+ &xds_core_v3_CollectionEntry_submsgs[0],
+ &xds_core_v3_CollectionEntry__fields[0],
+ UPB_SIZE(8, 16), 2, false, 255,
+};
+
+static const upb_msglayout *const xds_core_v3_CollectionEntry_InlineEntry_submsgs[1] = {
+ &google_protobuf_Any_msginit,
+};
+
+static const upb_msglayout_field xds_core_v3_CollectionEntry_InlineEntry__fields[3] = {
+ {1, UPB_SIZE(4, 8), 0, 0, 9, 1},
+ {2, UPB_SIZE(12, 24), 0, 0, 9, 1},
+ {3, UPB_SIZE(20, 40), 1, 0, 11, 1},
+};
+
+const upb_msglayout xds_core_v3_CollectionEntry_InlineEntry_msginit = {
+ &xds_core_v3_CollectionEntry_InlineEntry_submsgs[0],
+ &xds_core_v3_CollectionEntry_InlineEntry__fields[0],
+ UPB_SIZE(24, 48), 3, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/collection_entry.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_COLLECTION_ENTRY_PROTO_UPB_H_
+#define XDS_CORE_V3_COLLECTION_ENTRY_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct xds_core_v3_CollectionEntry;
+struct xds_core_v3_CollectionEntry_InlineEntry;
+typedef struct xds_core_v3_CollectionEntry xds_core_v3_CollectionEntry;
+typedef struct xds_core_v3_CollectionEntry_InlineEntry xds_core_v3_CollectionEntry_InlineEntry;
+extern const upb_msglayout xds_core_v3_CollectionEntry_msginit;
+extern const upb_msglayout xds_core_v3_CollectionEntry_InlineEntry_msginit;
+struct google_protobuf_Any;
+struct xds_core_v3_ResourceLocator;
+extern const upb_msglayout google_protobuf_Any_msginit;
+extern const upb_msglayout xds_core_v3_ResourceLocator_msginit;
+
+
+/* xds.core.v3.CollectionEntry */
+
+UPB_INLINE xds_core_v3_CollectionEntry *xds_core_v3_CollectionEntry_new(upb_arena *arena) {
+ return (xds_core_v3_CollectionEntry *)_upb_msg_new(&xds_core_v3_CollectionEntry_msginit, arena);
+}
+UPB_INLINE xds_core_v3_CollectionEntry *xds_core_v3_CollectionEntry_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ xds_core_v3_CollectionEntry *ret = xds_core_v3_CollectionEntry_new(arena);
+ return (ret && upb_decode(buf, size, ret, &xds_core_v3_CollectionEntry_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE xds_core_v3_CollectionEntry *xds_core_v3_CollectionEntry_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ xds_core_v3_CollectionEntry *ret = xds_core_v3_CollectionEntry_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &xds_core_v3_CollectionEntry_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *xds_core_v3_CollectionEntry_serialize(const xds_core_v3_CollectionEntry *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &xds_core_v3_CollectionEntry_msginit, arena, len);
+}
+
+typedef enum {
+ xds_core_v3_CollectionEntry_resource_specifier_locator = 1,
+ xds_core_v3_CollectionEntry_resource_specifier_inline_entry = 2,
+ xds_core_v3_CollectionEntry_resource_specifier_NOT_SET = 0
+} xds_core_v3_CollectionEntry_resource_specifier_oneofcases;
+UPB_INLINE xds_core_v3_CollectionEntry_resource_specifier_oneofcases xds_core_v3_CollectionEntry_resource_specifier_case(const xds_core_v3_CollectionEntry* msg) { return (xds_core_v3_CollectionEntry_resource_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(4, 8), int32_t); }
+
+UPB_INLINE bool xds_core_v3_CollectionEntry_has_locator(const xds_core_v3_CollectionEntry *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 1; }
+UPB_INLINE const struct xds_core_v3_ResourceLocator* xds_core_v3_CollectionEntry_locator(const xds_core_v3_CollectionEntry *msg) { return UPB_READ_ONEOF(msg, const struct xds_core_v3_ResourceLocator*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 1, NULL); }
+UPB_INLINE bool xds_core_v3_CollectionEntry_has_inline_entry(const xds_core_v3_CollectionEntry *msg) { return _upb_getoneofcase(msg, UPB_SIZE(4, 8)) == 2; }
+UPB_INLINE const xds_core_v3_CollectionEntry_InlineEntry* xds_core_v3_CollectionEntry_inline_entry(const xds_core_v3_CollectionEntry *msg) { return UPB_READ_ONEOF(msg, const xds_core_v3_CollectionEntry_InlineEntry*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 2, NULL); }
+
+UPB_INLINE void xds_core_v3_CollectionEntry_set_locator(xds_core_v3_CollectionEntry *msg, struct xds_core_v3_ResourceLocator* value) {
+ UPB_WRITE_ONEOF(msg, struct xds_core_v3_ResourceLocator*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 1);
+}
+UPB_INLINE struct xds_core_v3_ResourceLocator* xds_core_v3_CollectionEntry_mutable_locator(xds_core_v3_CollectionEntry *msg, upb_arena *arena) {
+ struct xds_core_v3_ResourceLocator* sub = (struct xds_core_v3_ResourceLocator*)xds_core_v3_CollectionEntry_locator(msg);
+ if (sub == NULL) {
+ sub = (struct xds_core_v3_ResourceLocator*)_upb_msg_new(&xds_core_v3_ResourceLocator_msginit, arena);
+ if (!sub) return NULL;
+ xds_core_v3_CollectionEntry_set_locator(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void xds_core_v3_CollectionEntry_set_inline_entry(xds_core_v3_CollectionEntry *msg, xds_core_v3_CollectionEntry_InlineEntry* value) {
+ UPB_WRITE_ONEOF(msg, xds_core_v3_CollectionEntry_InlineEntry*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 2);
+}
+UPB_INLINE struct xds_core_v3_CollectionEntry_InlineEntry* xds_core_v3_CollectionEntry_mutable_inline_entry(xds_core_v3_CollectionEntry *msg, upb_arena *arena) {
+ struct xds_core_v3_CollectionEntry_InlineEntry* sub = (struct xds_core_v3_CollectionEntry_InlineEntry*)xds_core_v3_CollectionEntry_inline_entry(msg);
+ if (sub == NULL) {
+ sub = (struct xds_core_v3_CollectionEntry_InlineEntry*)_upb_msg_new(&xds_core_v3_CollectionEntry_InlineEntry_msginit, arena);
+ if (!sub) return NULL;
+ xds_core_v3_CollectionEntry_set_inline_entry(msg, sub);
+ }
+ return sub;
+}
+
+/* xds.core.v3.CollectionEntry.InlineEntry */
+
+UPB_INLINE xds_core_v3_CollectionEntry_InlineEntry *xds_core_v3_CollectionEntry_InlineEntry_new(upb_arena *arena) {
+ return (xds_core_v3_CollectionEntry_InlineEntry *)_upb_msg_new(&xds_core_v3_CollectionEntry_InlineEntry_msginit, arena);
+}
+UPB_INLINE xds_core_v3_CollectionEntry_InlineEntry *xds_core_v3_CollectionEntry_InlineEntry_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ xds_core_v3_CollectionEntry_InlineEntry *ret = xds_core_v3_CollectionEntry_InlineEntry_new(arena);
+ return (ret && upb_decode(buf, size, ret, &xds_core_v3_CollectionEntry_InlineEntry_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE xds_core_v3_CollectionEntry_InlineEntry *xds_core_v3_CollectionEntry_InlineEntry_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ xds_core_v3_CollectionEntry_InlineEntry *ret = xds_core_v3_CollectionEntry_InlineEntry_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &xds_core_v3_CollectionEntry_InlineEntry_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *xds_core_v3_CollectionEntry_InlineEntry_serialize(const xds_core_v3_CollectionEntry_InlineEntry *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &xds_core_v3_CollectionEntry_InlineEntry_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview xds_core_v3_CollectionEntry_InlineEntry_name(const xds_core_v3_CollectionEntry_InlineEntry *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+UPB_INLINE upb_strview xds_core_v3_CollectionEntry_InlineEntry_version(const xds_core_v3_CollectionEntry_InlineEntry *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
+UPB_INLINE bool xds_core_v3_CollectionEntry_InlineEntry_has_resource(const xds_core_v3_CollectionEntry_InlineEntry *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct google_protobuf_Any* xds_core_v3_CollectionEntry_InlineEntry_resource(const xds_core_v3_CollectionEntry_InlineEntry *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), const struct google_protobuf_Any*); }
+
+UPB_INLINE void xds_core_v3_CollectionEntry_InlineEntry_set_name(xds_core_v3_CollectionEntry_InlineEntry *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+}
+UPB_INLINE void xds_core_v3_CollectionEntry_InlineEntry_set_version(xds_core_v3_CollectionEntry_InlineEntry *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
+}
+UPB_INLINE void xds_core_v3_CollectionEntry_InlineEntry_set_resource(xds_core_v3_CollectionEntry_InlineEntry *msg, struct google_protobuf_Any* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(20, 40), struct google_protobuf_Any*) = value;
+}
+UPB_INLINE struct google_protobuf_Any* xds_core_v3_CollectionEntry_InlineEntry_mutable_resource(xds_core_v3_CollectionEntry_InlineEntry *msg, upb_arena *arena) {
+ struct google_protobuf_Any* sub = (struct google_protobuf_Any*)xds_core_v3_CollectionEntry_InlineEntry_resource(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Any*)_upb_msg_new(&google_protobuf_Any_msginit, arena);
+ if (!sub) return NULL;
+ xds_core_v3_CollectionEntry_InlineEntry_set_resource(msg, sub);
+ }
+ return sub;
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_COLLECTION_ENTRY_PROTO_UPB_H_ */
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/context_params.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "xds/core/v3/context_params.upb.h"
+#include "udpa/annotations/status.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const xds_core_v3_ContextParams_submsgs[1] = {
+ &xds_core_v3_ContextParams_ParamsEntry_msginit,
+};
+
+static const upb_msglayout_field xds_core_v3_ContextParams__fields[1] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 11, _UPB_LABEL_MAP},
+};
+
+const upb_msglayout xds_core_v3_ContextParams_msginit = {
+ &xds_core_v3_ContextParams_submsgs[0],
+ &xds_core_v3_ContextParams__fields[0],
+ UPB_SIZE(8, 8), 1, false, 255,
+};
+
+static const upb_msglayout_field xds_core_v3_ContextParams_ParamsEntry__fields[2] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 9, 1},
+ {2, UPB_SIZE(8, 16), 0, 0, 9, 1},
+};
+
+const upb_msglayout xds_core_v3_ContextParams_ParamsEntry_msginit = {
+ NULL,
+ &xds_core_v3_ContextParams_ParamsEntry__fields[0],
+ UPB_SIZE(16, 32), 2, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/context_params.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_CONTEXT_PARAMS_PROTO_UPB_H_
+#define XDS_CORE_V3_CONTEXT_PARAMS_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct xds_core_v3_ContextParams;
+struct xds_core_v3_ContextParams_ParamsEntry;
+typedef struct xds_core_v3_ContextParams xds_core_v3_ContextParams;
+typedef struct xds_core_v3_ContextParams_ParamsEntry xds_core_v3_ContextParams_ParamsEntry;
+extern const upb_msglayout xds_core_v3_ContextParams_msginit;
+extern const upb_msglayout xds_core_v3_ContextParams_ParamsEntry_msginit;
+
+
+/* xds.core.v3.ContextParams */
+
+UPB_INLINE xds_core_v3_ContextParams *xds_core_v3_ContextParams_new(upb_arena *arena) {
+ return (xds_core_v3_ContextParams *)_upb_msg_new(&xds_core_v3_ContextParams_msginit, arena);
+}
+UPB_INLINE xds_core_v3_ContextParams *xds_core_v3_ContextParams_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ xds_core_v3_ContextParams *ret = xds_core_v3_ContextParams_new(arena);
+ return (ret && upb_decode(buf, size, ret, &xds_core_v3_ContextParams_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE xds_core_v3_ContextParams *xds_core_v3_ContextParams_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ xds_core_v3_ContextParams *ret = xds_core_v3_ContextParams_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &xds_core_v3_ContextParams_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *xds_core_v3_ContextParams_serialize(const xds_core_v3_ContextParams *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &xds_core_v3_ContextParams_msginit, arena, len);
+}
+
+UPB_INLINE bool xds_core_v3_ContextParams_has_params(const xds_core_v3_ContextParams *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(0, 0)); }
+UPB_INLINE size_t xds_core_v3_ContextParams_params_size(const xds_core_v3_ContextParams *msg) {return _upb_msg_map_size(msg, UPB_SIZE(0, 0)); }
+UPB_INLINE bool xds_core_v3_ContextParams_params_get(const xds_core_v3_ContextParams *msg, upb_strview key, upb_strview *val) { return _upb_msg_map_get(msg, UPB_SIZE(0, 0), &key, 0, val, 0); }
+UPB_INLINE const xds_core_v3_ContextParams_ParamsEntry* xds_core_v3_ContextParams_params_next(const xds_core_v3_ContextParams *msg, size_t* iter) { return (const xds_core_v3_ContextParams_ParamsEntry*)_upb_msg_map_next(msg, UPB_SIZE(0, 0), iter); }
+
+UPB_INLINE void xds_core_v3_ContextParams_params_clear(xds_core_v3_ContextParams *msg) { _upb_msg_map_clear(msg, UPB_SIZE(0, 0)); }
+UPB_INLINE bool xds_core_v3_ContextParams_params_set(xds_core_v3_ContextParams *msg, upb_strview key, upb_strview val, upb_arena *a) { return _upb_msg_map_set(msg, UPB_SIZE(0, 0), &key, 0, &val, 0, a); }
+UPB_INLINE bool xds_core_v3_ContextParams_params_delete(xds_core_v3_ContextParams *msg, upb_strview key) { return _upb_msg_map_delete(msg, UPB_SIZE(0, 0), &key, 0); }
+UPB_INLINE xds_core_v3_ContextParams_ParamsEntry* xds_core_v3_ContextParams_params_nextmutable(xds_core_v3_ContextParams *msg, size_t* iter) { return (xds_core_v3_ContextParams_ParamsEntry*)_upb_msg_map_next(msg, UPB_SIZE(0, 0), iter); }
+
+/* xds.core.v3.ContextParams.ParamsEntry */
+
+UPB_INLINE upb_strview xds_core_v3_ContextParams_ParamsEntry_key(const xds_core_v3_ContextParams_ParamsEntry *msg) {
+ upb_strview ret;
+ _upb_msg_map_key(msg, &ret, 0);
+ return ret;
+}
+UPB_INLINE upb_strview xds_core_v3_ContextParams_ParamsEntry_value(const xds_core_v3_ContextParams_ParamsEntry *msg) {
+ upb_strview ret;
+ _upb_msg_map_value(msg, &ret, 0);
+ return ret;
+}
+
+UPB_INLINE void xds_core_v3_ContextParams_ParamsEntry_set_value(xds_core_v3_ContextParams_ParamsEntry *msg, upb_strview value) {
+ _upb_msg_map_set_value(msg, &value, 0);
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_CONTEXT_PARAMS_PROTO_UPB_H_ */
/* This file was generated by upbc (the upb compiler) from the input
* file:
*
- * udpa/core/v1/resource.proto
+ * xds/core/v3/resource.proto
*
* Do not edit -- your changes will be discarded when the file is
* regenerated. */
#include <stddef.h>
#include "upb/msg.h"
-#include "udpa/core/v1/resource.upb.h"
+#include "xds/core/v3/resource.upb.h"
#include "google/protobuf/any.upb.h"
#include "udpa/annotations/status.upb.h"
-#include "udpa/core/v1/resource_name.upb.h"
+#include "xds/core/v3/resource_name.upb.h"
#include "upb/port_def.inc"
-static const upb_msglayout *const udpa_core_v1_Resource_submsgs[2] = {
+static const upb_msglayout *const xds_core_v3_Resource_submsgs[2] = {
&google_protobuf_Any_msginit,
- &udpa_core_v1_ResourceName_msginit,
+ &xds_core_v3_ResourceName_msginit,
};
-static const upb_msglayout_field udpa_core_v1_Resource__fields[3] = {
+static const upb_msglayout_field xds_core_v3_Resource__fields[3] = {
{1, UPB_SIZE(12, 24), 1, 1, 11, 1},
{2, UPB_SIZE(4, 8), 0, 0, 9, 1},
{3, UPB_SIZE(16, 32), 2, 0, 11, 1},
};
-const upb_msglayout udpa_core_v1_Resource_msginit = {
- &udpa_core_v1_Resource_submsgs[0],
- &udpa_core_v1_Resource__fields[0],
+const upb_msglayout xds_core_v3_Resource_msginit = {
+ &xds_core_v3_Resource_submsgs[0],
+ &xds_core_v3_Resource__fields[0],
UPB_SIZE(24, 48), 3, false, 255,
};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_RESOURCE_PROTO_UPB_H_
+#define XDS_CORE_V3_RESOURCE_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct xds_core_v3_Resource;
+typedef struct xds_core_v3_Resource xds_core_v3_Resource;
+extern const upb_msglayout xds_core_v3_Resource_msginit;
+struct google_protobuf_Any;
+struct xds_core_v3_ResourceName;
+extern const upb_msglayout google_protobuf_Any_msginit;
+extern const upb_msglayout xds_core_v3_ResourceName_msginit;
+
+
+/* xds.core.v3.Resource */
+
+UPB_INLINE xds_core_v3_Resource *xds_core_v3_Resource_new(upb_arena *arena) {
+ return (xds_core_v3_Resource *)_upb_msg_new(&xds_core_v3_Resource_msginit, arena);
+}
+UPB_INLINE xds_core_v3_Resource *xds_core_v3_Resource_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ xds_core_v3_Resource *ret = xds_core_v3_Resource_new(arena);
+ return (ret && upb_decode(buf, size, ret, &xds_core_v3_Resource_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE xds_core_v3_Resource *xds_core_v3_Resource_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ xds_core_v3_Resource *ret = xds_core_v3_Resource_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &xds_core_v3_Resource_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *xds_core_v3_Resource_serialize(const xds_core_v3_Resource *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &xds_core_v3_Resource_msginit, arena, len);
+}
+
+UPB_INLINE bool xds_core_v3_Resource_has_name(const xds_core_v3_Resource *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct xds_core_v3_ResourceName* xds_core_v3_Resource_name(const xds_core_v3_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), const struct xds_core_v3_ResourceName*); }
+UPB_INLINE upb_strview xds_core_v3_Resource_version(const xds_core_v3_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+UPB_INLINE bool xds_core_v3_Resource_has_resource(const xds_core_v3_Resource *msg) { return _upb_hasbit(msg, 2); }
+UPB_INLINE const struct google_protobuf_Any* xds_core_v3_Resource_resource(const xds_core_v3_Resource *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(16, 32), const struct google_protobuf_Any*); }
+
+UPB_INLINE void xds_core_v3_Resource_set_name(xds_core_v3_Resource *msg, struct xds_core_v3_ResourceName* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), struct xds_core_v3_ResourceName*) = value;
+}
+UPB_INLINE struct xds_core_v3_ResourceName* xds_core_v3_Resource_mutable_name(xds_core_v3_Resource *msg, upb_arena *arena) {
+ struct xds_core_v3_ResourceName* sub = (struct xds_core_v3_ResourceName*)xds_core_v3_Resource_name(msg);
+ if (sub == NULL) {
+ sub = (struct xds_core_v3_ResourceName*)_upb_msg_new(&xds_core_v3_ResourceName_msginit, arena);
+ if (!sub) return NULL;
+ xds_core_v3_Resource_set_name(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void xds_core_v3_Resource_set_version(xds_core_v3_Resource *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+}
+UPB_INLINE void xds_core_v3_Resource_set_resource(xds_core_v3_Resource *msg, struct google_protobuf_Any* value) {
+ _upb_sethas(msg, 2);
+ *UPB_PTR_AT(msg, UPB_SIZE(16, 32), struct google_protobuf_Any*) = value;
+}
+UPB_INLINE struct google_protobuf_Any* xds_core_v3_Resource_mutable_resource(xds_core_v3_Resource *msg, upb_arena *arena) {
+ struct google_protobuf_Any* sub = (struct google_protobuf_Any*)xds_core_v3_Resource_resource(msg);
+ if (sub == NULL) {
+ sub = (struct google_protobuf_Any*)_upb_msg_new(&google_protobuf_Any_msginit, arena);
+ if (!sub) return NULL;
+ xds_core_v3_Resource_set_resource(msg, sub);
+ }
+ return sub;
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_RESOURCE_PROTO_UPB_H_ */
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource_locator.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "xds/core/v3/resource_locator.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "xds/core/v3/context_params.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const xds_core_v3_ResourceLocator_submsgs[2] = {
+ &xds_core_v3_ContextParams_msginit,
+ &xds_core_v3_ResourceLocator_Directive_msginit,
+};
+
+static const upb_msglayout_field xds_core_v3_ResourceLocator__fields[6] = {
+ {1, UPB_SIZE(0, 0), 0, 0, 14, 1},
+ {2, UPB_SIZE(4, 8), 0, 0, 9, 1},
+ {3, UPB_SIZE(12, 24), 0, 0, 9, 1},
+ {4, UPB_SIZE(20, 40), 0, 0, 9, 1},
+ {5, UPB_SIZE(32, 64), UPB_SIZE(-37, -73), 0, 11, 1},
+ {6, UPB_SIZE(28, 56), 0, 1, 11, 3},
+};
+
+const upb_msglayout xds_core_v3_ResourceLocator_msginit = {
+ &xds_core_v3_ResourceLocator_submsgs[0],
+ &xds_core_v3_ResourceLocator__fields[0],
+ UPB_SIZE(40, 80), 6, false, 255,
+};
+
+static const upb_msglayout *const xds_core_v3_ResourceLocator_Directive_submsgs[1] = {
+ &xds_core_v3_ResourceLocator_msginit,
+};
+
+static const upb_msglayout_field xds_core_v3_ResourceLocator_Directive__fields[2] = {
+ {1, UPB_SIZE(0, 0), UPB_SIZE(-9, -17), 0, 11, 1},
+ {2, UPB_SIZE(0, 0), UPB_SIZE(-9, -17), 0, 9, 1},
+};
+
+const upb_msglayout xds_core_v3_ResourceLocator_Directive_msginit = {
+ &xds_core_v3_ResourceLocator_Directive_submsgs[0],
+ &xds_core_v3_ResourceLocator_Directive__fields[0],
+ UPB_SIZE(16, 32), 2, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource_locator.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_RESOURCE_LOCATOR_PROTO_UPB_H_
+#define XDS_CORE_V3_RESOURCE_LOCATOR_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct xds_core_v3_ResourceLocator;
+struct xds_core_v3_ResourceLocator_Directive;
+typedef struct xds_core_v3_ResourceLocator xds_core_v3_ResourceLocator;
+typedef struct xds_core_v3_ResourceLocator_Directive xds_core_v3_ResourceLocator_Directive;
+extern const upb_msglayout xds_core_v3_ResourceLocator_msginit;
+extern const upb_msglayout xds_core_v3_ResourceLocator_Directive_msginit;
+struct xds_core_v3_ContextParams;
+extern const upb_msglayout xds_core_v3_ContextParams_msginit;
+
+typedef enum {
+ xds_core_v3_ResourceLocator_XDSTP = 0,
+ xds_core_v3_ResourceLocator_HTTP = 1,
+ xds_core_v3_ResourceLocator_FILE = 2
+} xds_core_v3_ResourceLocator_Scheme;
+
+
+/* xds.core.v3.ResourceLocator */
+
+UPB_INLINE xds_core_v3_ResourceLocator *xds_core_v3_ResourceLocator_new(upb_arena *arena) {
+ return (xds_core_v3_ResourceLocator *)_upb_msg_new(&xds_core_v3_ResourceLocator_msginit, arena);
+}
+UPB_INLINE xds_core_v3_ResourceLocator *xds_core_v3_ResourceLocator_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ xds_core_v3_ResourceLocator *ret = xds_core_v3_ResourceLocator_new(arena);
+ return (ret && upb_decode(buf, size, ret, &xds_core_v3_ResourceLocator_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE xds_core_v3_ResourceLocator *xds_core_v3_ResourceLocator_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ xds_core_v3_ResourceLocator *ret = xds_core_v3_ResourceLocator_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &xds_core_v3_ResourceLocator_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *xds_core_v3_ResourceLocator_serialize(const xds_core_v3_ResourceLocator *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &xds_core_v3_ResourceLocator_msginit, arena, len);
+}
+
+typedef enum {
+ xds_core_v3_ResourceLocator_context_param_specifier_exact_context = 5,
+ xds_core_v3_ResourceLocator_context_param_specifier_NOT_SET = 0
+} xds_core_v3_ResourceLocator_context_param_specifier_oneofcases;
+UPB_INLINE xds_core_v3_ResourceLocator_context_param_specifier_oneofcases xds_core_v3_ResourceLocator_context_param_specifier_case(const xds_core_v3_ResourceLocator* msg) { return (xds_core_v3_ResourceLocator_context_param_specifier_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(36, 72), int32_t); }
+
+UPB_INLINE int32_t xds_core_v3_ResourceLocator_scheme(const xds_core_v3_ResourceLocator *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(0, 0), int32_t); }
+UPB_INLINE upb_strview xds_core_v3_ResourceLocator_id(const xds_core_v3_ResourceLocator *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+UPB_INLINE upb_strview xds_core_v3_ResourceLocator_authority(const xds_core_v3_ResourceLocator *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
+UPB_INLINE upb_strview xds_core_v3_ResourceLocator_resource_type(const xds_core_v3_ResourceLocator *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview); }
+UPB_INLINE bool xds_core_v3_ResourceLocator_has_exact_context(const xds_core_v3_ResourceLocator *msg) { return _upb_getoneofcase(msg, UPB_SIZE(36, 72)) == 5; }
+UPB_INLINE const struct xds_core_v3_ContextParams* xds_core_v3_ResourceLocator_exact_context(const xds_core_v3_ResourceLocator *msg) { return UPB_READ_ONEOF(msg, const struct xds_core_v3_ContextParams*, UPB_SIZE(32, 64), UPB_SIZE(36, 72), 5, NULL); }
+UPB_INLINE bool xds_core_v3_ResourceLocator_has_directives(const xds_core_v3_ResourceLocator *msg) { return _upb_has_submsg_nohasbit(msg, UPB_SIZE(28, 56)); }
+UPB_INLINE const xds_core_v3_ResourceLocator_Directive* const* xds_core_v3_ResourceLocator_directives(const xds_core_v3_ResourceLocator *msg, size_t *len) { return (const xds_core_v3_ResourceLocator_Directive* const*)_upb_array_accessor(msg, UPB_SIZE(28, 56), len); }
+
+UPB_INLINE void xds_core_v3_ResourceLocator_set_scheme(xds_core_v3_ResourceLocator *msg, int32_t value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(0, 0), int32_t) = value;
+}
+UPB_INLINE void xds_core_v3_ResourceLocator_set_id(xds_core_v3_ResourceLocator *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+}
+UPB_INLINE void xds_core_v3_ResourceLocator_set_authority(xds_core_v3_ResourceLocator *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
+}
+UPB_INLINE void xds_core_v3_ResourceLocator_set_resource_type(xds_core_v3_ResourceLocator *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview) = value;
+}
+UPB_INLINE void xds_core_v3_ResourceLocator_set_exact_context(xds_core_v3_ResourceLocator *msg, struct xds_core_v3_ContextParams* value) {
+ UPB_WRITE_ONEOF(msg, struct xds_core_v3_ContextParams*, UPB_SIZE(32, 64), value, UPB_SIZE(36, 72), 5);
+}
+UPB_INLINE struct xds_core_v3_ContextParams* xds_core_v3_ResourceLocator_mutable_exact_context(xds_core_v3_ResourceLocator *msg, upb_arena *arena) {
+ struct xds_core_v3_ContextParams* sub = (struct xds_core_v3_ContextParams*)xds_core_v3_ResourceLocator_exact_context(msg);
+ if (sub == NULL) {
+ sub = (struct xds_core_v3_ContextParams*)_upb_msg_new(&xds_core_v3_ContextParams_msginit, arena);
+ if (!sub) return NULL;
+ xds_core_v3_ResourceLocator_set_exact_context(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE xds_core_v3_ResourceLocator_Directive** xds_core_v3_ResourceLocator_mutable_directives(xds_core_v3_ResourceLocator *msg, size_t *len) {
+ return (xds_core_v3_ResourceLocator_Directive**)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 56), len);
+}
+UPB_INLINE xds_core_v3_ResourceLocator_Directive** xds_core_v3_ResourceLocator_resize_directives(xds_core_v3_ResourceLocator *msg, size_t len, upb_arena *arena) {
+ return (xds_core_v3_ResourceLocator_Directive**)_upb_array_resize_accessor2(msg, UPB_SIZE(28, 56), len, UPB_SIZE(2, 3), arena);
+}
+UPB_INLINE struct xds_core_v3_ResourceLocator_Directive* xds_core_v3_ResourceLocator_add_directives(xds_core_v3_ResourceLocator *msg, upb_arena *arena) {
+ struct xds_core_v3_ResourceLocator_Directive* sub = (struct xds_core_v3_ResourceLocator_Directive*)_upb_msg_new(&xds_core_v3_ResourceLocator_Directive_msginit, arena);
+ bool ok = _upb_array_append_accessor2(
+ msg, UPB_SIZE(28, 56), UPB_SIZE(2, 3), &sub, arena);
+ if (!ok) return NULL;
+ return sub;
+}
+
+/* xds.core.v3.ResourceLocator.Directive */
+
+UPB_INLINE xds_core_v3_ResourceLocator_Directive *xds_core_v3_ResourceLocator_Directive_new(upb_arena *arena) {
+ return (xds_core_v3_ResourceLocator_Directive *)_upb_msg_new(&xds_core_v3_ResourceLocator_Directive_msginit, arena);
+}
+UPB_INLINE xds_core_v3_ResourceLocator_Directive *xds_core_v3_ResourceLocator_Directive_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ xds_core_v3_ResourceLocator_Directive *ret = xds_core_v3_ResourceLocator_Directive_new(arena);
+ return (ret && upb_decode(buf, size, ret, &xds_core_v3_ResourceLocator_Directive_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE xds_core_v3_ResourceLocator_Directive *xds_core_v3_ResourceLocator_Directive_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ xds_core_v3_ResourceLocator_Directive *ret = xds_core_v3_ResourceLocator_Directive_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &xds_core_v3_ResourceLocator_Directive_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *xds_core_v3_ResourceLocator_Directive_serialize(const xds_core_v3_ResourceLocator_Directive *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &xds_core_v3_ResourceLocator_Directive_msginit, arena, len);
+}
+
+typedef enum {
+ xds_core_v3_ResourceLocator_Directive_directive_alt = 1,
+ xds_core_v3_ResourceLocator_Directive_directive_entry = 2,
+ xds_core_v3_ResourceLocator_Directive_directive_NOT_SET = 0
+} xds_core_v3_ResourceLocator_Directive_directive_oneofcases;
+UPB_INLINE xds_core_v3_ResourceLocator_Directive_directive_oneofcases xds_core_v3_ResourceLocator_Directive_directive_case(const xds_core_v3_ResourceLocator_Directive* msg) { return (xds_core_v3_ResourceLocator_Directive_directive_oneofcases)*UPB_PTR_AT(msg, UPB_SIZE(8, 16), int32_t); }
+
+UPB_INLINE bool xds_core_v3_ResourceLocator_Directive_has_alt(const xds_core_v3_ResourceLocator_Directive *msg) { return _upb_getoneofcase(msg, UPB_SIZE(8, 16)) == 1; }
+UPB_INLINE const xds_core_v3_ResourceLocator* xds_core_v3_ResourceLocator_Directive_alt(const xds_core_v3_ResourceLocator_Directive *msg) { return UPB_READ_ONEOF(msg, const xds_core_v3_ResourceLocator*, UPB_SIZE(0, 0), UPB_SIZE(8, 16), 1, NULL); }
+UPB_INLINE bool xds_core_v3_ResourceLocator_Directive_has_entry(const xds_core_v3_ResourceLocator_Directive *msg) { return _upb_getoneofcase(msg, UPB_SIZE(8, 16)) == 2; }
+UPB_INLINE upb_strview xds_core_v3_ResourceLocator_Directive_entry(const xds_core_v3_ResourceLocator_Directive *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(0, 0), UPB_SIZE(8, 16), 2, upb_strview_make("", strlen(""))); }
+
+UPB_INLINE void xds_core_v3_ResourceLocator_Directive_set_alt(xds_core_v3_ResourceLocator_Directive *msg, xds_core_v3_ResourceLocator* value) {
+ UPB_WRITE_ONEOF(msg, xds_core_v3_ResourceLocator*, UPB_SIZE(0, 0), value, UPB_SIZE(8, 16), 1);
+}
+UPB_INLINE struct xds_core_v3_ResourceLocator* xds_core_v3_ResourceLocator_Directive_mutable_alt(xds_core_v3_ResourceLocator_Directive *msg, upb_arena *arena) {
+ struct xds_core_v3_ResourceLocator* sub = (struct xds_core_v3_ResourceLocator*)xds_core_v3_ResourceLocator_Directive_alt(msg);
+ if (sub == NULL) {
+ sub = (struct xds_core_v3_ResourceLocator*)_upb_msg_new(&xds_core_v3_ResourceLocator_msginit, arena);
+ if (!sub) return NULL;
+ xds_core_v3_ResourceLocator_Directive_set_alt(msg, sub);
+ }
+ return sub;
+}
+UPB_INLINE void xds_core_v3_ResourceLocator_Directive_set_entry(xds_core_v3_ResourceLocator_Directive *msg, upb_strview value) {
+ UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(0, 0), value, UPB_SIZE(8, 16), 2);
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_RESOURCE_LOCATOR_PROTO_UPB_H_ */
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource_name.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include <stddef.h>
+#include "upb/msg.h"
+#include "xds/core/v3/resource_name.upb.h"
+#include "udpa/annotations/status.upb.h"
+#include "xds/core/v3/context_params.upb.h"
+#include "validate/validate.upb.h"
+
+#include "upb/port_def.inc"
+
+static const upb_msglayout *const xds_core_v3_ResourceName_submsgs[1] = {
+ &xds_core_v3_ContextParams_msginit,
+};
+
+static const upb_msglayout_field xds_core_v3_ResourceName__fields[4] = {
+ {1, UPB_SIZE(4, 8), 0, 0, 9, 1},
+ {2, UPB_SIZE(12, 24), 0, 0, 9, 1},
+ {3, UPB_SIZE(20, 40), 0, 0, 9, 1},
+ {4, UPB_SIZE(28, 56), 1, 0, 11, 1},
+};
+
+const upb_msglayout xds_core_v3_ResourceName_msginit = {
+ &xds_core_v3_ResourceName_submsgs[0],
+ &xds_core_v3_ResourceName__fields[0],
+ UPB_SIZE(32, 64), 4, false, 255,
+};
+
+#include "upb/port_undef.inc"
+
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource_name.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_RESOURCE_NAME_PROTO_UPB_H_
+#define XDS_CORE_V3_RESOURCE_NAME_PROTO_UPB_H_
+
+#include "upb/msg.h"
+#include "upb/decode.h"
+#include "upb/decode_fast.h"
+#include "upb/encode.h"
+
+#include "upb/port_def.inc"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct xds_core_v3_ResourceName;
+typedef struct xds_core_v3_ResourceName xds_core_v3_ResourceName;
+extern const upb_msglayout xds_core_v3_ResourceName_msginit;
+struct xds_core_v3_ContextParams;
+extern const upb_msglayout xds_core_v3_ContextParams_msginit;
+
+
+/* xds.core.v3.ResourceName */
+
+UPB_INLINE xds_core_v3_ResourceName *xds_core_v3_ResourceName_new(upb_arena *arena) {
+ return (xds_core_v3_ResourceName *)_upb_msg_new(&xds_core_v3_ResourceName_msginit, arena);
+}
+UPB_INLINE xds_core_v3_ResourceName *xds_core_v3_ResourceName_parse(const char *buf, size_t size,
+ upb_arena *arena) {
+ xds_core_v3_ResourceName *ret = xds_core_v3_ResourceName_new(arena);
+ return (ret && upb_decode(buf, size, ret, &xds_core_v3_ResourceName_msginit, arena)) ? ret : NULL;
+}
+UPB_INLINE xds_core_v3_ResourceName *xds_core_v3_ResourceName_parse_ex(const char *buf, size_t size,
+ upb_arena *arena, int options) {
+ xds_core_v3_ResourceName *ret = xds_core_v3_ResourceName_new(arena);
+ return (ret && _upb_decode(buf, size, ret, &xds_core_v3_ResourceName_msginit, arena, options))
+ ? ret : NULL;
+}
+UPB_INLINE char *xds_core_v3_ResourceName_serialize(const xds_core_v3_ResourceName *msg, upb_arena *arena, size_t *len) {
+ return upb_encode(msg, &xds_core_v3_ResourceName_msginit, arena, len);
+}
+
+UPB_INLINE upb_strview xds_core_v3_ResourceName_id(const xds_core_v3_ResourceName *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview); }
+UPB_INLINE upb_strview xds_core_v3_ResourceName_authority(const xds_core_v3_ResourceName *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview); }
+UPB_INLINE upb_strview xds_core_v3_ResourceName_resource_type(const xds_core_v3_ResourceName *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview); }
+UPB_INLINE bool xds_core_v3_ResourceName_has_context(const xds_core_v3_ResourceName *msg) { return _upb_hasbit(msg, 1); }
+UPB_INLINE const struct xds_core_v3_ContextParams* xds_core_v3_ResourceName_context(const xds_core_v3_ResourceName *msg) { return *UPB_PTR_AT(msg, UPB_SIZE(28, 56), const struct xds_core_v3_ContextParams*); }
+
+UPB_INLINE void xds_core_v3_ResourceName_set_id(xds_core_v3_ResourceName *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(4, 8), upb_strview) = value;
+}
+UPB_INLINE void xds_core_v3_ResourceName_set_authority(xds_core_v3_ResourceName *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(12, 24), upb_strview) = value;
+}
+UPB_INLINE void xds_core_v3_ResourceName_set_resource_type(xds_core_v3_ResourceName *msg, upb_strview value) {
+ *UPB_PTR_AT(msg, UPB_SIZE(20, 40), upb_strview) = value;
+}
+UPB_INLINE void xds_core_v3_ResourceName_set_context(xds_core_v3_ResourceName *msg, struct xds_core_v3_ContextParams* value) {
+ _upb_sethas(msg, 1);
+ *UPB_PTR_AT(msg, UPB_SIZE(28, 56), struct xds_core_v3_ContextParams*) = value;
+}
+UPB_INLINE struct xds_core_v3_ContextParams* xds_core_v3_ResourceName_mutable_context(xds_core_v3_ResourceName *msg, upb_arena *arena) {
+ struct xds_core_v3_ContextParams* sub = (struct xds_core_v3_ContextParams*)xds_core_v3_ResourceName_context(msg);
+ if (sub == NULL) {
+ sub = (struct xds_core_v3_ContextParams*)_upb_msg_new(&xds_core_v3_ContextParams_msginit, arena);
+ if (!sub) return NULL;
+ xds_core_v3_ResourceName_set_context(msg, sub);
+ }
+ return sub;
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_RESOURCE_NAME_PROTO_UPB_H_ */
extern upb_def_init envoy_type_matcher_v3_metadata_proto_upbdefinit;
extern upb_def_init envoy_type_v3_percent_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
-extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
&envoy_config_accesslog_v3_ExtensionFilter_msginit,
};
-static const char descriptor[4418] = {'\n', ')', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '/',
+static const char descriptor[4388] = {'\n', ')', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '/',
'v', '3', '/', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'p', 'r', 'o', 't', 'o', '\022', '\031', 'e', 'n', 'v', 'o', 'y',
'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v',
'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r',
'$', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't', 'c', 'h', 'e', 'r', '/', 'v', '3', '/', 'm', 'e',
't', 'a', 'd', 'a', 't', 'a', '.', 'p', 'r', 'o', 't', 'o', '\032', '\033', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/',
'v', '3', '/', 'p', 'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l',
-'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036',
-'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.',
-'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's',
-'t', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
-'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a',
-'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\356', '\001', '\n',
-'\t', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R',
-'\004', 'n', 'a', 'm', 'e', '\022', 'B', '\n', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', '*', '.', 'e',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l',
+'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o',
+'\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's',
+'.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/',
+'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't',
+'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\356', '\001', '\n', '\t', 'A', 'c', 'c', 'e',
+'s', 's', 'L', 'o', 'g', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e',
+'\022', 'B', '\n', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's',
+'s', 'L', 'o', 'g', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\022', '9', '\n', '\014', 't', 'y', 'p',
+'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f',
+'i', 'g', ':', '1', '\232', '\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f',
+'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'A', 'c', 'c', 'e', 's', 's',
+'L', 'o', 'g', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\003', '\020', '\004', 'R',
+'\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\366', '\010', '\n', '\017', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'F', 'i', 'l', 't',
+'e', 'r', '\022', '[', '\n', '\022', 's', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd', 'e', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030',
+'\001', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e',
+'s', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'S', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', 'F', 'i', 'l', 't', 'e', 'r',
+'H', '\000', 'R', '\020', 's', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'T', '\n', '\017', 'd',
+'u', 'r', 'a', 't', 'i', 'o', 'n', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'D',
+'u', 'r', 'a', 't', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\016', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n',
+'F', 'i', 'l', 't', 'e', 'r', '\022', 'h', '\n', '\027', 'n', 'o', 't', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c',
+'k', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'N', 'o', 't', 'H', 'e', 'a', 'l',
+'t', 'h', 'C', 'h', 'e', 'c', 'k', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\024', 'n', 'o', 't', 'H', 'e', 'a', 'l', 't',
+'h', 'C', 'h', 'e', 'c', 'k', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'W', '\n', '\020', 't', 'r', 'a', 'c', 'e', 'a', 'b', 'l', 'e',
+'_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\004', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'e', 'a', 'b', 'l',
+'e', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\017', 't', 'r', 'a', 'c', 'e', 'a', 'b', 'l', 'e', 'F', 'i', 'l', 't', 'e',
+'r', '\022', 'Q', '\n', '\016', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\005', ' ', '\001', '(', '\013',
+'2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g',
+'.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\r', 'r', 'u', 'n', 't',
+'i', 'm', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'E', '\n', '\n', 'a', 'n', 'd', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\006',
+' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's',
+'s', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'n', 'd', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\t', 'a', 'n', 'd', 'F',
+'i', 'l', 't', 'e', 'r', '\022', 'B', '\n', '\t', 'o', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\007', ' ', '\001', '(', '\013', '2',
+'#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.',
+'v', '3', '.', 'O', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\010', 'o', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'N',
+'\n', '\r', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\010', ' ', '\001', '(', '\013', '2', '\'', '.', 'e',
'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.',
-'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\022', '9',
-'\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o',
-'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e',
-'d', 'C', 'o', 'n', 'f', 'i', 'g', ':', '1', '\232', '\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'A',
-'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004',
-'\010', '\003', '\020', '\004', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\366', '\010', '\n', '\017', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o',
-'g', 'F', 'i', 'l', 't', 'e', 'r', '\022', '[', '\n', '\022', 's', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd', 'e', '_', 'f', 'i',
-'l', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'S', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', 'F',
-'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\020', 's', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', 'F', 'i', 'l', 't', 'e', 'r',
-'\022', 'T', '\n', '\017', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013',
-'2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g',
-'.', 'v', '3', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\016', 'd', 'u', 'r',
-'a', 't', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'h', '\n', '\027', 'n', 'o', 't', '_', 'h', 'e', 'a', 'l', 't', 'h',
-'_', 'c', 'h', 'e', 'c', 'k', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'N', 'o',
-'t', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\024', 'n', 'o', 't',
-'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'W', '\n', '\020', 't', 'r', 'a', 'c',
-'e', 'a', 'b', 'l', 'e', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\004', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'T', 'r', 'a',
-'c', 'e', 'a', 'b', 'l', 'e', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\017', 't', 'r', 'a', 'c', 'e', 'a', 'b', 'l', 'e',
-'F', 'i', 'l', 't', 'e', 'r', '\022', 'Q', '\n', '\016', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030',
-'\005', ' ', '\001', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e',
-'s', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R',
-'\r', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'E', '\n', '\n', 'a', 'n', 'd', '_', 'f', 'i', 'l',
-'t', 'e', 'r', '\030', '\006', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'n', 'd', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R',
-'\t', 'a', 'n', 'd', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'B', '\n', '\t', 'o', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\007',
-' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's',
-'s', 'l', 'o', 'g', '.', 'v', '3', '.', 'O', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\010', 'o', 'r', 'F', 'i', 'l',
-'t', 'e', 'r', '\022', 'N', '\n', '\r', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\010', ' ', '\001', '(',
-'\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o',
-'g', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\014', 'h', 'e', 'a', 'd',
-'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'a', '\n', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'f', 'l', 'a', 'g',
-'_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\t', ' ', '\001', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e',
-'F', 'l', 'a', 'g', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\022', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'F', 'l', 'a',
-'g', 'F', 'i', 'l', 't', 'e', 'r', '\022', '[', '\n', '\022', 'g', 'r', 'p', 'c', '_', 's', 't', 'a', 't', 'u', 's', '_', 'f', 'i',
-'l', 't', 'e', 'r', '\030', '\n', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F',
-'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\020', 'g', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r',
-'\022', 'W', '\n', '\020', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\013', ' ', '\001', '(',
-'\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o',
-'g', '.', 'v', '3', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\017', 'e',
-'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'T', '\n', '\017', 'm', 'e', 't', 'a', 'd', 'a', 't',
-'a', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\014', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't',
-'a', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\016', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i', 'l', 't', 'e', 'r',
-':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l',
-'t', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o',
-'g', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\027', '\n', '\020', 'f', 'i', 'l', 't', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i',
-'e', 'r', '\022', '\003', '\370', 'B', '\001', '\"', '\357', '\001', '\n', '\020', 'C', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', 'F', 'i', 'l',
-'t', 'e', 'r', '\022', 'H', '\n', '\002', 'o', 'p', '\030', '\001', ' ', '\001', '(', '\016', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'C', 'o', 'm', 'p', 'a', 'r',
-'i', 's', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '.', 'O', 'p', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\002',
-'o', 'p', '\022', '9', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'U', 'I',
-'n', 't', '3', '2', 'R', '\005', 'v', 'a', 'l', 'u', 'e', '\"', '\034', '\n', '\002', 'O', 'p', '\022', '\006', '\n', '\002', 'E', 'Q', '\020', '\000',
-'\022', '\006', '\n', '\002', 'G', 'E', '\020', '\001', '\022', '\006', '\n', '\002', 'L', 'E', '\020', '\002', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's',
-'s', 'l', 'o', 'g', '.', 'v', '2', '.', 'C', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\"',
-'\243', '\001', '\n', '\020', 'S', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'U', '\n', '\n', 'c',
-'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'C', 'o', 'm', 'p', 'a', 'r',
-'i', 's', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\n', 'c', 'o', 'm',
-'p', 'a', 'r', 'i', 's', 'o', 'n', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'S',
-'t', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\237', '\001', '\n', '\016', 'D', 'u', 'r', 'a', 't',
-'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'U', '\n', '\n', 'c', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', '\030', '\001',
-' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's',
-'s', 'l', 'o', 'g', '.', 'v', '3', '.', 'C', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', 'B',
-'\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\n', 'c', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', ':', '6', '\232', '\305',
-'\210', '\036', '1', '\n', '/', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.',
-'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'F', 'i', 'l', 't',
-'e', 'r', '\"', 'T', '\n', '\024', 'N', 'o', 't', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'F', 'i', 'l', 't', 'e',
-'r', ':', '<', '\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i',
-'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'N', 'o', 't', 'H', 'e', 'a', 'l',
-'t', 'h', 'C', 'h', 'e', 'c', 'k', 'F', 'i', 'l', 't', 'e', 'r', '\"', 'J', '\n', '\017', 'T', 'r', 'a', 'c', 'e', 'a', 'b', 'l',
-'e', 'F', 'i', 'l', 't', 'e', 'r', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'T',
-'r', 'a', 'c', 'e', 'a', 'b', 'l', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\371', '\001', '\n', '\r', 'R', 'u', 'n', 't', 'i', 'm',
-'e', 'F', 'i', 'l', 't', 'e', 'r', '\022', '(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\001', ' ',
-'\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', '\022',
-'I', '\n', '\017', 'p', 'e', 'r', 'c', 'e', 'n', 't', '_', 's', 'a', 'm', 'p', 'l', 'e', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2',
-' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a',
-'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'p', 'e', 'r', 'c', 'e', 'n', 't', 'S', 'a', 'm', 'p', 'l', 'e', 'd', '\022',
-'<', '\n', '\032', 'u', 's', 'e', '_', 'i', 'n', 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 't', '_', 'r', 'a', 'n', 'd', 'o', 'm',
-'n', 'e', 's', 's', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\030', 'u', 's', 'e', 'I', 'n', 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n',
-'t', 'R', 'a', 'n', 'd', 'o', 'm', 'n', 'e', 's', 's', ':', '5', '\232', '\305', '\210', '\036', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y',
+'H', 'e', 'a', 'd', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\014', 'h', 'e', 'a', 'd', 'e', 'r', 'F', 'i', 'l',
+'t', 'e', 'r', '\022', 'a', '\n', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'f', 'l', 'a', 'g', '_', 'f', 'i', 'l', 't',
+'e', 'r', '\030', '\t', ' ', '\001', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a',
+'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F',
+'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\022', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F', 'i', 'l', 't',
+'e', 'r', '\022', '[', '\n', '\022', 'g', 'r', 'p', 'c', '_', 's', 't', 'a', 't', 'u', 's', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030',
+'\n', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e',
+'s', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r',
+'H', '\000', 'R', '\020', 'g', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'W', '\n', '\020', 'e',
+'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\013', ' ', '\001', '(', '\013', '2', '*', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.',
+'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', 'H', '\000', 'R', '\017', 'e', 'x', 't', 'e', 'n', 's',
+'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'T', '\n', '\017', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'f', 'i', 'l',
+'t', 'e', 'r', '\030', '\014', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i', 'l', 't',
+'e', 'r', 'H', '\000', 'R', '\016', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i', 'l', 't', 'e', 'r', ':', '7', '\232', '\305', '\210',
+'\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a',
+'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'F', 'i', 'l', 't',
+'e', 'r', 'B', '\027', '\n', '\020', 'f', 'i', 'l', 't', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370',
+'B', '\001', '\"', '\357', '\001', '\n', '\020', 'C', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'H',
+'\n', '\002', 'o', 'p', '\030', '\001', ' ', '\001', '(', '\016', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'C', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', 'F',
+'i', 'l', 't', 'e', 'r', '.', 'O', 'p', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\002', 'o', 'p', '\022', '9', '\n',
+'\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'U', 'I', 'n', 't', '3', '2', 'R',
+'\005', 'v', 'a', 'l', 'u', 'e', '\"', '\034', '\n', '\002', 'O', 'p', '\022', '\006', '\n', '\002', 'E', 'Q', '\020', '\000', '\022', '\006', '\n', '\002', 'G',
+'E', '\020', '\001', '\022', '\006', '\n', '\002', 'L', 'E', '\020', '\002', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y',
'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.',
-'v', '2', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\216', '\001', '\n', '\t', 'A', 'n', 'd', 'F',
-'i', 'l', 't', 'e', 'r', '\022', 'N', '\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '*', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3',
-'.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010',
-'\002', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', ':', '1', '\232', '\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v',
-'2', '.', 'A', 'n', 'd', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\214', '\001', '\n', '\010', 'O', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\022',
-'N', '\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's',
-'s', 'L', 'o', 'g', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\002', 'R', '\007', 'f', 'i', 'l',
-'t', 'e', 'r', 's', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'O', 'r', 'F', 'i',
-'l', 't', 'e', 'r', '\"', '\214', '\001', '\n', '\014', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'F', '\n', '\006',
-'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r',
-'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', ':', '4', '\232', '\305', '\210', '\036', '/',
-'\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c',
-'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\334', '\001',
-'\n', '\022', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\211', '\001', '\n', '\005',
-'f', 'l', 'a', 'g', 's', '\030', '\001', ' ', '\003', '(', '\t', 'B', 's', '\372', 'B', 'p', '\222', '\001', 'm', '\"', 'k', 'r', 'i', 'R', '\002',
-'L', 'H', 'R', '\002', 'U', 'H', 'R', '\002', 'U', 'T', 'R', '\002', 'L', 'R', 'R', '\002', 'U', 'R', 'R', '\002', 'U', 'F', 'R', '\002', 'U',
-'C', 'R', '\002', 'U', 'O', 'R', '\002', 'N', 'R', 'R', '\002', 'D', 'I', 'R', '\002', 'F', 'I', 'R', '\002', 'R', 'L', 'R', '\004', 'U', 'A',
-'E', 'X', 'R', '\004', 'R', 'L', 'S', 'E', 'R', '\002', 'D', 'C', 'R', '\003', 'U', 'R', 'X', 'R', '\002', 'S', 'I', 'R', '\002', 'I', 'H',
-'R', '\003', 'D', 'P', 'E', 'R', '\005', 'U', 'M', 'S', 'D', 'R', 'R', '\004', 'R', 'F', 'C', 'F', 'R', '\004', 'N', 'F', 'C', 'F', 'R',
-'\002', 'D', 'T', 'R', '\005', 'f', 'l', 'a', 'g', 's', ':', ':', '\232', '\305', '\210', '\036', '5', '\n', '3', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v',
-'2', '.', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\200', '\004', '\n', '\020',
-'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r', '\022', ']', '\n', '\010', 's', 't', 'a', 't', 'u',
-'s', 'e', 's', '\030', '\001', ' ', '\003', '(', '\016', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i',
-'l', 't', 'e', 'r', '.', 'S', 't', 'a', 't', 'u', 's', 'B', '\r', '\372', 'B', '\n', '\222', '\001', '\007', '\"', '\005', '\202', '\001', '\002', '\020',
-'\001', 'R', '\010', 's', 't', 'a', 't', 'u', 's', 'e', 's', '\022', '\030', '\n', '\007', 'e', 'x', 'c', 'l', 'u', 'd', 'e', '\030', '\002', ' ',
-'\001', '(', '\010', 'R', '\007', 'e', 'x', 'c', 'l', 'u', 'd', 'e', '\"', '\270', '\002', '\n', '\006', 'S', 't', 'a', 't', 'u', 's', '\022', '\006',
-'\n', '\002', 'O', 'K', '\020', '\000', '\022', '\014', '\n', '\010', 'C', 'A', 'N', 'C', 'E', 'L', 'E', 'D', '\020', '\001', '\022', '\013', '\n', '\007', 'U',
-'N', 'K', 'N', 'O', 'W', 'N', '\020', '\002', '\022', '\024', '\n', '\020', 'I', 'N', 'V', 'A', 'L', 'I', 'D', '_', 'A', 'R', 'G', 'U', 'M',
-'E', 'N', 'T', '\020', '\003', '\022', '\025', '\n', '\021', 'D', 'E', 'A', 'D', 'L', 'I', 'N', 'E', '_', 'E', 'X', 'C', 'E', 'E', 'D', 'E',
-'D', '\020', '\004', '\022', '\r', '\n', '\t', 'N', 'O', 'T', '_', 'F', 'O', 'U', 'N', 'D', '\020', '\005', '\022', '\022', '\n', '\016', 'A', 'L', 'R',
-'E', 'A', 'D', 'Y', '_', 'E', 'X', 'I', 'S', 'T', 'S', '\020', '\006', '\022', '\025', '\n', '\021', 'P', 'E', 'R', 'M', 'I', 'S', 'S', 'I',
-'O', 'N', '_', 'D', 'E', 'N', 'I', 'E', 'D', '\020', '\007', '\022', '\026', '\n', '\022', 'R', 'E', 'S', 'O', 'U', 'R', 'C', 'E', '_', 'E',
-'X', 'H', 'A', 'U', 'S', 'T', 'E', 'D', '\020', '\010', '\022', '\027', '\n', '\023', 'F', 'A', 'I', 'L', 'E', 'D', '_', 'P', 'R', 'E', 'C',
-'O', 'N', 'D', 'I', 'T', 'I', 'O', 'N', '\020', '\t', '\022', '\013', '\n', '\007', 'A', 'B', 'O', 'R', 'T', 'E', 'D', '\020', '\n', '\022', '\020',
-'\n', '\014', 'O', 'U', 'T', '_', 'O', 'F', '_', 'R', 'A', 'N', 'G', 'E', '\020', '\013', '\022', '\021', '\n', '\r', 'U', 'N', 'I', 'M', 'P',
-'L', 'E', 'M', 'E', 'N', 'T', 'E', 'D', '\020', '\014', '\022', '\014', '\n', '\010', 'I', 'N', 'T', 'E', 'R', 'N', 'A', 'L', '\020', '\r', '\022',
-'\017', '\n', '\013', 'U', 'N', 'A', 'V', 'A', 'I', 'L', 'A', 'B', 'L', 'E', '\020', '\016', '\022', '\r', '\n', '\t', 'D', 'A', 'T', 'A', '_',
-'L', 'O', 'S', 'S', '\020', '\017', '\022', '\023', '\n', '\017', 'U', 'N', 'A', 'U', 'T', 'H', 'E', 'N', 'T', 'I', 'C', 'A', 'T', 'E', 'D',
-'\020', '\020', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f',
-'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'G', 'r', 'p', 'c', 'S', 't',
-'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\332', '\001', '\n', '\016', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i',
-'l', 't', 'e', 'r', '\022', '@', '\n', '\007', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '&', '.', 'e',
-'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'M', 'e', 't', 'a',
-'d', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'N', '\n', '\026', 'm',
-'a', 't', 'c', 'h', '_', 'i', 'f', '_', 'k', 'e', 'y', '_', 'n', 'o', 't', '_', 'f', 'o', 'u', 'n', 'd', '\030', '\002', ' ', '\001',
-'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
-'V', 'a', 'l', 'u', 'e', 'R', '\022', 'm', 'a', 't', 'c', 'h', 'I', 'f', 'K', 'e', 'y', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd',
-':', '6', '\232', '\305', '\210', '\036', '1', '\n', '/', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l',
-'t', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a',
-'F', 'i', 'l', 't', 'e', 'r', '\"', '\266', '\001', '\n', '\017', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e',
-'r', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014',
-'t', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C',
-'o', 'n', 'f', 'i', 'g', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'E', 'x', 't',
-'e', 'n', 's', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y',
-'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'B', 'C', '\n', '\'', 'i', 'o', '.', 'e', 'n',
-'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c',
-'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', 'B', '\016', 'A', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', 'P', 'r', 'o', 't', 'o',
-'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'v', '2', '.', 'C', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\243', '\001', '\n', '\020', 'S',
+'t', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'U', '\n', '\n', 'c', 'o', 'm', 'p', 'a', 'r',
+'i', 's', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'C', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', 'F',
+'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\n', 'c', 'o', 'm', 'p', 'a', 'r', 'i', 's',
+'o', 'n', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f',
+'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'S', 't', 'a', 't', 'u', 's',
+'C', 'o', 'd', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\237', '\001', '\n', '\016', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'F', 'i',
+'l', 't', 'e', 'r', '\022', 'U', '\n', '\n', 'c', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2',
+'+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.',
+'v', '3', '.', 'C', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212',
+'\001', '\002', '\020', '\001', 'R', '\n', 'c', 'o', 'm', 'p', 'a', 'r', 'i', 's', 'o', 'n', ':', '6', '\232', '\305', '\210', '\036', '1', '\n', '/',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's',
+'s', 'l', 'o', 'g', '.', 'v', '2', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\"', 'T', '\n',
+'\024', 'N', 'o', 't', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'F', 'i', 'l', 't', 'e', 'r', ':', '<', '\232', '\305',
+'\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.',
+'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'N', 'o', 't', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e',
+'c', 'k', 'F', 'i', 'l', 't', 'e', 'r', '\"', 'J', '\n', '\017', 'T', 'r', 'a', 'c', 'e', 'a', 'b', 'l', 'e', 'F', 'i', 'l', 't',
+'e', 'r', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f',
+'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'T', 'r', 'a', 'c', 'e', 'a',
+'b', 'l', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\371', '\001', '\n', '\r', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'i', 'l', 't',
+'e', 'r', '\022', '(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
+'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', '\022', 'I', '\n', '\017', 'p', 'e',
+'r', 'c', 'e', 'n', 't', '_', 's', 'a', 'm', 'p', 'l', 'e', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v',
+'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c',
+'e', 'n', 't', 'R', '\016', 'p', 'e', 'r', 'c', 'e', 'n', 't', 'S', 'a', 'm', 'p', 'l', 'e', 'd', '\022', '<', '\n', '\032', 'u', 's',
+'e', '_', 'i', 'n', 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 't', '_', 'r', 'a', 'n', 'd', 'o', 'm', 'n', 'e', 's', 's', '\030',
+'\003', ' ', '\001', '(', '\010', 'R', '\030', 'u', 's', 'e', 'I', 'n', 'd', 'e', 'p', 'e', 'n', 'd', 'e', 'n', 't', 'R', 'a', 'n', 'd',
+'o', 'm', 'n', 'e', 's', 's', ':', '5', '\232', '\305', '\210', '\036', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'R', 'u',
+'n', 't', 'i', 'm', 'e', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\216', '\001', '\n', '\t', 'A', 'n', 'd', 'F', 'i', 'l', 't', 'e', 'r',
+'\022', 'N', '\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e',
+'s', 's', 'L', 'o', 'g', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\002', 'R', '\007', 'f', 'i',
+'l', 't', 'e', 'r', 's', ':', '1', '\232', '\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'A', 'n', 'd',
+'F', 'i', 'l', 't', 'e', 'r', '\"', '\214', '\001', '\n', '\010', 'O', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'N', '\n', '\007', 'f', 'i',
+'l', 't', 'e', 'r', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'F',
+'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\002', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', ':',
+'0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't',
+'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'O', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\"',
+'\214', '\001', '\n', '\014', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\022', 'F', '\n', '\006', 'h', 'e', 'a', 'd', 'e',
+'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o',
+'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005',
+'\212', '\001', '\002', '\020', '\001', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', ':', '4', '\232', '\305', '\210', '\036', '/', '\n', '-', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o',
+'g', '.', 'v', '2', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\334', '\001', '\n', '\022', 'R', 'e', 's',
+'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\211', '\001', '\n', '\005', 'f', 'l', 'a', 'g', 's',
+'\030', '\001', ' ', '\003', '(', '\t', 'B', 's', '\372', 'B', 'p', '\222', '\001', 'm', '\"', 'k', 'r', 'i', 'R', '\002', 'L', 'H', 'R', '\002', 'U',
+'H', 'R', '\002', 'U', 'T', 'R', '\002', 'L', 'R', 'R', '\002', 'U', 'R', 'R', '\002', 'U', 'F', 'R', '\002', 'U', 'C', 'R', '\002', 'U', 'O',
+'R', '\002', 'N', 'R', 'R', '\002', 'D', 'I', 'R', '\002', 'F', 'I', 'R', '\002', 'R', 'L', 'R', '\004', 'U', 'A', 'E', 'X', 'R', '\004', 'R',
+'L', 'S', 'E', 'R', '\002', 'D', 'C', 'R', '\003', 'U', 'R', 'X', 'R', '\002', 'S', 'I', 'R', '\002', 'I', 'H', 'R', '\003', 'D', 'P', 'E',
+'R', '\005', 'U', 'M', 'S', 'D', 'R', 'R', '\004', 'R', 'F', 'C', 'F', 'R', '\004', 'N', 'F', 'C', 'F', 'R', '\002', 'D', 'T', 'R', '\005',
+'f', 'l', 'a', 'g', 's', ':', ':', '\232', '\305', '\210', '\036', '5', '\n', '3', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'R', 'e', 's',
+'p', 'o', 'n', 's', 'e', 'F', 'l', 'a', 'g', 'F', 'i', 'l', 't', 'e', 'r', '\"', '\200', '\004', '\n', '\020', 'G', 'r', 'p', 'c', 'S',
+'t', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r', '\022', ']', '\n', '\010', 's', 't', 'a', 't', 'u', 's', 'e', 's', '\030', '\001',
+' ', '\003', '(', '\016', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's',
+'s', 'l', 'o', 'g', '.', 'v', '3', '.', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F', 'i', 'l', 't', 'e', 'r', '.',
+'S', 't', 'a', 't', 'u', 's', 'B', '\r', '\372', 'B', '\n', '\222', '\001', '\007', '\"', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\010', 's', 't',
+'a', 't', 'u', 's', 'e', 's', '\022', '\030', '\n', '\007', 'e', 'x', 'c', 'l', 'u', 'd', 'e', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\007',
+'e', 'x', 'c', 'l', 'u', 'd', 'e', '\"', '\270', '\002', '\n', '\006', 'S', 't', 'a', 't', 'u', 's', '\022', '\006', '\n', '\002', 'O', 'K', '\020',
+'\000', '\022', '\014', '\n', '\010', 'C', 'A', 'N', 'C', 'E', 'L', 'E', 'D', '\020', '\001', '\022', '\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O', 'W',
+'N', '\020', '\002', '\022', '\024', '\n', '\020', 'I', 'N', 'V', 'A', 'L', 'I', 'D', '_', 'A', 'R', 'G', 'U', 'M', 'E', 'N', 'T', '\020', '\003',
+'\022', '\025', '\n', '\021', 'D', 'E', 'A', 'D', 'L', 'I', 'N', 'E', '_', 'E', 'X', 'C', 'E', 'E', 'D', 'E', 'D', '\020', '\004', '\022', '\r',
+'\n', '\t', 'N', 'O', 'T', '_', 'F', 'O', 'U', 'N', 'D', '\020', '\005', '\022', '\022', '\n', '\016', 'A', 'L', 'R', 'E', 'A', 'D', 'Y', '_',
+'E', 'X', 'I', 'S', 'T', 'S', '\020', '\006', '\022', '\025', '\n', '\021', 'P', 'E', 'R', 'M', 'I', 'S', 'S', 'I', 'O', 'N', '_', 'D', 'E',
+'N', 'I', 'E', 'D', '\020', '\007', '\022', '\026', '\n', '\022', 'R', 'E', 'S', 'O', 'U', 'R', 'C', 'E', '_', 'E', 'X', 'H', 'A', 'U', 'S',
+'T', 'E', 'D', '\020', '\010', '\022', '\027', '\n', '\023', 'F', 'A', 'I', 'L', 'E', 'D', '_', 'P', 'R', 'E', 'C', 'O', 'N', 'D', 'I', 'T',
+'I', 'O', 'N', '\020', '\t', '\022', '\013', '\n', '\007', 'A', 'B', 'O', 'R', 'T', 'E', 'D', '\020', '\n', '\022', '\020', '\n', '\014', 'O', 'U', 'T',
+'_', 'O', 'F', '_', 'R', 'A', 'N', 'G', 'E', '\020', '\013', '\022', '\021', '\n', '\r', 'U', 'N', 'I', 'M', 'P', 'L', 'E', 'M', 'E', 'N',
+'T', 'E', 'D', '\020', '\014', '\022', '\014', '\n', '\010', 'I', 'N', 'T', 'E', 'R', 'N', 'A', 'L', '\020', '\r', '\022', '\017', '\n', '\013', 'U', 'N',
+'A', 'V', 'A', 'I', 'L', 'A', 'B', 'L', 'E', '\020', '\016', '\022', '\r', '\n', '\t', 'D', 'A', 'T', 'A', '_', 'L', 'O', 'S', 'S', '\020',
+'\017', '\022', '\023', '\n', '\017', 'U', 'N', 'A', 'U', 'T', 'H', 'E', 'N', 'T', 'I', 'C', 'A', 'T', 'E', 'D', '\020', '\020', ':', '8', '\232',
+'\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r',
+'.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'G', 'r', 'p', 'c', 'S', 't', 'a', 't', 'u', 's', 'F',
+'i', 'l', 't', 'e', 'r', '\"', '\332', '\001', '\n', '\016', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i', 'l', 't', 'e', 'r', '\022',
+'@', '\n', '\007', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'t', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M',
+'a', 't', 'c', 'h', 'e', 'r', 'R', '\007', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'N', '\n', '\026', 'm', 'a', 't', 'c', 'h', '_',
+'i', 'f', '_', 'k', 'e', 'y', '_', 'n', 'o', 't', '_', 'f', 'o', 'u', 'n', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
+'R', '\022', 'm', 'a', 't', 'c', 'h', 'I', 'f', 'K', 'e', 'y', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd', ':', '6', '\232', '\305', '\210',
+'\036', '1', '\n', '/', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'a',
+'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'F', 'i', 'l', 't', 'e',
+'r', '\"', '\266', '\001', '\n', '\017', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\022', '\n', '\004',
+'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd',
+'_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g',
+':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l',
+'t', 'e', 'r', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '2', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o',
+'n', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010',
+'\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'B', 'C', '\n', '\'', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r',
+'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o',
+'g', '.', 'v', '3', 'B', '\016', 'A', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310',
+'\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[11] = {
+static upb_def_init *deps[10] = {
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_route_v3_route_components_proto_upbdefinit,
&envoy_type_matcher_v3_metadata_proto_upbdefinit,
&envoy_type_v3_percent_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
- &google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
deps,
layouts,
"envoy/config/accesslog/v3/accesslog.proto",
- UPB_STRVIEW_INIT(descriptor, 4418)
+ UPB_STRVIEW_INIT(descriptor, 4388)
};
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_collection_entry_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_resource_locator_proto_upbdefinit;
-extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
-extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
+extern upb_def_init xds_core_v3_collection_entry_proto_upbdefinit;
extern upb_def_init udpa_annotations_security_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern const upb_msglayout envoy_config_cluster_v3_Cluster_CommonLbConfig_LocalityWeightedLbConfig_msginit;
extern const upb_msglayout envoy_config_cluster_v3_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit;
extern const upb_msglayout envoy_config_cluster_v3_Cluster_RefreshRate_msginit;
-extern const upb_msglayout envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit;
+extern const upb_msglayout envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit;
extern const upb_msglayout envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry_msginit;
extern const upb_msglayout envoy_config_cluster_v3_LoadBalancingPolicy_msginit;
extern const upb_msglayout envoy_config_cluster_v3_LoadBalancingPolicy_Policy_msginit;
&envoy_config_cluster_v3_Cluster_CommonLbConfig_LocalityWeightedLbConfig_msginit,
&envoy_config_cluster_v3_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit,
&envoy_config_cluster_v3_Cluster_RefreshRate_msginit,
- &envoy_config_cluster_v3_Cluster_PrefetchPolicy_msginit,
+ &envoy_config_cluster_v3_Cluster_PreconnectPolicy_msginit,
&envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry_msginit,
&envoy_config_cluster_v3_LoadBalancingPolicy_msginit,
&envoy_config_cluster_v3_LoadBalancingPolicy_Policy_msginit,
&envoy_config_cluster_v3_TrackClusterStats_msginit,
};
-static const char descriptor[10953] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3',
+static const char descriptor[10750] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3',
'/', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', '\027', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '\032', '-', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n',
'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3', '/', 'c', 'i', 'r', 'c', 'u', 'i', 't', '_', 'b', 'r',
'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p',
'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r',
'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'u', 'd', 'p', 'a', '/', 'c', 'o',
-'r', 'e', '/', 'v', '1', '/', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_', 'e', 'n', 't', 'r', 'y', '.', 'p', 'r',
-'o', 't', 'o', '\032', '#', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c',
-'e', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n',
-'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r',
-'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o',
-'n', 's', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!',
-'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i',
-'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a',
-'t', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 'L', '\n', '\021', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'l', 'l', 'e', 'c',
-'t', 'i', 'o', 'n', '\022', '7', '\n', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\035', '.', 'u',
-'d', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't',
-'r', 'y', 'R', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\"', '\205', 'H', '\n', '\007', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'o',
-'\n', '\030', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'm', 'a', 't', 'c', 'h', 'e',
-'s', '\030', '+', ' ', '\003', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l',
-'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r',
-'t', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', 'R', '\026', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o',
-'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', 'e', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
-'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\"', '\n', '\r', 'a', 'l', 't', '_', 's', 't',
-'a', 't', '_', 'n', 'a', 'm', 'e', '\030', '\034', ' ', '\001', '(', '\t', 'R', '\013', 'a', 'l', 't', 'S', 't', 'a', 't', 'N', 'a', 'm',
-'e', '\022', 'N', '\n', '\004', 't', 'y', 'p', 'e', '\030', '\002', ' ', '\001', '(', '\016', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'x', 'd', 's', '/', 'c', 'o', 'r',
+'e', '/', 'v', '3', '/', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_', 'e', 'n', 't', 'r', 'y', '.', 'p', 'r', 'o',
+'t', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'c', 'u',
+'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i',
+'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't',
+'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't',
+'o', '\"', 'K', '\n', '\021', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', '6', '\n',
+'\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', 'R', '\007', 'e', 'n', 't', 'r',
+'i', 'e', 's', '\"', '\246', 'G', '\n', '\007', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'o', '\n', '\030', 't', 'r', 'a', 'n', 's', 'p',
+'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'm', 'a', 't', 'c', 'h', 'e', 's', '\030', '+', ' ', '\003', '(', '\013', '2',
+'5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3',
+'.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M',
+'a', 't', 'c', 'h', 'R', '\026', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c',
+'h', 'e', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020',
+'\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\"', '\n', '\r', 'a', 'l', 't', '_', 's', 't', 'a', 't', '_', 'n', 'a', 'm', 'e', '\030',
+'\034', ' ', '\001', '(', '\t', 'R', '\013', 'a', 'l', 't', 'S', 't', 'a', 't', 'N', 'a', 'm', 'e', '\022', 'N', '\n', '\004', 't', 'y', 'p',
+'e', '\030', '\002', ' ', '\001', '(', '\016', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l',
+'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r',
+'y', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\004', 't', 'y', 'p', 'e', '\022', 'W',
+'\n', '\014', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 't', 'y', 'p', 'e', '\030', '&', ' ', '\001', '(', '\013', '2', '2', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u',
+'s', 't', 'e', 'r', '.', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', 'H', '\000', 'R',
+'\013', 'c', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\022', '_', '\n', '\022', 'e', 'd', 's', '_', 'c', 'l', 'u', 's', 't',
+'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.',
-'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'H', '\000',
-'R', '\004', 't', 'y', 'p', 'e', '\022', 'W', '\n', '\014', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 't', 'y', 'p', 'e', '\030', '&', ' ',
-'\001', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e',
-'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e',
-'r', 'T', 'y', 'p', 'e', 'H', '\000', 'R', '\013', 'c', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\022', '_', '\n', '\022', 'e',
-'d', 's', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '1',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.',
-'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'E', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'R',
-'\020', 'e', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'L', '\n', '\017', 'c', 'o', 'n', 'n',
-'e', 'c', 't', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252',
-'\001', '\002', '*', '\000', 'R', '\016', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'o', '\n', '!', 'p',
-'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i',
-'t', '_', 'b', 'y', 't', 'e', 's', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002',
-'\020', '\001', 'R', '\035', 'p', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i',
-'m', 'i', 't', 'B', 'y', 't', 'e', 's', '\022', 'R', '\n', '\t', 'l', 'b', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\006', ' ', '\001',
-'(', '\016', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r',
-'.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\n', '\372', 'B', '\007',
-'\202', '\001', '\004', '\020', '\001', ' ', '\007', 'R', '\010', 'l', 'b', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', '\017', 'l', 'o', 'a', 'd',
-'_', 'a', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', '\030', '!', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't',
-'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', 'R', '\016', 'l', 'o', 'a', 'd', 'A', 's', 's',
-'i', 'g', 'n', 'm', 'e', 'n', 't', '\022', 'F', '\n', '\r', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', 's', '\030',
-'\010', ' ', '\003', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'R', '\014', 'h', 'e', 'a', 'l', 't', 'h', 'C', 'h',
-'e', 'c', 'k', 's', '\022', '[', '\n', '\033', 'm', 'a', 'x', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '_', 'p', 'e', 'r', '_',
-'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\t', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\030', 'm', 'a',
-'x', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', 'P', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'S', '\n',
-'\020', 'c', 'i', 'r', 'c', 'u', 'i', 't', '_', 'b', 'r', 'e', 'a', 'k', 'e', 'r', 's', '\030', '\n', ' ', '\001', '(', '\013', '2', '(',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.',
-'C', 'i', 'r', 'c', 'u', 'i', 't', 'B', 'r', 'e', 'a', 'k', 'e', 'r', 's', 'R', '\017', 'c', 'i', 'r', 'c', 'u', 'i', 't', 'B',
-'r', 'e', 'a', 'k', 'e', 'r', 's', '\022', 'v', '\n', '\036', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'h', 't', 't', 'p', '_',
-'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '.', ' ', '\001', '(', '\013', '2', '1', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'U', 'p', 's', 't',
-'r', 'e', 'a', 'm', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\033',
-'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o',
-'n', 's', '\022', 'j', '\n', '\034', 'c', 'o', 'm', 'm', 'o', 'n', '_', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o',
-'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\035', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o',
-'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\031', 'c', 'o', 'm', 'm', 'o', 'n', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o',
-'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '^', '\n', '\025', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c',
+'E', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\020', 'e', 'd', 's', 'C', 'l', 'u', 's',
+'t', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'L', '\n', '\017', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 't', 'i', 'm', 'e',
+'o', 'u', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\016', 'c', 'o',
+'n', 'n', 'e', 'c', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'o', '\n', '!', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e',
+'c', 't', 'i', 'o', 'n', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i', 't', '_', 'b', 'y', 't', 'e', 's', '\030',
+'\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U',
+'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\020', '\001', 'R', '\035', 'p', 'e', 'r', 'C',
+'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i', 'm', 'i', 't', 'B', 'y', 't', 'e', 's',
+'\022', 'R', '\n', '\t', 'l', 'b', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\006', ' ', '\001', '(', '\016', '2', ')', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's',
+'t', 'e', 'r', '.', 'L', 'b', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\n', '\372', 'B', '\007', '\202', '\001', '\004', '\020', '\001', ' ', '\007', 'R',
+'\010', 'l', 'b', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', '\017', 'l', 'o', 'a', 'd', '_', 'a', 's', 's', 'i', 'g', 'n', 'm',
+'e', 'n', 't', '\030', '!', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's',
+'s', 'i', 'g', 'n', 'm', 'e', 'n', 't', 'R', '\016', 'l', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', '\022',
+'F', '\n', '\r', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', 's', '\030', '\010', ' ', '\003', '(', '\013', '2', '!', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l',
+'t', 'h', 'C', 'h', 'e', 'c', 'k', 'R', '\014', 'h', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 's', '\022', '[', '\n', '\033',
+'m', 'a', 'x', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '_', 'p', 'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', '\030', '\t', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\030', 'm', 'a', 'x', 'R', 'e', 'q', 'u', 'e', 's', 't',
+'s', 'P', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'S', '\n', '\020', 'c', 'i', 'r', 'c', 'u', 'i', 't',
+'_', 'b', 'r', 'e', 'a', 'k', 'e', 'r', 's', '\030', '\n', ' ', '\001', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'i', 'r', 'c', 'u', 'i', 't', 'B',
+'r', 'e', 'a', 'k', 'e', 'r', 's', 'R', '\017', 'c', 'i', 'r', 'c', 'u', 'i', 't', 'B', 'r', 'e', 'a', 'k', 'e', 'r', 's', '\022',
+'z', '\n', '\036', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l',
+'_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '.', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'H', 't', 't', 'p',
+'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\002', '\030', '\001', 'R', '\033', 'u', 'p', 's', 't',
+'r', 'e', 'a', 'm', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'n',
+'\n', '\034', 'c', 'o', 'm', 'm', 'o', 'n', '_', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p',
+'t', 'i', 'o', 'n', 's', '\030', '\035', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't',
+'i', 'o', 'n', 's', 'B', '\002', '\030', '\001', 'R', '\031', 'c', 'o', 'm', 'm', 'o', 'n', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o',
+'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'b', '\n', '\025', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c',
'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\r', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.',
'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o',
-'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\023', 'h', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O',
-'p', 't', 'i', 'o', 'n', 's', '\022', 'i', '\n', '\026', 'h', 't', 't', 'p', '2', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_',
-'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\016', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l',
-'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\020', '\001', 'R', '\024', 'h', 't', 't', 'p', '2', 'P', 'r',
-'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '\214', '\001', '\n', ' ', 't', 'y', 'p', 'e', 'd', '_', 'e',
-'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's',
-'\030', '$', ' ', '\003', '(', '\013', '2', 'C', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u',
-'s', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e',
-'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y',
-'R', '\035', 't', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O',
-'p', 't', 'i', 'o', 'n', 's', '\022', 'Q', '\n', '\020', 'd', 'n', 's', '_', 'r', 'e', 'f', 'r', 'e', 's', 'h', '_', 'r', 'a', 't',
-'e', '\030', '\020', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', '\001', '\006', '*', '\004', '\020', '\300', '\204', '=', 'R', '\016',
-'d', 'n', 's', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\022', 'e', '\n', '\030', 'd', 'n', 's', '_', 'f', 'a', 'i',
-'l', 'u', 'r', 'e', '_', 'r', 'e', 'f', 'r', 'e', 's', 'h', '_', 'r', 'a', 't', 'e', '\030', ',', ' ', '\001', '(', '\013', '2', ',',
+'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\002', '\030', '\001', 'R', '\023', 'h', 't', 't', 'p', 'P', 'r', 'o', 't', 'o',
+'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'k', '\n', '\026', 'h', 't', 't', 'p', '2', '_', 'p', 'r', 'o', 't', 'o',
+'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\016', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't',
+'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\t', '\030', '\001', '\212', '\223', '\267', '*', '\002', '\020', '\001', 'R', '\024', 'h',
+'t', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '\214', '\001', '\n', ' ', 't',
+'y', 'p', 'e', 'd', '_', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o',
+'p', 't', 'i', 'o', 'n', 's', '\030', '$', ' ', '\003', '(', '\013', '2', 'C', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'y', 'p',
+'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n',
+'s', 'E', 'n', 't', 'r', 'y', 'R', '\035', 't', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o',
+'t', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'Q', '\n', '\020', 'd', 'n', 's', '_', 'r', 'e', 'f', 'r', 'e',
+'s', 'h', '_', 'r', 'a', 't', 'e', '\030', '\020', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', '\001', '\006', '*', '\004',
+'\020', '\300', '\204', '=', 'R', '\016', 'd', 'n', 's', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\022', 'e', '\n', '\030', 'd',
+'n', 's', '_', 'f', 'a', 'i', 'l', 'u', 'r', 'e', '_', 'r', 'e', 'f', 'r', 'e', 's', 'h', '_', 'r', 'a', 't', 'e', '\030', ',',
+' ', '\001', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't',
+'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e',
+'R', '\025', 'd', 'n', 's', 'F', 'a', 'i', 'l', 'u', 'r', 'e', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\022', '&',
+'\n', '\017', 'r', 'e', 's', 'p', 'e', 'c', 't', '_', 'd', 'n', 's', '_', 't', 't', 'l', '\030', '\'', ' ', '\001', '(', '\010', 'R', '\r',
+'r', 'e', 's', 'p', 'e', 'c', 't', 'D', 'n', 's', 'T', 't', 'l', '\022', 'f', '\n', '\021', 'd', 'n', 's', '_', 'l', 'o', 'o', 'k',
+'u', 'p', '_', 'f', 'a', 'm', 'i', 'l', 'y', '\030', '\021', ' ', '\001', '(', '\016', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.',
+'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001',
+'R', '\017', 'd', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', '\022', 'B', '\n', '\r', 'd', 'n', 's', '_',
+'r', 'e', 's', 'o', 'l', 'v', 'e', 'r', 's', '\030', '\022', ' ', '\003', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'R', '\014', 'd', 'n',
+'s', 'R', 'e', 's', 'o', 'l', 'v', 'e', 'r', 's', '\022', '4', '\n', '\027', 'u', 's', 'e', '_', 't', 'c', 'p', '_', 'f', 'o', 'r',
+'_', 'd', 'n', 's', '_', 'l', 'o', 'o', 'k', 'u', 'p', 's', '\030', '-', ' ', '\001', '(', '\010', 'R', '\023', 'u', 's', 'e', 'T', 'c',
+'p', 'F', 'o', 'r', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 's', '\022', 'V', '\n', '\021', 'o', 'u', 't', 'l', 'i', 'e', 'r',
+'_', 'd', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\023', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'O', 'u', 't', 'l', 'i', 'e', 'r',
+'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', 'R', '\020', 'o', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i',
+'o', 'n', '\022', 'N', '\n', '\020', 'c', 'l', 'e', 'a', 'n', 'u', 'p', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\024', ' ',
+'\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r',
+'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\017', 'c', 'l', 'e', 'a', 'n', 'u', 'p', 'I',
+'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'R', '\n', '\024', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'b', 'i', 'n', 'd', '_',
+'c', 'o', 'n', 'f', 'i', 'g', '\030', '\025', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\022', 'u', 'p',
+'s', 't', 'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Y', '\n', '\020', 'l', 'b', '_', 's', 'u',
+'b', 's', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\026', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e',
+'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'l', 'b', 'S', 'u', 'b', 's', 'e',
+'t', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'b', '\n', '\023', 'r', 'i', 'n', 'g', '_', 'h', 'a', 's', 'h', '_', 'l', 'b', '_', 'c',
+'o', 'n', 'f', 'i', 'g', '\030', '\027', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g',
+'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\020', 'r', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L',
+'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '[', '\n', '\020', 'm', 'a', 'g', 'l', 'e', 'v', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f',
+'i', 'g', '\030', '4', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
+'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'M', 'a', 'g', 'l', 'e', 'v', 'L',
+'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\016', 'm', 'a', 'g', 'l', 'e', 'v', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g',
+'\022', 'k', '\n', '\026', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', '_', 'd', 's', 't', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i',
+'g', '\030', '\"', ' ', '\001', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l',
+'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l',
+'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\023', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's',
+'t', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\027', 'l', 'e', 'a', 's', 't', '_', 'r', 'e', 'q', 'u', 'e', 's',
+'t', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '%', ' ', '\001', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e',
+'r', '.', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R',
+'\024', 'l', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Y', '\n', '\020',
+'c', 'o', 'm', 'm', 'o', 'n', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\033', ' ', '\001', '(', '\013', '2', '/', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C',
+'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'c', 'o',
+'m', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't',
+'_', 's', 'o', 'c', 'k', 'e', 't', '\030', '\030', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k',
+'e', 't', 'R', '\017', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022', ':', '\n', '\010', 'm', 'e',
+'t', 'a', 'd', 'a', 't', 'a', '\030', '\031', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a',
+'d', 'a', 't', 'a', '\022', 'l', '\n', '\022', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 's', 'e', 'l', 'e', 'c', 't', 'i', 'o',
+'n', '\030', '\032', ' ', '\001', '(', '\016', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l',
+'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P',
+'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'B', '\002', '\030', '\001', 'R', '\021', 'p', 'r', 'o',
+'t', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'r', '\n', '\033', 'u', 'p', 's', 't', 'r', 'e', 'a',
+'m', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\036', ' ', '\001', '(',
+'\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.',
+'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i',
+'o', 'n', 's', 'R', '\031', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p',
+'t', 'i', 'o', 'n', 's', '\022', 'U', '\n', '(', 'c', 'l', 'o', 's', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'s', '_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'f', 'a', 'i', 'l', 'u', 'r', 'e', '\030',
+'\037', ' ', '\001', '(', '\010', 'R', '#', 'c', 'l', 'o', 's', 'e', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', 'O', 'n',
+'H', 'o', 's', 't', 'H', 'e', 'a', 'l', 't', 'h', 'F', 'a', 'i', 'l', 'u', 'r', 'e', '\022', '@', '\n', '\035', 'i', 'g', 'n', 'o',
+'r', 'e', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 'r', 'e', 'm', 'o', 'v', 'a', 'l',
+'\030', ' ', ' ', '\001', '(', '\010', 'R', '\031', 'i', 'g', 'n', 'o', 'r', 'e', 'H', 'e', 'a', 'l', 't', 'h', 'O', 'n', 'H', 'o', 's',
+'t', 'R', 'e', 'm', 'o', 'v', 'a', 'l', '\022', '9', '\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '(', ' ', '\003', '(', '\013',
+'2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v',
+'3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\022', '`', '\n', '\025', 'l', 'o', 'a', 'd',
+'_', 'b', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', ')', ' ', '\001', '(', '\013', '2', ',',
'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.',
-'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', 'R', '\025', 'd', 'n', 's', 'F',
-'a', 'i', 'l', 'u', 'r', 'e', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\022', '&', '\n', '\017', 'r', 'e', 's', 'p',
-'e', 'c', 't', '_', 'd', 'n', 's', '_', 't', 't', 'l', '\030', '\'', ' ', '\001', '(', '\010', 'R', '\r', 'r', 'e', 's', 'p', 'e', 'c',
-'t', 'D', 'n', 's', 'T', 't', 'l', '\022', 'f', '\n', '\021', 'd', 'n', 's', '_', 'l', 'o', 'o', 'k', 'u', 'p', '_', 'f', 'a', 'm',
-'i', 'l', 'y', '\030', '\021', ' ', '\001', '(', '\016', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'D', 'n', 's', 'L', 'o', 'o',
-'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\017', 'd', 'n', 's', 'L',
-'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', '\022', 'B', '\n', '\r', 'd', 'n', 's', '_', 'r', 'e', 's', 'o', 'l', 'v',
-'e', 'r', 's', '\030', '\022', ' ', '\003', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'R', '\014', 'd', 'n', 's', 'R', 'e', 's', 'o', 'l',
-'v', 'e', 'r', 's', '\022', '4', '\n', '\027', 'u', 's', 'e', '_', 't', 'c', 'p', '_', 'f', 'o', 'r', '_', 'd', 'n', 's', '_', 'l',
-'o', 'o', 'k', 'u', 'p', 's', '\030', '-', ' ', '\001', '(', '\010', 'R', '\023', 'u', 's', 'e', 'T', 'c', 'p', 'F', 'o', 'r', 'D', 'n',
-'s', 'L', 'o', 'o', 'k', 'u', 'p', 's', '\022', 'V', '\n', '\021', 'o', 'u', 't', 'l', 'i', 'e', 'r', '_', 'd', 'e', 't', 'e', 'c',
-'t', 'i', 'o', 'n', '\030', '\023', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't',
-'i', 'o', 'n', 'R', '\020', 'o', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '\022', 'N', '\n', '\020',
-'c', 'l', 'e', 'a', 'n', 'u', 'p', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\024', ' ', '\001', '(', '\013', '2', '\031', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B',
-'\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\017', 'c', 'l', 'e', 'a', 'n', 'u', 'p', 'I', 'n', 't', 'e', 'r', 'v', 'a',
-'l', '\022', 'R', '\n', '\024', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'b', 'i', 'n', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g',
-'\030', '\025', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
-'e', '.', 'v', '3', '.', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\022', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm',
-'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Y', '\n', '\020', 'l', 'b', '_', 's', 'u', 'b', 's', 'e', 't', '_', 'c',
-'o', 'n', 'f', 'i', 'g', '\030', '\026', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u',
-'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'l', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i',
-'g', '\022', 'b', '\n', '\023', 'r', 'i', 'n', 'g', '_', 'h', 'a', 's', 'h', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030',
-'\027', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's',
-'t', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b',
-'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\020', 'r', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i',
-'g', '\022', '[', '\n', '\020', 'm', 'a', 'g', 'l', 'e', 'v', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '4', ' ', '\001',
-'(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r',
-'.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'M', 'a', 'g', 'l', 'e', 'v', 'L', 'b', 'C', 'o', 'n', 'f', 'i',
-'g', 'H', '\001', 'R', '\016', 'm', 'a', 'g', 'l', 'e', 'v', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'k', '\n', '\026', 'o', 'r',
-'i', 'g', 'i', 'n', 'a', 'l', '_', 'd', 's', 't', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\"', ' ', '\001', '(',
-'\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.',
-'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C',
-'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\023', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n',
-'f', 'i', 'g', '\022', 'n', '\n', '\027', 'l', 'e', 'a', 's', 't', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'l', 'b', '_', 'c',
-'o', 'n', 'f', 'i', 'g', '\030', '%', ' ', '\001', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'e', 'a', 's',
-'t', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\001', 'R', '\024', 'l', 'e', 'a', 's', 't',
-'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Y', '\n', '\020', 'c', 'o', 'm', 'm', 'o', 'n',
-'_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\033', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r',
-'.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'c', 'o', 'm', 'm', 'o', 'n', 'L', 'b',
-'C', 'o', 'n', 'f', 'i', 'g', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e',
-'t', '\030', '\030', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R', '\017', 't', 'r',
-'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a',
-'\030', '\031', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
-'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'h',
-'\n', '\022', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 's', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\032', ' ', '\001', '(',
-'\016', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.',
-'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'c', 'o',
-'l', 'S', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'R', '\021', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c',
-'t', 'i', 'o', 'n', '\022', 'r', '\n', '\033', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\036', ' ', '\001', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'U', 'p', 's', 't', 'r', 'e', 'a',
-'m', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\031', 'u', 'p', 's', 't', 'r',
-'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'U', '\n', '(', 'c',
-'l', 'o', 's', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', '_', 'o', 'n', '_', 'h', 'o', 's', 't', '_',
-'h', 'e', 'a', 'l', 't', 'h', '_', 'f', 'a', 'i', 'l', 'u', 'r', 'e', '\030', '\037', ' ', '\001', '(', '\010', 'R', '#', 'c', 'l', 'o',
-'s', 'e', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', 'O', 'n', 'H', 'o', 's', 't', 'H', 'e', 'a', 'l', 't', 'h',
-'F', 'a', 'i', 'l', 'u', 'r', 'e', '\022', '@', '\n', '\035', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'h', 'e', 'a', 'l', 't', 'h', '_',
-'o', 'n', '_', 'h', 'o', 's', 't', '_', 'r', 'e', 'm', 'o', 'v', 'a', 'l', '\030', ' ', ' ', '\001', '(', '\010', 'R', '\031', 'i', 'g',
-'n', 'o', 'r', 'e', 'H', 'e', 'a', 'l', 't', 'h', 'O', 'n', 'H', 'o', 's', 't', 'R', 'e', 'm', 'o', 'v', 'a', 'l', '\022', '9',
-'\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '(', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\007',
-'f', 'i', 'l', 't', 'e', 'r', 's', '\022', '`', '\n', '\025', 'l', 'o', 'a', 'd', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g',
-'_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', ')', ' ', '\001', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c',
-'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\023', 'l', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P',
-'o', 'l', 'i', 'c', 'y', '\022', 'A', '\n', '\n', 'l', 'r', 's', '_', 's', 'e', 'r', 'v', 'e', 'r', '\030', '*', ' ', '\001', '(', '\013',
-'2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C',
-'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'l', 'r', 's', 'S', 'e', 'r', 'v', 'e', 'r', '\022', '6', '\n',
-'\025', 't', 'r', 'a', 'c', 'k', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'b', 'u', 'd', 'g', 'e', 't', 's', '\030', '/', ' ',
-'\001', '(', '\010', 'B', '\002', '\030', '\001', 'R', '\023', 't', 'r', 'a', 'c', 'k', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g',
-'e', 't', 's', '\022', 'S', '\n', '\017', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '0', ' ',
-'\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u',
-'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Z', '\n', '\023', 't', 'r', 'a', 'c', 'k', '_', 'c', 'l',
-'u', 's', 't', 'e', 'r', '_', 's', 't', 'a', 't', 's', '\030', '1', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'k', 'C',
-'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', 'R', '\021', 't', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r',
-'S', 't', 'a', 't', 's', '\022', 'X', '\n', '\017', 'p', 'r', 'e', 'f', 'e', 't', 'c', 'h', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030',
-'2', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's',
-'t', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'P', 'r', 'e', 'f', 'e', 't', 'c', 'h', 'P', 'o',
-'l', 'i', 'c', 'y', 'R', '\016', 'p', 'r', 'e', 'f', 'e', 't', 'c', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', ')', 'c',
-'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'p', 'o', 'o', 'l', '_', 'p', 'e', 'r', '_', 'd', 'o', 'w', 'n', 's', 't',
-'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\030', '3', ' ', '\001', '(', '\010', 'R', '%', 'c', 'o',
-'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'o', 'o', 'l', 'P', 'e', 'r', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm',
-'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\032', '\346', '\001', '\n', '\024', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S',
-'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B',
-'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '-', '\n', '\005', 'm', 'a', 't', 'c', 'h', '\030', '\002',
-' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't',
-'r', 'u', 'c', 't', 'R', '\005', 'm', 'a', 't', 'c', 'h', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_',
-'s', 'o', 'c', 'k', 'e', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e',
-'t', 'R', '\017', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', ':', '0', '\232', '\305', '\210', '\036', '+',
-'\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'r',
-'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', '\032', '\230', '\001', '\n', '\021', 'C', 'u',
-'s', 't', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001',
-' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014', 't', 'y',
-'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i',
-'g', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l',
-'u', 's', 't', 'e', 'r', '.', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\032', '\247',
-'\002', '\n', '\020', 'E', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'A', '\n', '\n', 'e', 'd',
-'s', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e',
-'R', '\t', 'e', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '9', '\n', '\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a',
-'m', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\026', '\362', '\230', '\376', '\217', '\005', '\020', '\022', '\016', 'n', 'a', 'm', 'e', '_', 's', 'p',
-'e', 'c', 'i', 'f', 'i', 'e', 'r', 'R', '\013', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', '\022', 'g', '\n', '\024', 'e',
-'d', 's', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '\030', '\003', ' ', '\001', '(', '\013',
-'2', '\035', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L',
-'o', 'c', 'a', 't', 'o', 'r', 'B', '\026', '\362', '\230', '\376', '\217', '\005', '\020', '\022', '\016', 'n', 'a', 'm', 'e', '_', 's', 'p', 'e', 'c',
-'i', 'f', 'i', 'e', 'r', 'R', '\022', 'e', 'd', 's', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r',
-':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u',
-'s', 't', 'e', 'r', '.', 'E', 'd', 's', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\300', '\010', '\n',
-'\016', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'y', '\n', '\017', 'f', 'a', 'l', 'l', 'b', 'a',
-'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\001', ' ', '\001', '(', '\016', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\023', 'l', 'o', 'a', 'd',
+'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'A', '\n', '\n', 'l', 'r', 's', '_', 's', 'e',
+'r', 'v', 'e', 'r', '\030', '*', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'l', 'r',
+'s', 'S', 'e', 'r', 'v', 'e', 'r', '\022', '6', '\n', '\025', 't', 'r', 'a', 'c', 'k', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_',
+'b', 'u', 'd', 'g', 'e', 't', 's', '\030', '/', ' ', '\001', '(', '\010', 'B', '\002', '\030', '\001', 'R', '\023', 't', 'r', 'a', 'c', 'k', 'T',
+'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', '\022', 'S', '\n', '\017', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm',
+'_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '0', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o',
+'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'Z',
+'\n', '\023', 't', 'r', 'a', 'c', 'k', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 't', 'a', 't', 's', '\030', '1', ' ', '\001',
+'(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r',
+'.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', 'R', '\021', 't', 'r',
+'a', 'c', 'k', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '^', '\n', '\021', 'p', 'r', 'e', 'c', 'o', 'n',
+'n', 'e', 'c', 't', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '2', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e',
+'r', '.', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\020', 'p', 'r', 'e', 'c', 'o',
+'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'X', '\n', ')', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'_', 'p', 'o', 'o', 'l', '_', 'p', 'e', 'r', '_', 'd', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', '_', 'c', 'o', 'n', 'n',
+'e', 'c', 't', 'i', 'o', 'n', '\030', '3', ' ', '\001', '(', '\010', 'R', '%', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P',
+'o', 'o', 'l', 'P', 'e', 'r', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
+'n', '\032', '\346', '\001', '\n', '\024', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c',
+'h', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
+'\004', 'n', 'a', 'm', 'e', '\022', '-', '\n', '\005', 'm', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\005', 'm', 'a', 't',
+'c', 'h', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '\030', '\003', ' ',
+'\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R', '\017', 't', 'r', 'a', 'n', 's', 'p',
+'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a',
+'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o',
+'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', '\032', '\230', '\001', '\n', '\021', 'C', 'u', 's', 't', 'o', 'm', 'C', 'l', 'u', 's', 't',
+'e', 'r', 'T', 'y', 'p', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
+'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i',
+'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '-', '\232', '\305', '\210', '\036', '(', '\n',
+'&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'u', 's',
+'t', 'o', 'm', 'C', 'l', 'u', 's', 't', 'e', 'r', 'T', 'y', 'p', 'e', '\032', '\246', '\001', '\n', '\020', 'E', 'd', 's', 'C', 'l', 'u',
+'s', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'A', '\n', '\n', 'e', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030',
+'\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'e', 'd', 's', 'C', 'o', 'n', 'f',
+'i', 'g', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R',
+'\013', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'E', 'd', 's', 'C', 'l', 'u', 's', 't',
+'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\300', '\010', '\n', '\016', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f',
+'i', 'g', '\022', 'y', '\n', '\017', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\001', ' ', '\001',
+'(', '\016', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r',
+'.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i',
+'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B',
+'\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\016', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y',
+'\022', '>', '\n', '\016', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\002', ' ', '\001', '(', '\013', '2',
+'\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R',
+'\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'S', 'u', 'b', 's', 'e', 't', '\022', 'k', '\n', '\020', 's', 'u', 'b', 's', 'e', 't', '_',
+'s', 'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.',
-'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a',
-'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\016', 'f',
-'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '>', '\n', '\016', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_',
-'s', 'u', 'b', 's', 'e', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'S', 'u', 'b', 's',
-'e', 't', '\022', 'k', '\n', '\020', 's', 'u', 'b', 's', 'e', 't', '_', 's', 'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\030', '\003', ' ',
-'\003', '(', '\013', '2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e',
-'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f',
-'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'R', '\017', 's', 'u', 'b', 's',
-'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\022', '2', '\n', '\025', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w',
-'e', 'i', 'g', 'h', 't', '_', 'a', 'w', 'a', 'r', 'e', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\023', 'l', 'o', 'c', 'a', 'l', 'i',
-'t', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'A', 'w', 'a', 'r', 'e', '\022', '2', '\n', '\025', 's', 'c', 'a', 'l', 'e', '_', 'l', 'o',
-'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\023', 's', 'c', 'a', 'l',
-'e', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', '\022', '$', '\n', '\016', 'p', 'a', 'n', 'i', 'c', '_',
-'m', 'o', 'd', 'e', '_', 'a', 'n', 'y', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\014', 'p', 'a', 'n', 'i', 'c', 'M', 'o', 'd', 'e',
-'A', 'n', 'y', '\022', '\036', '\n', '\013', 'l', 'i', 's', 't', '_', 'a', 's', '_', 'a', 'n', 'y', '\030', '\007', ' ', '\001', '(', '\010', 'R',
-'\t', 'l', 'i', 's', 't', 'A', 's', 'A', 'n', 'y', '\032', '\332', '\003', '\n', '\020', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e',
-'l', 'e', 'c', 't', 'o', 'r', '\022', '\022', '\n', '\004', 'k', 'e', 'y', 's', '\030', '\001', ' ', '\003', '(', '\t', 'R', '\004', 'k', 'e', 'y',
-'s', '\022', '3', '\n', '\026', 's', 'i', 'n', 'g', 'l', 'e', '_', 'h', 'o', 's', 't', '_', 'p', 'e', 'r', '_', 's', 'u', 'b', 's',
-'e', 't', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\023', 's', 'i', 'n', 'g', 'l', 'e', 'H', 'o', 's', 't', 'P', 'e', 'r', 'S', 'u',
-'b', 's', 'e', 't', '\022', '\222', '\001', '\n', '\017', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030',
-'\002', ' ', '\001', '(', '\016', '2', '_', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's',
-'t', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o',
-'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '.', 'L', 'b', 'S',
-'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i',
-'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\016', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l',
-'i', 'c', 'y', '\022', '0', '\n', '\024', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', '_', 'k', 'e', 'y', 's', '_', 's', 'u', 'b', 's',
-'e', 't', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\022', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'K', 'e', 'y', 's', 'S', 'u', 'b',
-'s', 'e', 't', '\"', 'y', '\n', '\036', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'F', 'a',
-'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'N', 'O', 'T', '_', 'D', 'E', 'F', 'I', 'N',
-'E', 'D', '\020', '\000', '\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', '\001', '\022', '\020', '\n', '\014',
-'A', 'N', 'Y', '_', 'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020', '\002', '\022', '\022', '\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T',
-'_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\003', '\022', '\017', '\n', '\013', 'K', 'E', 'Y', 'S', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020',
-'\004', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l',
-'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u',
-'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '\"', 'O', '\n', '\026', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F',
-'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B',
-'A', 'C', 'K', '\020', '\000', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_', 'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020', '\001', '\022', '\022',
-'\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\002', ':', '*', '\232', '\305', '\210', '\036', '%',
-'\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b',
-'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\347', '\001', '\n', '\024', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q',
-'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'H', '\n', '\014', 'c', 'h', 'o', 'i', 'c', 'e', '_', 'c', 'o',
-'u', 'n', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\002', 'R', '\013',
-'c', 'h', 'o', 'i', 'c', 'e', 'C', 'o', 'u', 'n', 't', '\022', 'S', '\n', '\023', 'a', 'c', 't', 'i', 'v', 'e', '_', 'r', 'e', 'q',
-'u', 'e', 's', 't', '_', 'b', 'i', 'a', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b',
-'l', 'e', 'R', '\021', 'a', 'c', 't', 'i', 'v', 'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'B', 'i', 'a', 's', ':', '0', '\232', '\305',
-'\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r',
-'.', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\221', '\003', '\n',
-'\020', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'T', '\n', '\021', 'm', 'i', 'n', 'i',
-'m', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o',
-'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B',
-'\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R', '\017', 'm', 'i', 'n', 'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S',
-'i', 'z', 'e', '\022', 'm', '\n', '\r', 'h', 'a', 's', 'h', '_', 'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(',
-'\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.',
-'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f',
-'i', 'g', '.', 'H', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001',
-'R', '\014', 'h', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', '\022', 'T', '\n', '\021', 'm', 'a', 'x', 'i', 'm', 'u', 'm',
-'_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B',
-'\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R', '\017', 'm', 'a', 'x', 'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', 'i', 'z', 'e',
-'\"', '.', '\n', '\014', 'H', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i', 'o', 'n', '\022', '\013', '\n', '\007', 'X', 'X', '_', 'H', 'A',
-'S', 'H', '\020', '\000', '\022', '\021', '\n', '\r', 'M', 'U', 'R', 'M', 'U', 'R', '_', 'H', 'A', 'S', 'H', '_', '2', '\020', '\001', ':', ',',
-'\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't',
-'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\002', '\020', '\003',
-'\032', 'M', '\n', '\016', 'M', 'a', 'g', 'l', 'e', 'v', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', ';', '\n', '\n', 't', 'a', 'b',
-'l', 'e', '_', 's', 'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 't', 'a', 'b', 'l', 'e',
-'S', 'i', 'z', 'e', '\032', 'n', '\n', '\023', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f',
-'i', 'g', '\022', '&', '\n', '\017', 'u', 's', 'e', '_', 'h', 't', 't', 'p', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001',
-'(', '\010', 'R', '\r', 'u', 's', 'e', 'H', 't', 't', 'p', 'H', 'e', 'a', 'd', 'e', 'r', ':', '/', '\232', '\305', '\210', '\036', '*', '\n',
-'(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'O', 'r', 'i',
-'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\374', '\n', '\n', '\016', 'C', 'o', 'm', 'm',
-'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'N', '\n', '\027', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'p', 'a', 'n',
-'i', 'c', '_', 't', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o',
-'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\025', 'h', 'e', 'a', 'l', 't', 'h',
-'y', 'P', 'a', 'n', 'i', 'c', 'T', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\022', 't', '\n', '\024', 'z', 'o', 'n', 'e', '_', 'a',
-'w', 'a', 'r', 'e', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', 'A', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u',
-'s', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A',
-'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\021', 'z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e',
-'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\211', '\001', '\n', '\033', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i',
-'g', 'h', 't', 'e', 'd', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', 'H', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l',
-'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a',
-'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\030', 'l',
-'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'I',
-'\n', '\023', 'u', 'p', 'd', 'a', 't', 'e', '_', 'm', 'e', 'r', 'g', 'e', '_', 'w', 'i', 'n', 'd', 'o', 'w', '\030', '\004', ' ', '\001',
-'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a',
-'t', 'i', 'o', 'n', 'R', '\021', 'u', 'p', 'd', 'a', 't', 'e', 'M', 'e', 'r', 'g', 'e', 'W', 'i', 'n', 'd', 'o', 'w', '\022', 'C',
-'\n', '\037', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'n', 'e', 'w', '_', 'h', 'o', 's', 't', 's', '_', 'u', 'n', 't', 'i', 'l', '_',
-'f', 'i', 'r', 's', 't', '_', 'h', 'c', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\032', 'i', 'g', 'n', 'o', 'r', 'e', 'N', 'e', 'w',
-'H', 'o', 's', 't', 's', 'U', 'n', 't', 'i', 'l', 'F', 'i', 'r', 's', 't', 'H', 'c', '\022', 'M', '\n', '$', 'c', 'l', 'o', 's',
-'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', '_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 's', 'e', 't',
-'_', 'c', 'h', 'a', 'n', 'g', 'e', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\037', 'c', 'l', 'o', 's', 'e', 'C', 'o', 'n', 'n', 'e',
-'c', 't', 'i', 'o', 'n', 's', 'O', 'n', 'H', 'o', 's', 't', 'S', 'e', 't', 'C', 'h', 'a', 'n', 'g', 'e', '\022', '\212', '\001', '\n',
-'\034', 'c', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', '_', 'h', 'a', 's', 'h', 'i', 'n', 'g', '_', 'l', 'b', '_', 'c', 'o',
-'n', 'f', 'i', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'I', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o',
-'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i',
-'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\031', 'c', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's',
-'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\215', '\002', '\n', '\021', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r',
-'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '?', '\n', '\017', 'r', 'o', 'u', 't', 'i', 'n', 'g', '_', 'e', 'n', 'a', 'b',
-'l', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3',
-'.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'o', 'u', 't', 'i', 'n', 'g', 'E', 'n', 'a', 'b', 'l', 'e', 'd', '\022',
-'F', '\n', '\020', 'm', 'i', 'n', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 'i', 'z', 'e', '\030', '\002', ' ', '\001', '(', '\013',
+'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e',
+'l', 'e', 'c', 't', 'o', 'r', 'R', '\017', 's', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 's', '\022', '2',
+'\n', '\025', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', '_', 'a', 'w', 'a', 'r', 'e', '\030', '\004',
+' ', '\001', '(', '\010', 'R', '\023', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'A', 'w', 'a', 'r', 'e',
+'\022', '2', '\n', '\025', 's', 'c', 'a', 'l', 'e', '_', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't',
+'\030', '\005', ' ', '\001', '(', '\010', 'R', '\023', 's', 'c', 'a', 'l', 'e', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g',
+'h', 't', '\022', '$', '\n', '\016', 'p', 'a', 'n', 'i', 'c', '_', 'm', 'o', 'd', 'e', '_', 'a', 'n', 'y', '\030', '\006', ' ', '\001', '(',
+'\010', 'R', '\014', 'p', 'a', 'n', 'i', 'c', 'M', 'o', 'd', 'e', 'A', 'n', 'y', '\022', '\036', '\n', '\013', 'l', 'i', 's', 't', '_', 'a',
+'s', '_', 'a', 'n', 'y', '\030', '\007', ' ', '\001', '(', '\010', 'R', '\t', 'l', 'i', 's', 't', 'A', 's', 'A', 'n', 'y', '\032', '\332', '\003',
+'\n', '\020', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '\022', '\022', '\n', '\004', 'k', 'e', 'y',
+'s', '\030', '\001', ' ', '\003', '(', '\t', 'R', '\004', 'k', 'e', 'y', 's', '\022', '3', '\n', '\026', 's', 'i', 'n', 'g', 'l', 'e', '_', 'h',
+'o', 's', 't', '_', 'p', 'e', 'r', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\023', 's', 'i', 'n',
+'g', 'l', 'e', 'H', 'o', 's', 't', 'P', 'e', 'r', 'S', 'u', 'b', 's', 'e', 't', '\022', '\222', '\001', '\n', '\017', 'f', 'a', 'l', 'l',
+'b', 'a', 'c', 'k', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\002', ' ', '\001', '(', '\016', '2', '_', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e',
+'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't',
+'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r',
+'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R',
+'\016', 'f', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '0', '\n', '\024', 'f', 'a', 'l', 'l', 'b', 'a',
+'c', 'k', '_', 'k', 'e', 'y', 's', '_', 's', 'u', 'b', 's', 'e', 't', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\022', 'f', 'a', 'l',
+'l', 'b', 'a', 'c', 'k', 'K', 'e', 'y', 's', 'S', 'u', 'b', 's', 'e', 't', '\"', 'y', '\n', '\036', 'L', 'b', 'S', 'u', 'b', 's',
+'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y', '\022',
+'\017', '\n', '\013', 'N', 'O', 'T', '_', 'D', 'E', 'F', 'I', 'N', 'E', 'D', '\020', '\000', '\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A',
+'L', 'L', 'B', 'A', 'C', 'K', '\020', '\001', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_', 'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020',
+'\002', '\022', '\022', '\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\003', '\022', '\017', '\n', '\013',
+'K', 'E', 'Y', 'S', '_', 'S', 'U', 'B', 'S', 'E', 'T', '\020', '\004', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e',
+'t', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'S', 'e', 'l', 'e', 'c', 't', 'o', 'r', '\"',
+'O', '\n', '\026', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'F', 'a', 'l', 'l', 'b', 'a', 'c', 'k', 'P', 'o', 'l', 'i', 'c', 'y',
+'\022', '\017', '\n', '\013', 'N', 'O', '_', 'F', 'A', 'L', 'L', 'B', 'A', 'C', 'K', '\020', '\000', '\022', '\020', '\n', '\014', 'A', 'N', 'Y', '_',
+'E', 'N', 'D', 'P', 'O', 'I', 'N', 'T', '\020', '\001', '\022', '\022', '\n', '\016', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '_', 'S', 'U', 'B',
+'S', 'E', 'T', '\020', '\002', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
+'2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'b', 'S', 'u', 'b', 's', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032',
+'\347', '\001', '\n', '\024', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022',
+'H', '\n', '\014', 'c', 'h', 'o', 'i', 'c', 'e', '_', 'c', 'o', 'u', 'n', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g',
+'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u',
+'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\002', 'R', '\013', 'c', 'h', 'o', 'i', 'c', 'e', 'C', 'o', 'u', 'n', 't', '\022', 'S',
+'\n', '\023', 'a', 'c', 't', 'i', 'v', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'b', 'i', 'a', 's', '\030', '\002', ' ', '\001',
+'(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
+'.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', 'R', '\021', 'a', 'c', 't', 'i', 'v', 'e', 'R', 'e', 'q',
+'u', 'e', 's', 't', 'B', 'i', 'a', 's', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'L', 'e', 'a', 's', 't', 'R', 'e', 'q', 'u', 'e', 's', 't',
+'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\221', '\003', '\n', '\020', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o',
+'n', 'f', 'i', 'g', '\022', 'T', '\n', '\021', 'm', 'i', 'n', 'i', 'm', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z', 'e',
+'\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R', '\017',
+'m', 'i', 'n', 'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', 'i', 'z', 'e', '\022', 'm', '\n', '\r', 'h', 'a', 's', 'h', '_', 'f',
+'u', 'n', 'c', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i',
+'n', 'g', 'H', 'a', 's', 'h', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'H', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i',
+'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\014', 'h', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't', 'i', 'o',
+'n', '\022', 'T', '\n', '\021', 'm', 'a', 'x', 'i', 'm', 'u', 'm', '_', 'r', 'i', 'n', 'g', '_', 's', 'i', 'z', 'e', '\030', '\004', ' ',
+'\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n',
+'t', '6', '4', 'V', 'a', 'l', 'u', 'e', 'B', '\n', '\372', 'B', '\007', '2', '\005', '\030', '\200', '\200', '\200', '\004', 'R', '\017', 'm', 'a', 'x',
+'i', 'm', 'u', 'm', 'R', 'i', 'n', 'g', 'S', 'i', 'z', 'e', '\"', '.', '\n', '\014', 'H', 'a', 's', 'h', 'F', 'u', 'n', 'c', 't',
+'i', 'o', 'n', '\022', '\013', '\n', '\007', 'X', 'X', '_', 'H', 'A', 'S', 'H', '\020', '\000', '\022', '\021', '\n', '\r', 'M', 'U', 'R', 'M', 'U',
+'R', '_', 'H', 'A', 'S', 'H', '_', '2', '\020', '\001', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.',
+'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'i', 'n', 'g', 'H', 'a', 's', 'h', 'L', 'b',
+'C', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\002', '\020', '\003', '\032', 'M', '\n', '\016', 'M', 'a', 'g', 'l', 'e', 'v', 'L', 'b', 'C',
+'o', 'n', 'f', 'i', 'g', '\022', ';', '\n', '\n', 't', 'a', 'b', 'l', 'e', '_', 's', 'i', 'z', 'e', '\030', '\001', ' ', '\001', '(', '\013',
'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4',
-'V', 'a', 'l', 'u', 'e', 'R', '\016', 'm', 'i', 'n', 'C', 'l', 'u', 's', 't', 'e', 'r', 'S', 'i', 'z', 'e', '\022', '1', '\n', '\025',
-'f', 'a', 'i', 'l', '_', 't', 'r', 'a', 'f', 'f', 'i', 'c', '_', 'o', 'n', '_', 'p', 'a', 'n', 'i', 'c', '\030', '\003', ' ', '\001',
-'(', '\010', 'R', '\022', 'f', 'a', 'i', 'l', 'T', 'r', 'a', 'f', 'f', 'i', 'c', 'O', 'n', 'P', 'a', 'n', 'i', 'c', ':', '<', '\232',
-'\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e',
-'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r',
-'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '_', '\n', '\030', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g',
-'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', ':', 'C', '\232', '\305', '\210', '\036', '>', '\n', '<', 'e', 'n', 'v', 'o',
+'V', 'a', 'l', 'u', 'e', 'R', '\t', 't', 'a', 'b', 'l', 'e', 'S', 'i', 'z', 'e', '\032', 'n', '\n', '\023', 'O', 'r', 'i', 'g', 'i',
+'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '&', '\n', '\017', 'u', 's', 'e', '_', 'h', 't', 't',
+'p', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\r', 'u', 's', 'e', 'H', 't', 't', 'p', 'H', 'e',
+'a', 'd', 'e', 'r', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2',
+'.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'O', 'r', 'i', 'g', 'i', 'n', 'a', 'l', 'D', 's', 't', 'L', 'b', 'C', 'o', 'n',
+'f', 'i', 'g', '\032', '\374', '\n', '\n', '\016', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'N', '\n',
+'\027', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'p', 'a', 'n', 'i', 'c', '_', 't', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030',
+'\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r',
+'c', 'e', 'n', 't', 'R', '\025', 'h', 'e', 'a', 'l', 't', 'h', 'y', 'P', 'a', 'n', 'i', 'c', 'T', 'h', 'r', 'e', 's', 'h', 'o',
+'l', 'd', '\022', 't', '\n', '\024', 'z', 'o', 'n', 'e', '_', 'a', 'w', 'a', 'r', 'e', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i',
+'g', '\030', '\002', ' ', '\001', '(', '\013', '2', 'A', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l',
+'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b',
+'C', 'o', 'n', 'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H',
+'\000', 'R', '\021', 'z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\211', '\001', '\n', '\033',
+'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f',
+'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', 'H', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
+'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L',
+'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L',
+'b', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\030', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't',
+'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'I', '\n', '\023', 'u', 'p', 'd', 'a', 't', 'e', '_', 'm', 'e', 'r', 'g',
+'e', '_', 'w', 'i', 'n', 'd', 'o', 'w', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\021', 'u', 'p', 'd', 'a', 't', 'e', 'M',
+'e', 'r', 'g', 'e', 'W', 'i', 'n', 'd', 'o', 'w', '\022', 'C', '\n', '\037', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'n', 'e', 'w', '_',
+'h', 'o', 's', 't', 's', '_', 'u', 'n', 't', 'i', 'l', '_', 'f', 'i', 'r', 's', 't', '_', 'h', 'c', '\030', '\005', ' ', '\001', '(',
+'\010', 'R', '\032', 'i', 'g', 'n', 'o', 'r', 'e', 'N', 'e', 'w', 'H', 'o', 's', 't', 's', 'U', 'n', 't', 'i', 'l', 'F', 'i', 'r',
+'s', 't', 'H', 'c', '\022', 'M', '\n', '$', 'c', 'l', 'o', 's', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's',
+'_', 'o', 'n', '_', 'h', 'o', 's', 't', '_', 's', 'e', 't', '_', 'c', 'h', 'a', 'n', 'g', 'e', '\030', '\006', ' ', '\001', '(', '\010',
+'R', '\037', 'c', 'l', 'o', 's', 'e', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 's', 'O', 'n', 'H', 'o', 's', 't', 'S',
+'e', 't', 'C', 'h', 'a', 'n', 'g', 'e', '\022', '\212', '\001', '\n', '\034', 'c', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', '_', 'h',
+'a', 's', 'h', 'i', 'n', 'g', '_', 'l', 'b', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'I', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '.', 'C',
+'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n',
+'s', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\031', 'c',
+'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032',
+'\215', '\002', '\n', '\021', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '?', '\n', '\017',
+'r', 'o', 'u', 't', 'i', 'n', 'g', '_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e',
+'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'o', 'u',
+'t', 'i', 'n', 'g', 'E', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'F', '\n', '\020', 'm', 'i', 'n', '_', 'c', 'l', 'u', 's', 't', 'e',
+'r', '_', 's', 'i', 'z', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '6', '4', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'm', 'i', 'n', 'C', 'l', 'u',
+'s', 't', 'e', 'r', 'S', 'i', 'z', 'e', '\022', '1', '\n', '\025', 'f', 'a', 'i', 'l', '_', 't', 'r', 'a', 'f', 'f', 'i', 'c', '_',
+'o', 'n', '_', 'p', 'a', 'n', 'i', 'c', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\022', 'f', 'a', 'i', 'l', 'T', 'r', 'a', 'f', 'f',
+'i', 'c', 'O', 'n', 'P', 'a', 'n', 'i', 'c', ':', '<', '\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', '.', 'a',
+'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n',
+'f', 'i', 'g', '.', 'Z', 'o', 'n', 'e', 'A', 'w', 'a', 'r', 'e', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '_', '\n', '\030',
+'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', ':',
+'C', '\232', '\305', '\210', '\036', '>', '\n', '<', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's',
+'t', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', 'l', 'i',
+'t', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\361', '\001', '\n', '\031', 'C', 'o',
+'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '7',
+'\n', '\030', 'u', 's', 'e', '_', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e', '_', 'f', 'o', 'r', '_', 'h', 'a', 's', 'h', 'i', 'n',
+'g', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\025', 'u', 's', 'e', 'H', 'o', 's', 't', 'n', 'a', 'm', 'e', 'F', 'o', 'r', 'H', 'a',
+'s', 'h', 'i', 'n', 'g', '\022', 'U', '\n', '\023', 'h', 'a', 's', 'h', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'f', 'a', 'c',
+'t', 'o', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', 'd', 'R', '\021',
+'h', 'a', 's', 'h', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'F', 'a', 'c', 't', 'o', 'r', ':', 'D', '\232', '\305', '\210', '\036', '?', '\n',
+'=', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm',
+'m', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's',
+'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o',
'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b',
-'C', 'o', 'n', 'f', 'i', 'g', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'L', 'b',
-'C', 'o', 'n', 'f', 'i', 'g', '\032', '\361', '\001', '\n', '\031', 'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h',
-'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '7', '\n', '\030', 'u', 's', 'e', '_', 'h', 'o', 's', 't', 'n', 'a',
-'m', 'e', '_', 'f', 'o', 'r', '_', 'h', 'a', 's', 'h', 'i', 'n', 'g', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\025', 'u', 's', 'e',
-'H', 'o', 's', 't', 'n', 'a', 'm', 'e', 'F', 'o', 'r', 'H', 'a', 's', 'h', 'i', 'n', 'g', '\022', 'U', '\n', '\023', 'h', 'a', 's',
-'h', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'f', 'a', 'c', 't', 'o', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l',
-'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', 'd', 'R', '\021', 'h', 'a', 's', 'h', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'F',
-'a', 'c', 't', 'o', 'r', ':', 'D', '\232', '\305', '\210', '\036', '?', '\n', '=', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
-'2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', '.',
-'C', 'o', 'n', 's', 'i', 's', 't', 'e', 'n', 't', 'H', 'a', 's', 'h', 'i', 'n', 'g', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g',
-':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u',
-'s', 't', 'e', 'r', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'L', 'b', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\033', '\n', '\031', 'l', 'o',
-'c', 'a', 'l', 'i', 't', 'y', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\032', '\322',
-'\001', '\n', '\013', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\022', 'N', '\n', '\r', 'b', 'a', 's', 'e', '_', 'i', 'n',
-'t', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\016', '\372', 'B', '\013', '\252', '\001', '\010', '\010', '\001', '*',
-'\004', '\020', '\300', '\204', '=', 'R', '\014', 'b', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'J', '\n', '\014', 'm', 'a',
-'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', '\001',
-'\006', '*', '\004', '\020', '\300', '\204', '=', 'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', ':', '\'', '\232', '\305', '\210',
-'\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.',
-'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\032', '\371', '\001', '\n', '\016', 'P', 'r', 'e', 'f', 'e', 't', 'c', 'h', 'P',
-'o', 'l', 'i', 'c', 'y', '\022', 't', '\n', '\033', 'p', 'e', 'r', '_', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'p', 'r', 'e',
-'f', 'e', 't', 'c', 'h', '_', 'r', 'a', 't', 'i', 'o', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\027', '\372',
-'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000', '\000', '\000', '\010', '@', ')', '\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R', '\030', 'p',
-'e', 'r', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'P', 'r', 'e', 'f', 'e', 't', 'c', 'h', 'R', 'a', 't', 'i', 'o', '\022', 'q',
-'\n', '\031', 'p', 'r', 'e', 'd', 'i', 'c', 't', 'i', 'v', 'e', '_', 'p', 'r', 'e', 'f', 'e', 't', 'c', 'h', '_', 'r', 'a', 't',
-'i', 'o', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'C', 'o', 'n', 'f', 'i', 'g', 'B', '\033', '\n', '\031', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '_', 'c', 'o', 'n', 'f', 'i', 'g',
+'_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\032', '\322', '\001', '\n', '\013', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't',
+'e', '\022', 'N', '\n', '\r', 'b', 'a', 's', 'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2',
+'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
+'n', 'B', '\016', '\372', 'B', '\013', '\252', '\001', '\010', '\010', '\001', '*', '\004', '\020', '\300', '\204', '=', 'R', '\014', 'b', 'a', 's', 'e', 'I', 'n',
+'t', 'e', 'r', 'v', 'a', 'l', '\022', 'J', '\n', '\014', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ',
+'\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r',
+'a', 't', 'i', 'o', 'n', 'B', '\014', '\372', 'B', '\t', '\252', '\001', '\006', '*', '\004', '\020', '\300', '\204', '=', 'R', '\013', 'm', 'a', 'x', 'I',
+'n', 't', 'e', 'r', 'v', 'a', 'l', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'R', 'e', 'f', 'r', 'e', 's', 'h', 'R', 'a', 't', 'e', '\032', '\203',
+'\002', '\n', '\020', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'x', '\n', '\035', 'p', 'e',
+'r', '_', 'u', 'p', 's', 't', 'r', 'e', 'a', 'm', '_', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'r', 'a', 't',
+'i', 'o', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\027', '\372', 'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000',
-'\000', '\000', '\010', '@', ')', '\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R', '\027', 'p', 'r', 'e', 'd', 'i', 'c', 't', 'i', 'v', 'e',
-'P', 'r', 'e', 'f', 'e', 't', 'c', 'h', 'R', 'a', 't', 'i', 'o', '\032', 'f', '\n', '\"', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't',
-'e', 'n', 's', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r',
-'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a',
-'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', 'W', '\n', '\r', 'D', 'i', 's', 'c',
-'o', 'v', 'e', 'r', 'y', 'T', 'y', 'p', 'e', '\022', '\n', '\n', '\006', 'S', 'T', 'A', 'T', 'I', 'C', '\020', '\000', '\022', '\016', '\n', '\n',
-'S', 'T', 'R', 'I', 'C', 'T', '_', 'D', 'N', 'S', '\020', '\001', '\022', '\017', '\n', '\013', 'L', 'O', 'G', 'I', 'C', 'A', 'L', '_', 'D',
-'N', 'S', '\020', '\002', '\022', '\007', '\n', '\003', 'E', 'D', 'S', '\020', '\003', '\022', '\020', '\n', '\014', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L',
-'_', 'D', 'S', 'T', '\020', '\004', '\"', '\244', '\001', '\n', '\010', 'L', 'b', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'R', 'O',
-'U', 'N', 'D', '_', 'R', 'O', 'B', 'I', 'N', '\020', '\000', '\022', '\021', '\n', '\r', 'L', 'E', 'A', 'S', 'T', '_', 'R', 'E', 'Q', 'U',
-'E', 'S', 'T', '\020', '\001', '\022', '\r', '\n', '\t', 'R', 'I', 'N', 'G', '_', 'H', 'A', 'S', 'H', '\020', '\002', '\022', '\n', '\n', '\006', 'R',
-'A', 'N', 'D', 'O', 'M', '\020', '\003', '\022', '\n', '\n', '\006', 'M', 'A', 'G', 'L', 'E', 'V', '\020', '\005', '\022', '\024', '\n', '\020', 'C', 'L',
-'U', 'S', 'T', 'E', 'R', '_', 'P', 'R', 'O', 'V', 'I', 'D', 'E', 'D', '\020', '\006', '\022', ' ', '\n', '\034', 'L', 'O', 'A', 'D', '_',
-'B', 'A', 'L', 'A', 'N', 'C', 'I', 'N', 'G', '_', 'P', 'O', 'L', 'I', 'C', 'Y', '_', 'C', 'O', 'N', 'F', 'I', 'G', '\020', '\007',
-'\"', '\004', '\010', '\004', '\020', '\004', '*', '\017', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L', '_', 'D', 'S', 'T', '_', 'L', 'B', '\"', '5',
-'\n', '\017', 'D', 'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O',
-'\020', '\000', '\022', '\013', '\n', '\007', 'V', '4', '_', 'O', 'N', 'L', 'Y', '\020', '\001', '\022', '\013', '\n', '\007', 'V', '6', '_', 'O', 'N', 'L',
-'Y', '\020', '\002', '\"', 'T', '\n', '\030', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', 'l',
-'e', 'c', 't', 'i', 'o', 'n', '\022', '\033', '\n', '\027', 'U', 'S', 'E', '_', 'C', 'O', 'N', 'F', 'I', 'G', 'U', 'R', 'E', 'D', '_',
-'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L', '\020', '\000', '\022', '\033', '\n', '\027', 'U', 'S', 'E', '_', 'D', 'O', 'W', 'N', 'S', 'T', 'R',
-'E', 'A', 'M', '_', 'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L', '\020', '\001', ':', '\033', '\232', '\305', '\210', '\036', '\026', '\n', '\024', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'B', '\030', '\n', '\026', 'c', 'l', 'u',
-'s', 't', 'e', 'r', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '_', 't', 'y', 'p', 'e', 'B', '\013', '\n', '\t', 'l', 'b',
-'_', 'c', 'o', 'n', 'f', 'i', 'g', 'J', '\004', '\010', '\014', '\020', '\r', 'J', '\004', '\010', '\017', '\020', '\020', 'J', '\004', '\010', '\007', '\020', '\010',
-'J', '\004', '\010', '\013', '\020', '\014', 'J', '\004', '\010', '#', '\020', '$', 'R', '\005', 'h', 'o', 's', 't', 's', 'R', '\013', 't', 'l', 's', '_',
-'c', 'o', 'n', 't', 'e', 'x', 't', 'R', '\032', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c',
-'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\"', '\245', '\002', '\n', '\023', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c',
-'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\001', ' ', '\003',
-'(', '\013', '2', '3', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r',
-'.', 'v', '3', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P',
-'o', 'l', 'i', 'c', 'y', 'R', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\032', '\223', '\001', '\n', '\006', 'P', 'o', 'l', 'i', 'c',
-'y', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014',
-'t', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n',
-'f', 'i', 'g', ':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
-'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P', 'o', 'l', 'i', 'c',
-'y', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e',
-'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g',
-'P', 'o', 'l', 'i', 'c', 'y', '\"', '\202', '\001', '\n', '\022', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o',
-'n', 'f', 'i', 'g', '\022', 'D', '\n', '\016', 's', 'o', 'u', 'r', 'c', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\001', ' ',
-'\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'R', '\r', 's', 'o', 'u', 'r', 'c', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', ':',
-'&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'U', 'p', 's', 't',
-'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\"', '\223', '\001', '\n', '\031', 'U', 'p', 's', 't', 'r', 'e',
-'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'G', '\n', '\r', 't', 'c',
-'p', '_', 'k', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l',
-'i', 'v', 'e', 'R', '\014', 't', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', ':', '-', '\232', '\305', '\210', '\036', '(', '\n',
-'&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n',
-'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', 'r', '\n', '\021', 'T', 'r', 'a', 'c', 'k', 'C', 'l',
-'u', 's', 't', 'e', 'r', 'S', 't', 'a', 't', 's', '\022', '\'', '\n', '\017', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'b', 'u', 'd',
-'g', 'e', 't', 's', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\016', 't', 'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't',
-'s', '\022', '4', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 's', 'i', 'z',
-'e', 's', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\024', 'r', 'e', 'q', 'u', 'e', 's', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e',
-'S', 'i', 'z', 'e', 's', 'B', '?', '\n', '%', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', 'B', '\014', 'C', 'l',
-'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o',
-'t', 'o', '3',
+'\000', '\000', '\010', '@', ')', '\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R', '\032', 'p', 'e', 'r', 'U', 'p', 's', 't', 'r', 'e', 'a',
+'m', 'P', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'R', 'a', 't', 'i', 'o', '\022', 'u', '\n', '\033', 'p', 'r', 'e', 'd', 'i',
+'c', 't', 'i', 'v', 'e', '_', 'p', 'r', 'e', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'r', 'a', 't', 'i', 'o', '\030', '\002', ' ',
+'\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'o', 'u',
+'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\027', '\372', 'B', '\024', '\022', '\022', '\031', '\000', '\000', '\000', '\000', '\000', '\000', '\010', '@', ')',
+'\000', '\000', '\000', '\000', '\000', '\000', '\360', '?', 'R', '\031', 'p', 'r', 'e', 'd', 'i', 'c', 't', 'i', 'v', 'e', 'P', 'r', 'e', 'c', 'o',
+'n', 'n', 'e', 'c', 't', 'R', 'a', 't', 'i', 'o', '\032', 'f', '\n', '\"', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's',
+'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020',
+'\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e',
+'\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', 'W', '\n', '\r', 'D', 'i', 's', 'c', 'o', 'v', 'e',
+'r', 'y', 'T', 'y', 'p', 'e', '\022', '\n', '\n', '\006', 'S', 'T', 'A', 'T', 'I', 'C', '\020', '\000', '\022', '\016', '\n', '\n', 'S', 'T', 'R',
+'I', 'C', 'T', '_', 'D', 'N', 'S', '\020', '\001', '\022', '\017', '\n', '\013', 'L', 'O', 'G', 'I', 'C', 'A', 'L', '_', 'D', 'N', 'S', '\020',
+'\002', '\022', '\007', '\n', '\003', 'E', 'D', 'S', '\020', '\003', '\022', '\020', '\n', '\014', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L', '_', 'D', 'S',
+'T', '\020', '\004', '\"', '\244', '\001', '\n', '\010', 'L', 'b', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\017', '\n', '\013', 'R', 'O', 'U', 'N', 'D',
+'_', 'R', 'O', 'B', 'I', 'N', '\020', '\000', '\022', '\021', '\n', '\r', 'L', 'E', 'A', 'S', 'T', '_', 'R', 'E', 'Q', 'U', 'E', 'S', 'T',
+'\020', '\001', '\022', '\r', '\n', '\t', 'R', 'I', 'N', 'G', '_', 'H', 'A', 'S', 'H', '\020', '\002', '\022', '\n', '\n', '\006', 'R', 'A', 'N', 'D',
+'O', 'M', '\020', '\003', '\022', '\n', '\n', '\006', 'M', 'A', 'G', 'L', 'E', 'V', '\020', '\005', '\022', '\024', '\n', '\020', 'C', 'L', 'U', 'S', 'T',
+'E', 'R', '_', 'P', 'R', 'O', 'V', 'I', 'D', 'E', 'D', '\020', '\006', '\022', ' ', '\n', '\034', 'L', 'O', 'A', 'D', '_', 'B', 'A', 'L',
+'A', 'N', 'C', 'I', 'N', 'G', '_', 'P', 'O', 'L', 'I', 'C', 'Y', '_', 'C', 'O', 'N', 'F', 'I', 'G', '\020', '\007', '\"', '\004', '\010',
+'\004', '\020', '\004', '*', '\017', 'O', 'R', 'I', 'G', 'I', 'N', 'A', 'L', '_', 'D', 'S', 'T', '_', 'L', 'B', '\"', '5', '\n', '\017', 'D',
+'n', 's', 'L', 'o', 'o', 'k', 'u', 'p', 'F', 'a', 'm', 'i', 'l', 'y', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\022',
+'\013', '\n', '\007', 'V', '4', '_', 'O', 'N', 'L', 'Y', '\020', '\001', '\022', '\013', '\n', '\007', 'V', '6', '_', 'O', 'N', 'L', 'Y', '\020', '\002',
+'\"', 'T', '\n', '\030', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'S', 'e', 'l', 'e', 'c', 't',
+'i', 'o', 'n', '\022', '\033', '\n', '\027', 'U', 'S', 'E', '_', 'C', 'O', 'N', 'F', 'I', 'G', 'U', 'R', 'E', 'D', '_', 'P', 'R', 'O',
+'T', 'O', 'C', 'O', 'L', '\020', '\000', '\022', '\033', '\n', '\027', 'U', 'S', 'E', '_', 'D', 'O', 'W', 'N', 'S', 'T', 'R', 'E', 'A', 'M',
+'_', 'P', 'R', 'O', 'T', 'O', 'C', 'O', 'L', '\020', '\001', ':', '\033', '\232', '\305', '\210', '\036', '\026', '\n', '\024', 'e', 'n', 'v', 'o', 'y',
+'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'B', '\030', '\n', '\026', 'c', 'l', 'u', 's', 't', 'e',
+'r', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '_', 't', 'y', 'p', 'e', 'B', '\013', '\n', '\t', 'l', 'b', '_', 'c', 'o',
+'n', 'f', 'i', 'g', 'J', '\004', '\010', '\014', '\020', '\r', 'J', '\004', '\010', '\017', '\020', '\020', 'J', '\004', '\010', '\007', '\020', '\010', 'J', '\004', '\010',
+'\013', '\020', '\014', 'J', '\004', '\010', '#', '\020', '$', 'R', '\005', 'h', 'o', 's', 't', 's', 'R', '\013', 't', 'l', 's', '_', 'c', 'o', 'n',
+'t', 'e', 'x', 't', 'R', '\032', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_',
+'o', 'p', 't', 'i', 'o', 'n', 's', '\"', '\245', '\002', '\n', '\023', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g',
+'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2',
+'3', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3',
+'.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P', 'o', 'l', 'i',
+'c', 'y', 'R', '\010', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\032', '\223', '\001', '\n', '\006', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\022',
+'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '7', '\n', '\014', 't', 'y', 'p',
+'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g',
+':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'o', 'a',
+'d', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'J', '\004',
+'\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'o', 'a', 'd', 'B', 'a', 'l', 'a', 'n', 'c', 'i', 'n', 'g', 'P', 'o', 'l',
+'i', 'c', 'y', '\"', '\202', '\001', '\n', '\022', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i',
+'g', '\022', 'D', '\n', '\016', 's', 'o', 'u', 'r', 'c', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\001', ' ', '\001', '(', '\013',
+'2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A',
+'d', 'd', 'r', 'e', 's', 's', 'R', '\r', 's', 'o', 'u', 'r', 'c', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', ':', '&', '\232', '\305',
+'\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'U', 'p', 's', 't', 'r', 'e', 'a',
+'m', 'B', 'i', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\"', '\223', '\001', '\n', '\031', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C',
+'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'G', '\n', '\r', 't', 'c', 'p', '_', 'k',
+'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e',
+'R', '\014', 't', 'c', 'p', 'K', 'e', 'e', 'p', 'a', 'l', 'i', 'v', 'e', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'C', 'o', 'n', 'n', 'e', 'c',
+'t', 'i', 'o', 'n', 'O', 'p', 't', 'i', 'o', 'n', 's', '\"', 'r', '\n', '\021', 'T', 'r', 'a', 'c', 'k', 'C', 'l', 'u', 's', 't',
+'e', 'r', 'S', 't', 'a', 't', 's', '\022', '\'', '\n', '\017', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'b', 'u', 'd', 'g', 'e', 't',
+'s', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\016', 't', 'i', 'm', 'e', 'o', 'u', 't', 'B', 'u', 'd', 'g', 'e', 't', 's', '\022', '4',
+'\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 's', 'i', 'z', 'e', 's', '\030',
+'\002', ' ', '\001', '(', '\010', 'R', '\024', 'r', 'e', 'q', 'u', 'e', 's', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'S', 'i', 'z',
+'e', 's', 'B', '?', '\n', '%', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', 'B', '\014', 'C', 'l', 'u', 's', 't',
+'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[24] = {
+static upb_def_init *deps[21] = {
&envoy_config_cluster_v3_circuit_breaker_proto_upbdefinit,
&envoy_config_cluster_v3_filter_proto_upbdefinit,
&envoy_config_cluster_v3_outlier_detection_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
- &udpa_core_v1_collection_entry_proto_upbdefinit,
- &udpa_core_v1_resource_locator_proto_upbdefinit,
- &envoy_annotations_deprecation_proto_upbdefinit,
- &udpa_annotations_migrate_proto_upbdefinit,
+ &xds_core_v3_collection_entry_proto_upbdefinit,
&udpa_annotations_security_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
deps,
layouts,
"envoy/config/cluster/v3/cluster.proto",
- UPB_STRVIEW_INIT(descriptor, 10953)
+ UPB_STRVIEW_INIT(descriptor, 10750)
};
return upb_symtab_lookupmsg(s, "envoy.config.cluster.v3.Cluster.RefreshRate");
}
-UPB_INLINE const upb_msgdef *envoy_config_cluster_v3_Cluster_PrefetchPolicy_getmsgdef(upb_symtab *s) {
+UPB_INLINE const upb_msgdef *envoy_config_cluster_v3_Cluster_PreconnectPolicy_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_cluster_v3_cluster_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "envoy.config.cluster.v3.Cluster.PrefetchPolicy");
+ return upb_symtab_lookupmsg(s, "envoy.config.cluster.v3.Cluster.PreconnectPolicy");
}
UPB_INLINE const upb_msgdef *envoy_config_cluster_v3_Cluster_TypedExtensionProtocolOptionsEntry_getmsgdef(upb_symtab *s) {
&envoy_config_cluster_v3_OutlierDetection_msginit,
};
-static const char descriptor[2342] = {'\n', '/', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3',
+static const char descriptor[2423] = {'\n', '/', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '/', 'v', '3',
'/', 'o', 'u', 't', 'l', 'i', 'e', 'r', '_', 'd', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\022',
'\027', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v', '3', '\032',
'\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n',
'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a',
'/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p',
'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p',
-'r', 'o', 't', 'o', '\"', '\354', '\017', '\n', '\020', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n',
+'r', 'o', 't', 'o', '\"', '\275', '\020', '\n', '\020', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n',
'\022', 'E', '\n', '\017', 'c', 'o', 'n', 's', 'e', 'c', 'u', 't', 'i', 'v', 'e', '_', '5', 'x', 'x', '\030', '\001', ' ', '\001', '(', '\013',
'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2',
'V', 'a', 'l', 'u', 'e', 'R', '\016', 'c', 'o', 'n', 's', 'e', 'c', 'u', 't', 'i', 'v', 'e', '5', 'x', 'x', '\022', '?', '\n', '\010',
'e', 'n', 't', 'a', 'g', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'v', 'o', 'l', 'u', 'm', 'e', '\030', '\024', ' ', '\001',
'(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't',
'3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\036', 'f', 'a', 'i', 'l', 'u', 'r', 'e', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'a', 'g',
-'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'V', 'o', 'l', 'u', 'm', 'e', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'O', 'u', 't', 'l', 'i', 'e',
-'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'H', '\n', '%', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o',
-'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'v',
-'3', 'B', '\025', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'P',
-'\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'V', 'o', 'l', 'u', 'm', 'e', '\022', 'O', '\n', '\021', 'm', 'a', 'x', '_', 'e', 'j', 'e',
+'c', 't', 'i', 'o', 'n', '_', 't', 'i', 'm', 'e', '\030', '\025', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001',
+'\002', '*', '\000', 'R', '\017', 'm', 'a', 'x', 'E', 'j', 'e', 'c', 't', 'i', 'o', 'n', 'T', 'i', 'm', 'e', ':', ',', '\232', '\305', '\210',
+'\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.',
+'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'H', '\n', '%', 'i', 'o', '.', 'e', 'n',
+'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u',
+'s', 't', 'e', 'r', '.', 'v', '3', 'B', '\025', 'O', 'u', 't', 'l', 'i', 'e', 'r', 'D', 'e', 't', 'e', 'c', 't', 'i', 'o', 'n',
+'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[6] = {
deps,
layouts,
"envoy/config/cluster/v3/outlier_detection.proto",
- UPB_STRVIEW_INIT(descriptor, 2342)
+ UPB_STRVIEW_INIT(descriptor, 2423)
};
extern upb_def_init envoy_type_v3_percent_proto_upbdefinit;
extern upb_def_init envoy_type_v3_semantic_version_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
-extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern const upb_msglayout envoy_config_core_v3_Metadata_msginit;
extern const upb_msglayout envoy_config_core_v3_Metadata_FilterMetadataEntry_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeUInt32_msginit;
+extern const upb_msglayout envoy_config_core_v3_RuntimePercent_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeDouble_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeFeatureFlag_msginit;
extern const upb_msglayout envoy_config_core_v3_HeaderValue_msginit;
extern const upb_msglayout envoy_config_core_v3_HeaderValueOption_msginit;
extern const upb_msglayout envoy_config_core_v3_HeaderMap_msginit;
+extern const upb_msglayout envoy_config_core_v3_WatchedDirectory_msginit;
extern const upb_msglayout envoy_config_core_v3_DataSource_msginit;
extern const upb_msglayout envoy_config_core_v3_RetryPolicy_msginit;
extern const upb_msglayout envoy_config_core_v3_RemoteDataSource_msginit;
extern const upb_msglayout envoy_config_core_v3_RuntimeFractionalPercent_msginit;
extern const upb_msglayout envoy_config_core_v3_ControlPlane_msginit;
-static const upb_msglayout *layouts[19] = {
+static const upb_msglayout *layouts[21] = {
&envoy_config_core_v3_Locality_msginit,
&envoy_config_core_v3_BuildVersion_msginit,
&envoy_config_core_v3_Extension_msginit,
&envoy_config_core_v3_Metadata_msginit,
&envoy_config_core_v3_Metadata_FilterMetadataEntry_msginit,
&envoy_config_core_v3_RuntimeUInt32_msginit,
+ &envoy_config_core_v3_RuntimePercent_msginit,
&envoy_config_core_v3_RuntimeDouble_msginit,
&envoy_config_core_v3_RuntimeFeatureFlag_msginit,
&envoy_config_core_v3_HeaderValue_msginit,
&envoy_config_core_v3_HeaderValueOption_msginit,
&envoy_config_core_v3_HeaderMap_msginit,
+ &envoy_config_core_v3_WatchedDirectory_msginit,
&envoy_config_core_v3_DataSource_msginit,
&envoy_config_core_v3_RetryPolicy_msginit,
&envoy_config_core_v3_RemoteDataSource_msginit,
&envoy_config_core_v3_ControlPlane_msginit,
};
-static const char descriptor[4353] = {'\n', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a',
+static const char descriptor[4473] = {'\n', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a',
's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
'r', 'e', '.', 'v', '3', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/',
'v', '3', '/', 'a', 'd', 'd', 'r', 'e', 's', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c',
'e', '/', 'v', '3', '/', 'p', 'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '$', 'e', 'n', 'v', 'o', 'y',
'/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 's', 'e', 'm', 'a', 'n', 't', 'i', 'c', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n',
'.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a',
-'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o',
-'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r',
-'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o',
-'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n',
-'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o',
-'\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'\"', 't', '\n', '\010', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\022', '\026', '\n', '\006', 'r', 'e', 'g', 'i', 'o', 'n', '\030', '\001', ' ',
-'\001', '(', '\t', 'R', '\006', 'r', 'e', 'g', 'i', 'o', 'n', '\022', '\022', '\n', '\004', 'z', 'o', 'n', 'e', '\030', '\002', ' ', '\001', '(', '\t',
-'R', '\004', 'z', 'o', 'n', 'e', '\022', '\031', '\n', '\010', 's', 'u', 'b', '_', 'z', 'o', 'n', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R',
-'\007', 's', 'u', 'b', 'Z', 'o', 'n', 'e', ':', '!', '\232', '\305', '\210', '\036', '\034', '\n', '\032', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\"', '\244', '\001', '\n', '\014', 'B', 'u',
-'i', 'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '8', '\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001',
-'(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'S', 'e', 'm', 'a', 'n', 't',
-'i', 'c', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '3', '\n', '\010', 'm', 'e', 't',
-'a', 'd', 'a', 't', 'a', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', ':', '%', '\232', '\305',
-'\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'B', 'u',
-'i', 'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\"', '\342', '\001', '\n', '\t', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022',
-'\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\032', '\n', '\010', 'c', 'a',
-'t', 'e', 'g', 'o', 'r', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\022', '\'', '\n',
-'\017', 't', 'y', 'p', 'e', '_', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\016', 't',
-'y', 'p', 'e', 'D', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '\022', '<', '\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030',
-'\004', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n',
-'\022', '\032', '\n', '\010', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\010', 'd', 'i', 's', 'a', 'b',
-'l', 'e', 'd', ':', '\"', '\232', '\305', '\210', '\036', '\035', '\n', '\033', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
-'c', 'o', 'r', 'e', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\"', '\345', '\004', '\n', '\004', 'N', 'o', 'd', 'e', '\022', '\016',
-'\n', '\002', 'i', 'd', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\002', 'i', 'd', '\022', '\030', '\n', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r',
-'\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\022', '3', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a',
-'t', 'a', '\030', '\003', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', ':', '\n', '\010', 'l', 'o', 'c',
-'a', 'l', 'i', 't', 'y', '\030', '\004', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'R', '\010', 'l', 'o', 'c', 'a', 'l',
-'i', 't', 'y', '\022', '&', '\n', '\017', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'n', 'a', 'm', 'e', '\030', '\006', ' ',
-'\001', '(', '\t', 'R', '\r', 'u', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', 'N', 'a', 'm', 'e', '\022', '.', '\n', '\022', 'u', 's', 'e',
-'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\007', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\020',
-'u', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', ']', '\n', '\030', 'u', 's', 'e', 'r', '_',
-'a', 'g', 'e', 'n', 't', '_', 'b', 'u', 'i', 'l', 'd', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\013',
-'2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B',
-'u', 'i', 'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'H', '\000', 'R', '\025', 'u', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', 'B',
-'u', 'i', 'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '?', '\n', '\n', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
-'\030', '\t', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
-'e', '.', 'v', '3', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'R', '\n', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n',
-'s', '\022', '\'', '\n', '\017', 'c', 'l', 'i', 'e', 'n', 't', '_', 'f', 'e', 'a', 't', 'u', 'r', 'e', 's', '\030', '\n', ' ', '\003', '(',
-'\t', 'R', '\016', 'c', 'l', 'i', 'e', 'n', 't', 'F', 'e', 'a', 't', 'u', 'r', 'e', 's', '\022', 'R', '\n', '\023', 'l', 'i', 's', 't',
-'e', 'n', 'i', 'n', 'g', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', 'e', 's', '\030', '\013', ' ', '\003', '(', '\013', '2', '\035', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e',
-'s', 's', 'B', '\002', '\030', '\001', 'R', '\022', 'l', 'i', 's', 't', 'e', 'n', 'i', 'n', 'g', 'A', 'd', 'd', 'r', 'e', 's', 's', 'e',
-'s', ':', '\035', '\232', '\305', '\210', '\036', '\030', '\n', '\026', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o',
-'r', 'e', '.', 'N', 'o', 'd', 'e', 'B', '\031', '\n', '\027', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'v', 'e', 'r',
-'s', 'i', 'o', 'n', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\r', 'b', 'u', 'i', 'l', 'd', '_', 'v', 'e',
-'r', 's', 'i', 'o', 'n', '\"', '\346', '\001', '\n', '\010', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '[', '\n', '\017', 'f', 'i', 'l',
-'t', 'e', 'r', '_', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\001', ' ', '\003', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a',
-'.', 'F', 'i', 'l', 't', 'e', 'r', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'E', 'n', 't', 'r', 'y', 'R', '\016', 'f', 'i', 'l',
-'t', 'e', 'r', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\032', 'Z', '\n', '\023', 'F', 'i', 'l', 't', 'e', 'r', 'M', 'e', 't', 'a',
-'d', 'a', 't', 'a', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k',
-'e', 'y', '\022', '-', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':',
-'\002', '8', '\001', ':', '!', '\232', '\305', '\210', '\036', '\034', '\n', '\032', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
-'c', 'o', 'r', 'e', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\"', '\206', '\001', '\n', '\r', 'R', 'u', 'n', 't', 'i', 'm', 'e',
-'U', 'I', 'n', 't', '3', '2', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\002',
-' ', '\001', '(', '\r', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(', '\n', '\013', 'r', 'u', 'n',
-'t', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\003', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n',
-'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.',
-'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'U', 'I', 'n', 't', '3', '2',
-'\"', '\206', '\001', '\n', '\r', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', '\022', '#', '\n', '\r', 'd', 'e', 'f',
-'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\001', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't',
-'V', 'a', 'l', 'u', 'e', '\022', '(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(',
-'\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '&', '\232',
-'\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R',
-'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l', 'e', '\"', '\266', '\001', '\n', '\022', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F',
-'e', 'a', 't', 'u', 'r', 'e', 'F', 'l', 'a', 'g', '\022', 'I', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l',
-'u', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\014', 'd', 'e',
-'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y',
-'\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K',
-'e', 'y', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c',
-'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'e', 'a', 't', 'u', 'r', 'e', 'F', 'l', 'a', 'g', '\"', '\177', '\n',
-'\013', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', '\022', '#', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t',
-'B', '\021', '\372', 'B', '\016', 'r', '\014', '\020', '\001', '(', '\200', '\200', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\003', 'k', 'e', 'y', '\022',
-'%', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\017', '\372', 'B', '\014', 'r', '\n', '(', '\200', '\200', '\001',
-'\300', '\001', '\002', '\310', '\001', '\000', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u',
-'e', '\"', '\270', '\001', '\n', '\021', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', '\022', 'C',
-'\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'B',
-'\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\022', '2', '\n', '\006', 'a', 'p', 'p', 'e',
-'n', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\006', 'a', 'p', 'p', 'e', 'n', 'd', ':', '*', '\232', '\305', '\210', '\036',
-'%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'd',
-'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', '\"', 'l', '\n', '\t', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a',
-'p', '\022', ';', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a',
-'l', 'u', 'e', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', ':', '\"', '\232', '\305', '\210', '\036', '\035', '\n', '\033', 'e', 'n', 'v', 'o',
-'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'p', '\"', '\310',
-'\001', '\n', '\n', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '%', '\n', '\010', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e',
-'\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\010', 'f', 'i', 'l', 'e', 'n', 'a',
-'m', 'e', '\022', ',', '\n', '\014', 'i', 'n', 'l', 'i', 'n', 'e', '_', 'b', 'y', 't', 'e', 's', '\030', '\002', ' ', '\001', '(', '\014', 'B',
-'\007', '\372', 'B', '\004', 'z', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 'i', 'n', 'l', 'i', 'n', 'e', 'B', 'y', 't', 'e', 's', '\022', '.',
-'\n', '\r', 'i', 'n', 'l', 'i', 'n', 'e', '_', 's', 't', 'r', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
-'\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\014', 'i', 'n', 'l', 'i', 'n', 'e', 'S', 't', 'r', 'i', 'n', 'g', ':', '#', '\232', '\305',
-'\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'D', 'a',
-'t', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\020', '\n', '\t', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B',
-'\001', '\"', '\324', '\001', '\n', '\013', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'K', '\n', '\016', 'r', 'e', 't', 'r',
-'y', '_', 'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\001', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'a', 'c', 'k', 'o', 'f', 'f', 'S', 't', 'r',
-'a', 't', 'e', 'g', 'y', 'R', '\014', 'r', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'R', '\n', '\013', 'n', 'u',
-'m', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\023', '\362', '\230', '\376',
-'\217', '\005', '\r', '\n', '\013', 'm', 'a', 'x', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', 'R', '\n', 'n', 'u', 'm', 'R', 'e', 't', 'r',
-'i', 'e', 's', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
-'c', 'o', 'r', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\350', '\001', '\n', '\020', 'R', 'e', 'm', 'o',
-'t', 'e', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', '\022', 'B', '\n', '\010', 'h', 't', 't', 'p', '_', 'u', 'r', 'i', '\030',
-'\001', ' ', '\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'H', 't', 't', 'p', 'U', 'r', 'i', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\007', 'h', 't',
-'t', 'p', 'U', 'r', 'i', '\022', '\037', '\n', '\006', 's', 'h', 'a', '2', '5', '6', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
-'\004', 'r', '\002', '\020', '\001', 'R', '\006', 's', 'h', 'a', '2', '5', '6', '\022', 'D', '\n', '\014', 'r', 'e', 't', 'r', 'y', '_', 'p', 'o',
-'l', 'i', 'c', 'y', '\030', '\003', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'r', 'e', 't',
-'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'e', 'm', 'o', 't', 'e', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c',
-'e', '\"', '\311', '\001', '\n', '\017', 'A', 's', 'y', 'n', 'c', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '8', '\n', '\005',
-'l', 'o', 'c', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\005', 'l',
-'o', 'c', 'a', 'l', '\022', '@', '\n', '\006', 'r', 'e', 'm', 'o', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'e', 'm', 'o', 't', 'e',
-'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\006', 'r', 'e', 'm', 'o', 't', 'e', ':', '(', '\232', '\305', '\210',
-'\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'A', 's', 'y',
-'n', 'c', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\020', '\n', '\t', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r',
-'\022', '\003', '\370', 'B', '\001', '\"', '\260', '\001', '\n', '\017', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't',
-'\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004',
-'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(',
-'\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000',
-'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S',
-'o', 'c', 'k', 'e', 't', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020',
-'\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\277', '\001', '\n', '\030', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c',
-'t', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\022', 'O', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_',
-'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.',
-'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'B', '\010', '\372', 'B', '\005',
-'\212', '\001', '\002', '\020', '\001', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '\037', '\n', '\013', 'r', 'u',
-'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K',
-'e', 'y', ':', '1', '\232', '\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c',
-'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c',
-'e', 'n', 't', '\"', 'U', '\n', '\014', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', '\022', '\036', '\n', '\n', 'i', 'd',
-'e', 'n', 't', 'i', 'f', 'i', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i', 'e',
-'r', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o',
-'r', 'e', '.', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', '*', '(', '\n', '\017', 'R', 'o', 'u', 't', 'i', 'n',
-'g', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', '\013', '\n', '\007', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', '\010', '\n',
-'\004', 'H', 'I', 'G', 'H', '\020', '\001', '*', '\211', '\001', '\n', '\r', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'e', 't', 'h', 'o', 'd',
-'\022', '\026', '\n', '\022', 'M', 'E', 'T', 'H', 'O', 'D', '_', 'U', 'N', 'S', 'P', 'E', 'C', 'I', 'F', 'I', 'E', 'D', '\020', '\000', '\022',
-'\007', '\n', '\003', 'G', 'E', 'T', '\020', '\001', '\022', '\010', '\n', '\004', 'H', 'E', 'A', 'D', '\020', '\002', '\022', '\010', '\n', '\004', 'P', 'O', 'S',
-'T', '\020', '\003', '\022', '\007', '\n', '\003', 'P', 'U', 'T', '\020', '\004', '\022', '\n', '\n', '\006', 'D', 'E', 'L', 'E', 'T', 'E', '\020', '\005', '\022',
-'\013', '\n', '\007', 'C', 'O', 'N', 'N', 'E', 'C', 'T', '\020', '\006', '\022', '\013', '\n', '\007', 'O', 'P', 'T', 'I', 'O', 'N', 'S', '\020', '\007',
-'\022', '\t', '\n', '\005', 'T', 'R', 'A', 'C', 'E', '\020', '\010', '\022', '\t', '\n', '\005', 'P', 'A', 'T', 'C', 'H', '\020', '\t', '*', '>', '\n',
-'\020', 'T', 'r', 'a', 'f', 'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', '\022', '\017', '\n', '\013', 'U', 'N', 'S', 'P',
-'E', 'C', 'I', 'F', 'I', 'E', 'D', '\020', '\000', '\022', '\013', '\n', '\007', 'I', 'N', 'B', 'O', 'U', 'N', 'D', '\020', '\001', '\022', '\014', '\n',
-'\010', 'O', 'U', 'T', 'B', 'O', 'U', 'N', 'D', '\020', '\002', 'B', '9', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r',
-'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B',
-'\t', 'B', 'a', 's', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o',
-'t', 'o', '3',
+'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p',
+'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o',
+'t', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't',
+'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
+'s', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd',
+'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 't', '\n', '\010', 'L', 'o', 'c',
+'a', 'l', 'i', 't', 'y', '\022', '\026', '\n', '\006', 'r', 'e', 'g', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\006', 'r', 'e',
+'g', 'i', 'o', 'n', '\022', '\022', '\n', '\004', 'z', 'o', 'n', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\004', 'z', 'o', 'n', 'e', '\022',
+'\031', '\n', '\010', 's', 'u', 'b', '_', 'z', 'o', 'n', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\007', 's', 'u', 'b', 'Z', 'o', 'n',
+'e', ':', '!', '\232', '\305', '\210', '\036', '\034', '\n', '\032', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o',
+'r', 'e', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\"', '\244', '\001', '\n', '\014', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r', 's',
+'i', 'o', 'n', '\022', '8', '\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n',
+'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'S', 'e', 'm', 'a', 'n', 't', 'i', 'c', 'V', 'e', 'r', 's', 'i',
+'o', 'n', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '3', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\002',
+' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't',
+'r', 'u', 'c', 't', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r', 's',
+'i', 'o', 'n', '\"', '\342', '\001', '\n', '\t', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e',
+'\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\032', '\n', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\030',
+'\002', ' ', '\001', '(', '\t', 'R', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\022', '\'', '\n', '\017', 't', 'y', 'p', 'e', '_', 'd',
+'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\016', 't', 'y', 'p', 'e', 'D', 'e', 's', 'c',
+'r', 'i', 'p', 't', 'o', 'r', '\022', '<', '\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\004', ' ', '\001', '(', '\013', '2', '\"',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'u', 'i',
+'l', 'd', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\032', '\n', '\010', 'd', 'i', 's',
+'a', 'b', 'l', 'e', 'd', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\010', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', ':', '\"', '\232', '\305',
+'\210', '\036', '\035', '\n', '\033', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'E', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', '\"', '\345', '\004', '\n', '\004', 'N', 'o', 'd', 'e', '\022', '\016', '\n', '\002', 'i', 'd', '\030', '\001', ' ',
+'\001', '(', '\t', 'R', '\002', 'i', 'd', '\022', '\030', '\n', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\t', 'R',
+'\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\022', '3', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\003', ' ', '\001', '(',
+'\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c',
+'t', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', ':', '\n', '\010', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\030', '\004',
+' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'R', '\010', 'l', 'o', 'c', 'a', 'l', 'i', 't', 'y', '\022', '&', '\n', '\017',
+'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'n', 'a', 'm', 'e', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\r', 'u', 's',
+'e', 'r', 'A', 'g', 'e', 'n', 't', 'N', 'a', 'm', 'e', '\022', '.', '\n', '\022', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't',
+'_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\007', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\020', 'u', 's', 'e', 'r', 'A', 'g', 'e',
+'n', 't', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', ']', '\n', '\030', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'b',
+'u', 'i', 'l', 'd', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r',
+'s', 'i', 'o', 'n', 'H', '\000', 'R', '\025', 'u', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'V', 'e', 'r',
+'s', 'i', 'o', 'n', '\022', '?', '\n', '\n', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '\030', '\t', ' ', '\003', '(', '\013', '2',
+'\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', 'R', '\n', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '\022', '\'', '\n', '\017', 'c', 'l',
+'i', 'e', 'n', 't', '_', 'f', 'e', 'a', 't', 'u', 'r', 'e', 's', '\030', '\n', ' ', '\003', '(', '\t', 'R', '\016', 'c', 'l', 'i', 'e',
+'n', 't', 'F', 'e', 'a', 't', 'u', 'r', 'e', 's', '\022', 'R', '\n', '\023', 'l', 'i', 's', 't', 'e', 'n', 'i', 'n', 'g', '_', 'a',
+'d', 'd', 'r', 'e', 's', 's', 'e', 's', '\030', '\013', ' ', '\003', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'B', '\002', '\030', '\001', 'R',
+'\022', 'l', 'i', 's', 't', 'e', 'n', 'i', 'n', 'g', 'A', 'd', 'd', 'r', 'e', 's', 's', 'e', 's', ':', '\035', '\232', '\305', '\210', '\036',
+'\030', '\n', '\026', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'N', 'o', 'd', 'e',
+'B', '\031', '\n', '\027', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 't', 'y',
+'p', 'e', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\r', 'b', 'u', 'i', 'l', 'd', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\"', '\346',
+'\001', '\n', '\010', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '[', '\n', '\017', 'f', 'i', 'l', 't', 'e', 'r', '_', 'm', 'e', 't',
+'a', 'd', 'a', 't', 'a', '\030', '\001', ' ', '\003', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'F', 'i', 'l', 't', 'e', 'r',
+'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'E', 'n', 't', 'r', 'y', 'R', '\016', 'f', 'i', 'l', 't', 'e', 'r', 'M', 'e', 't', 'a',
+'d', 'a', 't', 'a', '\032', 'Z', '\n', '\023', 'F', 'i', 'l', 't', 'e', 'r', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'E', 'n', 't',
+'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '-', '\n', '\005', 'v',
+'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '!', '\232', '\305',
+'\210', '\036', '\034', '\n', '\032', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'M', 'e',
+'t', 'a', 'd', 'a', 't', 'a', '\"', '\206', '\001', '\n', '\r', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'U', 'I', 'n', 't', '3', '2', '\022',
+'#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\r', 'R', '\014', 'd',
+'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e',
+'y', '\030', '\003', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e',
+'K', 'e', 'y', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
+'c', 'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'U', 'I', 'n', 't', '3', '2', '\"', 'w', '\n', '\016', 'R', 'u', 'n',
+'t', 'i', 'm', 'e', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\022', ';', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a',
+'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3',
+'.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(', '\n',
+'\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002',
+'\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', '\"', '\206', '\001', '\n', '\r', 'R', 'u', 'n', 't', 'i', 'm',
+'e', 'D', 'o', 'u', 'b', 'l', 'e', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030',
+'\001', ' ', '\001', '(', '\001', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '(', '\n', '\013', 'r', 'u',
+'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
+'\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y',
+'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'D', 'o', 'u', 'b', 'l',
+'e', '\"', '\266', '\001', '\n', '\022', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'e', 'a', 't', 'u', 'r', 'e', 'F', 'l', 'a', 'g', '\022',
+'I', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
+'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022',
+'(', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
+'r', '\002', '\020', '\001', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e',
+'F', 'e', 'a', 't', 'u', 'r', 'e', 'F', 'l', 'a', 'g', '\"', '\177', '\n', '\013', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u',
+'e', '\022', '#', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\021', '\372', 'B', '\016', 'r', '\014', '\020', '\001', '(', '\200',
+'\200', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\003', 'k', 'e', 'y', '\022', '%', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ',
+'\001', '(', '\t', 'B', '\017', '\372', 'B', '\014', 'r', '\n', '(', '\200', '\200', '\001', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\005', 'v', 'a', 'l',
+'u', 'e', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c',
+'o', 'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', '\"', '\270', '\001', '\n', '\021', 'H', 'e', 'a', 'd', 'e',
+'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', '\022', 'C', '\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ',
+'\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\006',
+'h', 'e', 'a', 'd', 'e', 'r', '\022', '2', '\n', '\006', 'a', 'p', 'p', 'e', 'n', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
+'R', '\006', 'a', 'p', 'p', 'e', 'n', 'd', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i',
+'o', 'n', '\"', 'l', '\n', '\t', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'p', '\022', ';', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r',
+'s', '\030', '\001', ' ', '\003', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r',
+'s', ':', '\"', '\232', '\305', '\210', '\036', '\035', '\n', '\033', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o',
+'r', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'p', '\"', '/', '\n', '\020', 'W', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i',
+'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', '\033', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
+'\004', 'r', '\002', '\020', '\001', 'R', '\004', 'p', 'a', 't', 'h', '\"', '\266', '\001', '\n', '\n', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c',
+'e', '\022', '%', '\n', '\010', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
+'\002', '\020', '\001', 'H', '\000', 'R', '\010', 'f', 'i', 'l', 'e', 'n', 'a', 'm', 'e', '\022', '#', '\n', '\014', 'i', 'n', 'l', 'i', 'n', 'e',
+'_', 'b', 'y', 't', 'e', 's', '\030', '\002', ' ', '\001', '(', '\014', 'H', '\000', 'R', '\013', 'i', 'n', 'l', 'i', 'n', 'e', 'B', 'y', 't',
+'e', 's', '\022', '%', '\n', '\r', 'i', 'n', 'l', 'i', 'n', 'e', '_', 's', 't', 'r', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\t',
+'H', '\000', 'R', '\014', 'i', 'n', 'l', 'i', 'n', 'e', 'S', 't', 'r', 'i', 'n', 'g', ':', '#', '\232', '\305', '\210', '\036', '\036', '\n', '\034',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u',
+'r', 'c', 'e', 'B', '\020', '\n', '\t', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '\"', '\324', '\001', '\n',
+'\013', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'K', '\n', '\016', 'r', 'e', 't', 'r', 'y', '_', 'b', 'a', 'c',
+'k', '_', 'o', 'f', 'f', '\030', '\001', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'B', 'a', 'c', 'k', 'o', 'f', 'f', 'S', 't', 'r', 'a', 't', 'e', 'g', 'y',
+'R', '\014', 'r', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'R', '\n', '\013', 'n', 'u', 'm', '_', 'r', 'e', 't',
+'r', 'i', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\023', '\362', '\230', '\376', '\217', '\005', '\r', '\n', '\013',
+'m', 'a', 'x', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', 'R', '\n', 'n', 'u', 'm', 'R', 'e', 't', 'r', 'i', 'e', 's', ':', '$',
+'\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.',
+'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\350', '\001', '\n', '\020', 'R', 'e', 'm', 'o', 't', 'e', 'D', 'a', 't',
+'a', 'S', 'o', 'u', 'r', 'c', 'e', '\022', 'B', '\n', '\010', 'h', 't', 't', 'p', '_', 'u', 'r', 'i', '\030', '\001', ' ', '\001', '(', '\013',
+'2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H',
+'t', 't', 'p', 'U', 'r', 'i', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\007', 'h', 't', 't', 'p', 'U', 'r', 'i',
+'\022', '\037', '\n', '\006', 's', 'h', 'a', '2', '5', '6', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001',
+'R', '\006', 's', 'h', 'a', '2', '5', '6', '\022', 'D', '\n', '\014', 'r', 'e', 't', 'r', 'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030',
+'\003', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l',
+'i', 'c', 'y', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
+'c', 'o', 'r', 'e', '.', 'R', 'e', 'm', 'o', 't', 'e', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', '\"', '\311', '\001', '\n',
+'\017', 'A', 's', 'y', 'n', 'c', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '8', '\n', '\005', 'l', 'o', 'c', 'a', 'l',
+'\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\005', 'l', 'o', 'c', 'a', 'l', '\022',
+'@', '\n', '\006', 'r', 'e', 'm', 'o', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'e', 'm', 'o', 't', 'e', 'D', 'a', 't', 'a', 'S',
+'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\006', 'r', 'e', 'm', 'o', 't', 'e', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e',
+'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'A', 's', 'y', 'n', 'c', 'D', 'a', 't',
+'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\020', '\n', '\t', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001',
+'\"', '\260', '\001', '\n', '\017', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022', '\033', '\n', '\004', 'n',
+'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022',
+'9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g',
+'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p',
+'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't',
+'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o',
+'n', 'f', 'i', 'g', '\"', '\277', '\001', '\n', '\030', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a',
+'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\022', 'O', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e',
+'\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r',
+'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001',
+'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\022', '\037', '\n', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e',
+'_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\n', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', ':', '1', '\232',
+'\305', '\210', '\036', ',', '\n', '*', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R',
+'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\"', 'U',
+'\n', '\014', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', '\022', '\036', '\n', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f',
+'i', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\n', 'i', 'd', 'e', 'n', 't', 'i', 'f', 'i', 'e', 'r', ':', '%', '\232', '\305',
+'\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'C', 'o',
+'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', '*', '(', '\n', '\017', 'R', 'o', 'u', 't', 'i', 'n', 'g', 'P', 'r', 'i', 'o',
+'r', 'i', 't', 'y', '\022', '\013', '\n', '\007', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', '\010', '\n', '\004', 'H', 'I', 'G', 'H',
+'\020', '\001', '*', '\211', '\001', '\n', '\r', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'e', 't', 'h', 'o', 'd', '\022', '\026', '\n', '\022', 'M',
+'E', 'T', 'H', 'O', 'D', '_', 'U', 'N', 'S', 'P', 'E', 'C', 'I', 'F', 'I', 'E', 'D', '\020', '\000', '\022', '\007', '\n', '\003', 'G', 'E',
+'T', '\020', '\001', '\022', '\010', '\n', '\004', 'H', 'E', 'A', 'D', '\020', '\002', '\022', '\010', '\n', '\004', 'P', 'O', 'S', 'T', '\020', '\003', '\022', '\007',
+'\n', '\003', 'P', 'U', 'T', '\020', '\004', '\022', '\n', '\n', '\006', 'D', 'E', 'L', 'E', 'T', 'E', '\020', '\005', '\022', '\013', '\n', '\007', 'C', 'O',
+'N', 'N', 'E', 'C', 'T', '\020', '\006', '\022', '\013', '\n', '\007', 'O', 'P', 'T', 'I', 'O', 'N', 'S', '\020', '\007', '\022', '\t', '\n', '\005', 'T',
+'R', 'A', 'C', 'E', '\020', '\010', '\022', '\t', '\n', '\005', 'P', 'A', 'T', 'C', 'H', '\020', '\t', '*', '>', '\n', '\020', 'T', 'r', 'a', 'f',
+'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', '\022', '\017', '\n', '\013', 'U', 'N', 'S', 'P', 'E', 'C', 'I', 'F', 'I',
+'E', 'D', '\020', '\000', '\022', '\013', '\n', '\007', 'I', 'N', 'B', 'O', 'U', 'N', 'D', '\020', '\001', '\022', '\014', '\n', '\010', 'O', 'U', 'T', 'B',
+'O', 'U', 'N', 'D', '\020', '\002', 'B', '9', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\t', 'B', 'a', 's', 'e',
+'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[14] = {
+static upb_def_init *deps[13] = {
&envoy_config_core_v3_address_proto_upbdefinit,
&envoy_config_core_v3_backoff_proto_upbdefinit,
&envoy_config_core_v3_http_uri_proto_upbdefinit,
&envoy_type_v3_percent_proto_upbdefinit,
&envoy_type_v3_semantic_version_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
- &google_protobuf_duration_proto_upbdefinit,
&google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&udpa_annotations_migrate_proto_upbdefinit,
deps,
layouts,
"envoy/config/core/v3/base.proto",
- UPB_STRVIEW_INIT(descriptor, 4353)
+ UPB_STRVIEW_INIT(descriptor, 4473)
};
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.RuntimeUInt32");
}
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_RuntimePercent_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_base_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.RuntimePercent");
+}
+
UPB_INLINE const upb_msgdef *envoy_config_core_v3_RuntimeDouble_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_core_v3_base_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.RuntimeDouble");
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.HeaderMap");
}
+UPB_INLINE const upb_msgdef *envoy_config_core_v3_WatchedDirectory_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_core_v3_base_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.core.v3.WatchedDirectory");
+}
+
UPB_INLINE const upb_msgdef *envoy_config_core_v3_DataSource_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_core_v3_base_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.config.core.v3.DataSource");
extern upb_def_init envoy_config_core_v3_grpc_service_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_authority_proto_upbdefinit;
+extern upb_def_init xds_core_v3_authority_proto_upbdefinit;
extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
&envoy_config_core_v3_ConfigSource_msginit,
};
-static const char descriptor[2232] = {'\n', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o',
+static const char descriptor[2238] = {'\n', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o',
'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.',
'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n',
'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'g', 'r', 'p', 'c', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.',
'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u',
'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'u', 'd', 'p', 'a',
-'/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032',
-'#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c',
-'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
-'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o',
-'t', 'o', '\"', '\233', '\006', '\n', '\017', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', 'R', '\n',
-'\010', 'a', 'p', 'i', '_', 't', 'y', 'p', 'e', '\030', '\001', ' ', '\001', '(', '\016', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o',
-'u', 'r', 'c', 'e', '.', 'A', 'p', 'i', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\007', 'a',
-'p', 'i', 'T', 'y', 'p', 'e', '\022', '^', '\n', '\025', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 'a', 'p', 'i', '_', 'v',
-'e', 'r', 's', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\016', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'B', '\010', '\372', 'B',
-'\005', '\202', '\001', '\002', '\020', '\001', 'R', '\023', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i',
-'o', 'n', '\022', '#', '\n', '\r', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'n', 'a', 'm', 'e', 's', '\030', '\002', ' ', '\003', '(', '\t',
-'R', '\014', 'c', 'l', 'u', 's', 't', 'e', 'r', 'N', 'a', 'm', 'e', 's', '\022', 'F', '\n', '\r', 'g', 'r', 'p', 'c', '_', 's', 'e',
-'r', 'v', 'i', 'c', 'e', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'G', 'r', 'p', 'c', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 'R', '\014', 'g',
-'r', 'p', 'c', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 's', '\022', '>', '\n', '\r', 'r', 'e', 'f', 'r', 'e', 's', 'h', '_', 'd', 'e',
-'l', 'a', 'y', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\014', 'r', 'e', 'f', 'r', 'e', 's', 'h', 'D', 'e', 'l', 'a', 'y',
-'\022', 'L', '\n', '\017', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\005', ' ', '\001', '(', '\013',
-'2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i',
-'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'T', 'i', 'm', 'e',
-'o', 'u', 't', '\022', 'W', '\n', '\023', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i', 't', '_', 's', 'e', 't', 't', 'i', 'n', 'g',
-'s', '\030', '\006', ' ', '\001', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'R', '\021',
-'r', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', '\022', 'A', '\n', '\036', 's', 'e', 't', '_',
-'n', 'o', 'd', 'e', '_', 'o', 'n', '_', 'f', 'i', 'r', 's', 't', '_', 'm', 'e', 's', 's', 'a', 'g', 'e', '_', 'o', 'n', 'l',
-'y', '\030', '\007', ' ', '\001', '(', '\010', 'R', '\031', 's', 'e', 't', 'N', 'o', 'd', 'e', 'O', 'n', 'F', 'i', 'r', 's', 't', 'M', 'e',
-'s', 's', 'a', 'g', 'e', 'O', 'n', 'l', 'y', '\"', '\222', '\001', '\n', '\007', 'A', 'p', 'i', 'T', 'y', 'p', 'e', '\022', '3', '\n', '%',
-'D', 'E', 'P', 'R', 'E', 'C', 'A', 'T', 'E', 'D', '_', 'A', 'N', 'D', '_', 'U', 'N', 'A', 'V', 'A', 'I', 'L', 'A', 'B', 'L',
-'E', '_', 'D', 'O', '_', 'N', 'O', 'T', '_', 'U', 'S', 'E', '\020', '\000', '\032', '\010', '\010', '\001', '\250', '\367', '\264', '\213', '\002', '\001', '\022',
-'\010', '\n', '\004', 'R', 'E', 'S', 'T', '\020', '\001', '\022', '\010', '\n', '\004', 'G', 'R', 'P', 'C', '\020', '\002', '\022', '\016', '\n', '\n', 'D', 'E',
-'L', 'T', 'A', '_', 'G', 'R', 'P', 'C', '\020', '\003', '\022', '\023', '\n', '\017', 'A', 'G', 'G', 'R', 'E', 'G', 'A', 'T', 'E', 'D', '_',
-'G', 'R', 'P', 'C', '\020', '\005', '\022', '\031', '\n', '\025', 'A', 'G', 'G', 'R', 'E', 'G', 'A', 'T', 'E', 'D', '_', 'D', 'E', 'L', 'T',
-'A', '_', 'G', 'R', 'P', 'C', '\020', '\006', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e',
-'\"', 'I', '\n', '\026', 'A', 'g', 'g', 'r', 'e', 'g', 'a', 't', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c',
-'e', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o',
-'r', 'e', '.', 'A', 'g', 'g', 'r', 'e', 'g', 'a', 't', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e',
-'\"', '\235', '\001', '\n', '\020', 'S', 'e', 'l', 'f', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '^', '\n', '\025',
-'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 'a', 'p', 'i', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001',
-'(', '\016', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
-'.', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\023', 't', 'r',
-'a', 'n', 's', 'p', 'o', 'r', 't', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', ':', ')', '\232', '\305', '\210', '\036', '$', '\n',
-'\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'S', 'e', 'l', 'f', 'C', 'o',
-'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\"', '\307', '\001', '\n', '\021', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'S',
-'e', 't', 't', 'i', 'n', 'g', 's', '\022', ';', '\n', '\n', 'm', 'a', 'x', '_', 't', 'o', 'k', 'e', 'n', 's', '\030', '\001', ' ', '\001',
-'(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't',
-'3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'm', 'a', 'x', 'T', 'o', 'k', 'e', 'n', 's', '\022', 'I', '\n', '\t', 'f', 'i', 'l',
-'l', '_', 'r', 'a', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\016', '\372', 'B', '\013', '\022', '\t', '!',
-'\000', '\000', '\000', '\000', '\000', '\000', '\000', '\000', 'R', '\010', 'f', 'i', 'l', 'l', 'R', 'a', 't', 'e', ':', '*', '\232', '\305', '\210', '\036', '%',
-'\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'a', 't', 'e', 'L',
-'i', 'm', 'i', 't', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', '\"', '\250', '\004', '\n', '\014', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o',
-'u', 'r', 'c', 'e', '\022', '9', '\n', '\013', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'i', 'e', 's', '\030', '\007', ' ', '\003', '(', '\013',
-'2', '\027', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'A', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y',
-'R', '\013', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'i', 'e', 's', '\022', '\024', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\001', ' ', '\001',
-'(', '\t', 'H', '\000', 'R', '\004', 'p', 'a', 't', 'h', '\022', 'S', '\n', '\021', 'a', 'p', 'i', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_',
-'s', 'o', 'u', 'r', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c',
-'e', 'H', '\000', 'R', '\017', 'a', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '@', '\n', '\003', 'a',
-'d', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
-'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'g', 'g', 'r', 'e', 'g', 'a', 't', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o',
-'u', 'r', 'c', 'e', 'H', '\000', 'R', '\003', 'a', 'd', 's', '\022', '<', '\n', '\004', 's', 'e', 'l', 'f', '\030', '\005', ' ', '\001', '(', '\013',
-'2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'S',
-'e', 'l', 'f', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\004', 's', 'e', 'l', 'f', '\022', 'M',
-'\n', '\025', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'f', 'e', 't', 'c', 'h', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\004',
-' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
-'r', 'a', 't', 'i', 'o', 'n', 'R', '\023', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'F', 'e', 't', 'c', 'h', 'T', 'i', 'm', 'e', 'o',
-'u', 't', '\022', '\\', '\n', '\024', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'a', 'p', 'i', '_', 'v', 'e', 'r', 's', 'i', 'o',
-'n', '\030', '\006', ' ', '\001', '(', '\016', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020',
-'\001', 'R', '\022', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', ':', '%', '\232', '\305',
-'\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'C', 'o',
-'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\036', '\n', '\027', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r',
-'c', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '*', '&', '\n', '\n', 'A', 'p', 'i', 'V',
-'e', 'r', 's', 'i', 'o', 'n', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\022', '\006', '\n', '\002', 'V', '2', '\020', '\001', '\022',
-'\006', '\n', '\002', 'V', '3', '\020', '\002', 'B', 'A', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\021', 'C', 'o', 'n',
-'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b',
-'\006', 'p', 'r', 'o', 't', 'o', '3',
+'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\033', 'x', 'd', 's', '/',
+'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '#',
+'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a',
+'t', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i',
+'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't',
+'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't',
+'o', '\"', '\233', '\006', '\n', '\017', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', 'R', '\n', '\010',
+'a', 'p', 'i', '_', 't', 'y', 'p', 'e', '\030', '\001', ' ', '\001', '(', '\016', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u',
+'r', 'c', 'e', '.', 'A', 'p', 'i', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\007', 'a', 'p',
+'i', 'T', 'y', 'p', 'e', '\022', '^', '\n', '\025', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 'a', 'p', 'i', '_', 'v', 'e',
+'r', 's', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\016', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005',
+'\202', '\001', '\002', '\020', '\001', 'R', '\023', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o',
+'n', '\022', '#', '\n', '\r', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'n', 'a', 'm', 'e', 's', '\030', '\002', ' ', '\003', '(', '\t', 'R',
+'\014', 'c', 'l', 'u', 's', 't', 'e', 'r', 'N', 'a', 'm', 'e', 's', '\022', 'F', '\n', '\r', 'g', 'r', 'p', 'c', '_', 's', 'e', 'r',
+'v', 'i', 'c', 'e', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'G', 'r', 'p', 'c', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 'R', '\014', 'g', 'r',
+'p', 'c', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 's', '\022', '>', '\n', '\r', 'r', 'e', 'f', 'r', 'e', 's', 'h', '_', 'd', 'e', 'l',
+'a', 'y', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\014', 'r', 'e', 'f', 'r', 'e', 's', 'h', 'D', 'e', 'l', 'a', 'y', '\022',
+'L', '\n', '\017', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\005', ' ', '\001', '(', '\013', '2',
+'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
+'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'T', 'i', 'm', 'e', 'o',
+'u', 't', '\022', 'W', '\n', '\023', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i', 't', '_', 's', 'e', 't', 't', 'i', 'n', 'g', 's',
+'\030', '\006', ' ', '\001', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', 'R', '\021', 'r',
+'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', '\022', 'A', '\n', '\036', 's', 'e', 't', '_', 'n',
+'o', 'd', 'e', '_', 'o', 'n', '_', 'f', 'i', 'r', 's', 't', '_', 'm', 'e', 's', 's', 'a', 'g', 'e', '_', 'o', 'n', 'l', 'y',
+'\030', '\007', ' ', '\001', '(', '\010', 'R', '\031', 's', 'e', 't', 'N', 'o', 'd', 'e', 'O', 'n', 'F', 'i', 'r', 's', 't', 'M', 'e', 's',
+'s', 'a', 'g', 'e', 'O', 'n', 'l', 'y', '\"', '\222', '\001', '\n', '\007', 'A', 'p', 'i', 'T', 'y', 'p', 'e', '\022', '3', '\n', '%', 'D',
+'E', 'P', 'R', 'E', 'C', 'A', 'T', 'E', 'D', '_', 'A', 'N', 'D', '_', 'U', 'N', 'A', 'V', 'A', 'I', 'L', 'A', 'B', 'L', 'E',
+'_', 'D', 'O', '_', 'N', 'O', 'T', '_', 'U', 'S', 'E', '\020', '\000', '\032', '\010', '\010', '\001', '\250', '\367', '\264', '\213', '\002', '\001', '\022', '\010',
+'\n', '\004', 'R', 'E', 'S', 'T', '\020', '\001', '\022', '\010', '\n', '\004', 'G', 'R', 'P', 'C', '\020', '\002', '\022', '\016', '\n', '\n', 'D', 'E', 'L',
+'T', 'A', '_', 'G', 'R', 'P', 'C', '\020', '\003', '\022', '\023', '\n', '\017', 'A', 'G', 'G', 'R', 'E', 'G', 'A', 'T', 'E', 'D', '_', 'G',
+'R', 'P', 'C', '\020', '\005', '\022', '\031', '\n', '\025', 'A', 'G', 'G', 'R', 'E', 'G', 'A', 'T', 'E', 'D', '_', 'D', 'E', 'L', 'T', 'A',
+'_', 'G', 'R', 'P', 'C', '\020', '\006', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\"',
+'I', '\n', '\026', 'A', 'g', 'g', 'r', 'e', 'g', 'a', 't', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e',
+':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r',
+'e', '.', 'A', 'g', 'g', 'r', 'e', 'g', 'a', 't', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\"',
+'\235', '\001', '\n', '\020', 'S', 'e', 'l', 'f', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '^', '\n', '\025', 't',
+'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 'a', 'p', 'i', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(',
+'\016', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
+'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\023', 't', 'r', 'a',
+'n', 's', 'p', 'o', 'r', 't', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'S', 'e', 'l', 'f', 'C', 'o', 'n',
+'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\"', '\307', '\001', '\n', '\021', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'S', 'e',
+'t', 't', 'i', 'n', 'g', 's', '\022', ';', '\n', '\n', 'm', 'a', 'x', '_', 't', 'o', 'k', 'e', 'n', 's', '\030', '\001', ' ', '\001', '(',
+'\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3',
+'2', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'm', 'a', 'x', 'T', 'o', 'k', 'e', 'n', 's', '\022', 'I', '\n', '\t', 'f', 'i', 'l', 'l',
+'_', 'r', 'a', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'D', 'o', 'u', 'b', 'l', 'e', 'V', 'a', 'l', 'u', 'e', 'B', '\016', '\372', 'B', '\013', '\022', '\t', '!', '\000',
+'\000', '\000', '\000', '\000', '\000', '\000', '\000', 'R', '\010', 'f', 'i', 'l', 'l', 'R', 'a', 't', 'e', ':', '*', '\232', '\305', '\210', '\036', '%', '\n',
+'#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i',
+'m', 'i', 't', 'S', 'e', 't', 't', 'i', 'n', 'g', 's', '\"', '\247', '\004', '\n', '\014', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u',
+'r', 'c', 'e', '\022', '8', '\n', '\013', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'i', 'e', 's', '\030', '\007', ' ', '\003', '(', '\013', '2',
+'\026', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', 'R', '\013',
+'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'i', 'e', 's', '\022', '\024', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\001', ' ', '\001', '(', '\t',
+'H', '\000', 'R', '\004', 'p', 'a', 't', 'h', '\022', 'S', '\n', '\021', 'a', 'p', 'i', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o',
+'u', 'r', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'H',
+'\000', 'R', '\017', 'a', 'p', 'i', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '@', '\n', '\003', 'a', 'd', 's',
+'\030', '\003', ' ', '\001', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
+'e', '.', 'v', '3', '.', 'A', 'g', 'g', 'r', 'e', 'g', 'a', 't', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r',
+'c', 'e', 'H', '\000', 'R', '\003', 'a', 'd', 's', '\022', '<', '\n', '\004', 's', 'e', 'l', 'f', '\030', '\005', ' ', '\001', '(', '\013', '2', '&',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'S', 'e', 'l',
+'f', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\004', 's', 'e', 'l', 'f', '\022', 'M', '\n', '\025',
+'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'f', 'e', 't', 'c', 'h', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\004', ' ', '\001',
+'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a',
+'t', 'i', 'o', 'n', 'R', '\023', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'F', 'e', 't', 'c', 'h', 'T', 'i', 'm', 'e', 'o', 'u', 't',
+'\022', '\\', '\n', '\024', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'a', 'p', 'i', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030',
+'\006', ' ', '\001', '(', '\016', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R',
+'\022', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'A', 'p', 'i', 'V', 'e', 'r', 's', 'i', 'o', 'n', ':', '%', '\232', '\305', '\210', '\036',
+' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'C', 'o', 'n', 'f',
+'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\036', '\n', '\027', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e',
+'_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '*', '.', '\n', '\n', 'A', 'p', 'i', 'V', 'e', 'r',
+'s', 'i', 'o', 'n', '\022', '\014', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\032', '\002', '\010', '\001', '\022', '\n', '\n', '\002', 'V', '2', '\020',
+'\001', '\032', '\002', '\010', '\001', '\022', '\006', '\n', '\002', 'V', '3', '\020', '\002', 'B', 'A', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y',
+'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', 'B', '\021', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310',
+'\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[9] = {
&envoy_config_core_v3_grpc_service_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
- &udpa_core_v1_authority_proto_upbdefinit,
+ &xds_core_v3_authority_proto_upbdefinit,
&envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
deps,
layouts,
"envoy/config/core/v3/config_source.proto",
- UPB_STRVIEW_INIT(descriptor, 2232)
+ UPB_STRVIEW_INIT(descriptor, 2238)
};
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
-extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern upb_def_init validate_validate_proto_upbdefinit;
&envoy_config_core_v3_HealthCheck_TlsOptions_msginit,
};
-static const char descriptor[4084] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'h', 'e',
+static const char descriptor[4147] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'h', 'e',
'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'c',
'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f',
'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '/', 'e', 'n',
'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l',
'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036',
'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.',
-'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/',
-'d', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!',
-'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i',
-'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a',
-'t', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\342', '\032', '\n', '\013', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022',
-'?', '\n', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\n', '\372', 'B', '\007', '\252', '\001',
-'\004', '\010', '\001', '*', '\000', 'R', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'A', '\n', '\010', 'i', 'n', 't', 'e', 'r', 'v', 'a',
-'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\n', '\372', 'B', '\007', '\252', '\001', '\004', '\010', '\001', '*', '\000', 'R', '\010', 'i', 'n',
-'t', 'e', 'r', 'v', 'a', 'l', '\022', '@', '\n', '\016', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'j', 'i', 't', 't', 'e', 'r', '\030',
-'\024', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D',
-'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\r', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'J', 'i', 't', 't', 'e', 'r', '\022', 'B', '\n',
-'\017', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '_', 'j', 'i', 't', 't', 'e', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R',
-'\016', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', 'J', 'i', 't', 't', 'e', 'r', '\022', '6', '\n', '\027', 'i', 'n', 't', 'e', 'r', 'v',
-'a', 'l', '_', 'j', 'i', 't', 't', 'e', 'r', '_', 'p', 'e', 'r', 'c', 'e', 'n', 't', '\030', '\022', ' ', '\001', '(', '\r', 'R', '\025',
-'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', 'J', 'i', 't', 't', 'e', 'r', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\022', 'W', '\n', '\023',
-'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 't', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030', '\004', ' ', '\001', '(', '\013',
+'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's',
+'t', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
+'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a',
+'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\306', '\033', '\n',
+'\013', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '?', '\n', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001',
+' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
+'r', 'a', 't', 'i', 'o', 'n', 'B', '\n', '\372', 'B', '\007', '\252', '\001', '\004', '\010', '\001', '*', '\000', 'R', '\007', 't', 'i', 'm', 'e', 'o',
+'u', 't', '\022', 'A', '\n', '\010', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\n', '\372',
+'B', '\007', '\252', '\001', '\004', '\010', '\001', '*', '\000', 'R', '\010', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', '@', '\n', '\016', 'i', 'n',
+'i', 't', 'i', 'a', 'l', '_', 'j', 'i', 't', 't', 'e', 'r', '\030', '\024', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\r', 'i', 'n', 'i',
+'t', 'i', 'a', 'l', 'J', 'i', 't', 't', 'e', 'r', '\022', 'B', '\n', '\017', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '_', 'j', 'i',
+'t', 't', 'e', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\016', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', 'J', 'i', 't',
+'t', 'e', 'r', '\022', '6', '\n', '\027', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '_', 'j', 'i', 't', 't', 'e', 'r', '_', 'p', 'e',
+'r', 'c', 'e', 'n', 't', '\030', '\022', ' ', '\001', '(', '\r', 'R', '\025', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', 'J', 'i', 't', 't',
+'e', 'r', 'P', 'e', 'r', 'c', 'e', 'n', 't', '\022', 'W', '\n', '\023', 'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 't', 'h',
+'r', 'e', 's', 'h', 'o', 'l', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001',
+'\002', '\020', '\001', 'R', '\022', 'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y', 'T', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\022', 'S',
+'\n', '\021', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 't', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\030', '\005', ' ', '\001', '(', '\013',
'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2',
-'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\022', 'u', 'n', 'h', 'e', 'a', 'l', 't', 'h',
-'y', 'T', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\022', 'S', '\n', '\021', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 't', 'h', 'r',
-'e', 's', 'h', 'o', 'l', 'd', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002',
-'\020', '\001', 'R', '\020', 'h', 'e', 'a', 'l', 't', 'h', 'y', 'T', 'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\022', '7', '\n', '\010', 'a',
-'l', 't', '_', 'p', 'o', 'r', 't', '\030', '\006', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'a', 'l', 't', 'P', 'o',
-'r', 't', '\022', 'E', '\n', '\020', 'r', 'e', 'u', 's', 'e', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\007', ' ',
-'\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o',
-'l', 'V', 'a', 'l', 'u', 'e', 'R', '\017', 'r', 'e', 'u', 's', 'e', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\022', '_',
-'\n', '\021', 'h', 't', 't', 'p', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', '\030', '\010', ' ', '\001', '(', '\013',
-'2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H',
-'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'H', 't', 't', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c',
-'k', 'H', '\000', 'R', '\017', 'h', 't', 't', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '\\', '\n', '\020', 't',
-'c', 'p', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', '\030', '\t', ' ', '\001', '(', '\013', '2', '0', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't',
-'h', 'C', 'h', 'e', 'c', 'k', '.', 'T', 'c', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'H', '\000', 'R', '\016',
-'t', 'c', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '_', '\n', '\021', 'g', 'r', 'p', 'c', '_', 'h', 'e',
-'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', '\030', '\013', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'V', 'a', 'l', 'u', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\020', 'h', 'e', 'a', 'l', 't', 'h', 'y', 'T',
+'h', 'r', 'e', 's', 'h', 'o', 'l', 'd', '\022', '7', '\n', '\010', 'a', 'l', 't', '_', 'p', 'o', 'r', 't', '\030', '\006', ' ', '\001', '(',
+'\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3',
+'2', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'a', 'l', 't', 'P', 'o', 'r', 't', '\022', 'E', '\n', '\020', 'r', 'e', 'u', 's', 'e', '_',
+'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\017', 'r', 'e', 'u', 's',
+'e', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '\022', '_', '\n', '\021', 'h', 't', 't', 'p', '_', 'h', 'e', 'a', 'l', 't',
+'h', '_', 'c', 'h', 'e', 'c', 'k', '\030', '\010', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'H',
+'t', 't', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'H', '\000', 'R', '\017', 'h', 't', 't', 'p', 'H', 'e', 'a',
+'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '\\', '\n', '\020', 't', 'c', 'p', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h',
+'e', 'c', 'k', '\030', '\t', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'T', 'c', 'p', 'H', 'e',
+'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'H', '\000', 'R', '\016', 't', 'c', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e',
+'c', 'k', '\022', '_', '\n', '\021', 'g', 'r', 'p', 'c', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', '\030', '\013',
+' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'G', 'r', 'p', 'c', 'H', 'e', 'a', 'l', 't', 'h',
+'C', 'h', 'e', 'c', 'k', 'H', '\000', 'R', '\017', 'g', 'r', 'p', 'c', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022',
+'e', '\n', '\023', 'c', 'u', 's', 't', 'o', 'm', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', '\030', '\r', ' ',
+'\001', '(', '\013', '2', '3', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'C', 'u', 's', 't', 'o', 'm', 'H', 'e', 'a', 'l', 't',
+'h', 'C', 'h', 'e', 'c', 'k', 'H', '\000', 'R', '\021', 'c', 'u', 's', 't', 'o', 'm', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e',
+'c', 'k', '\022', 'S', '\n', '\023', 'n', 'o', '_', 't', 'r', 'a', 'f', 'f', 'i', 'c', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l',
+'\030', '\014', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\021', 'n', 'o', 'T', 'r', 'a',
+'f', 'f', 'i', 'c', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'b', '\n', '\033', 'n', 'o', '_', 't', 'r', 'a', 'f', 'f', 'i',
+'c', '_', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\030', ' ', '\001', '(', '\013', '2',
+'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
+'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\030', 'n', 'o', 'T', 'r', 'a', 'f', 'f', 'i', 'c', 'H', 'e', 'a',
+'l', 't', 'h', 'y', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'R', '\n', '\022', 'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y',
+'_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\016', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002',
+'*', '\000', 'R', '\021', 'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', '[', '\n', '\027',
+'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'e', 'd', 'g', 'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\017',
+' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
+'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\025', 'u', 'n', 'h', 'e', 'a', 'l', 't',
+'h', 'y', 'E', 'd', 'g', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'W', '\n', '\025', 'h', 'e', 'a', 'l', 't', 'h', 'y',
+'_', 'e', 'd', 'g', 'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\020', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372',
+'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\023', 'h', 'e', 'a', 'l', 't', 'h', 'y', 'E', 'd', 'g', 'e', 'I', 'n', 't', 'e', 'r',
+'v', 'a', 'l', '\022', '$', '\n', '\016', 'e', 'v', 'e', 'n', 't', '_', 'l', 'o', 'g', '_', 'p', 'a', 't', 'h', '\030', '\021', ' ', '\001',
+'(', '\t', 'R', '\014', 'e', 'v', 'e', 'n', 't', 'L', 'o', 'g', 'P', 'a', 't', 'h', '\022', 'M', '\n', '\r', 'e', 'v', 'e', 'n', 't',
+'_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\030', '\026', ' ', '\001', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E', 'v', 'e', 'n', 't', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
+'C', 'o', 'n', 'f', 'i', 'g', 'R', '\014', 'e', 'v', 'e', 'n', 't', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', 'F', '\n', ' ', 'a',
+'l', 'w', 'a', 'y', 's', '_', 'l', 'o', 'g', '_', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', '_', 'f', 'a',
+'i', 'l', 'u', 'r', 'e', 's', '\030', '\023', ' ', '\001', '(', '\010', 'R', '\034', 'a', 'l', 'w', 'a', 'y', 's', 'L', 'o', 'g', 'H', 'e',
+'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'F', 'a', 'i', 'l', 'u', 'r', 'e', 's', '\022', 'M', '\n', '\013', 't', 'l', 's', '_',
+'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\025', ' ', '\001', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'T',
+'l', 's', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\n', 't', 'l', 's', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '^', '\n', '\037',
+'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'm', 'a', 't', 'c', 'h', '_', 'c', 'r',
+'i', 't', 'e', 'r', 'i', 'a', '\030', '\027', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R', '\034', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o',
+'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', 'C', 'r', 'i', 't', 'e', 'r', 'i', 'a', '\032', '\200', '\001', '\n', '\007', 'P', 'a', 'y',
+'l', 'o', 'a', 'd', '\022', '\035', '\n', '\004', 't', 'e', 'x', 't', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002',
+'\020', '\001', 'H', '\000', 'R', '\004', 't', 'e', 'x', 't', '\022', '\030', '\n', '\006', 'b', 'i', 'n', 'a', 'r', 'y', '\030', '\002', ' ', '\001', '(',
+'\014', 'H', '\000', 'R', '\006', 'b', 'i', 'n', 'a', 'r', 'y', ':', ',', '\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y',
+'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.',
+'P', 'a', 'y', 'l', 'o', 'a', 'd', 'B', '\016', '\n', '\007', 'p', 'a', 'y', 'l', 'o', 'a', 'd', '\022', '\003', '\370', 'B', '\001', '\032', '\340',
+'\005', '\n', '\017', 'H', 't', 't', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '\037', '\n', '\004', 'h', 'o', 's',
+'t', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\004', 'h', 'o', 's',
+'t', '\022', '!', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300',
+'\001', '\002', '\310', '\001', '\000', 'R', '\004', 'p', 'a', 't', 'h', '\022', '=', '\n', '\004', 's', 'e', 'n', 'd', '\030', '\003', ' ', '\001', '(', '\013',
+'2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H',
+'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'P', 'a', 'y', 'l', 'o', 'a', 'd', 'R', '\004', 's', 'e', 'n', 'd', '\022',
+'C', '\n', '\007', 'r', 'e', 'c', 'e', 'i', 'v', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.',
'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c',
-'k', '.', 'G', 'r', 'p', 'c', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'H', '\000', 'R', '\017', 'g', 'r', 'p', 'c',
-'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', 'e', '\n', '\023', 'c', 'u', 's', 't', 'o', 'm', '_', 'h', 'e', 'a',
-'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', '\030', '\r', ' ', '\001', '(', '\013', '2', '3', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k',
-'.', 'C', 'u', 's', 't', 'o', 'm', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'H', '\000', 'R', '\021', 'c', 'u', 's',
-'t', 'o', 'm', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', 'S', '\n', '\023', 'n', 'o', '_', 't', 'r', 'a', 'f',
-'f', 'i', 'c', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\014', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005',
-'\252', '\001', '\002', '*', '\000', 'R', '\021', 'n', 'o', 'T', 'r', 'a', 'f', 'f', 'i', 'c', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022',
-'R', '\n', '\022', 'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\016', ' ', '\001',
-'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a',
-'t', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\021', 'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y',
-'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', '[', '\n', '\027', 'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'e', 'd', 'g',
-'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\017', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001',
-'\002', '*', '\000', 'R', '\025', 'u', 'n', 'h', 'e', 'a', 'l', 't', 'h', 'y', 'E', 'd', 'g', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a',
-'l', '\022', 'W', '\n', '\025', 'h', 'e', 'a', 'l', 't', 'h', 'y', '_', 'e', 'd', 'g', 'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a',
-'l', '\030', '\020', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\023', 'h', 'e', 'a', 'l',
-'t', 'h', 'y', 'E', 'd', 'g', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', '$', '\n', '\016', 'e', 'v', 'e', 'n', 't', '_',
-'l', 'o', 'g', '_', 'p', 'a', 't', 'h', '\030', '\021', ' ', '\001', '(', '\t', 'R', '\014', 'e', 'v', 'e', 'n', 't', 'L', 'o', 'g', 'P',
-'a', 't', 'h', '\022', 'M', '\n', '\r', 'e', 'v', 'e', 'n', 't', '_', 's', 'e', 'r', 'v', 'i', 'c', 'e', '\030', '\026', ' ', '\001', '(',
-'\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
-'E', 'v', 'e', 'n', 't', 'S', 'e', 'r', 'v', 'i', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\014', 'e', 'v', 'e', 'n', 't',
-'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', 'F', '\n', ' ', 'a', 'l', 'w', 'a', 'y', 's', '_', 'l', 'o', 'g', '_', 'h', 'e', 'a',
-'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', '_', 'f', 'a', 'i', 'l', 'u', 'r', 'e', 's', '\030', '\023', ' ', '\001', '(', '\010', 'R',
-'\034', 'a', 'l', 'w', 'a', 'y', 's', 'L', 'o', 'g', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'F', 'a', 'i', 'l',
-'u', 'r', 'e', 's', '\022', 'M', '\n', '\013', 't', 'l', 's', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\025', ' ', '\001', '(', '\013',
-'2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H',
-'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'T', 'l', 's', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\n', 't', 'l',
-'s', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '^', '\n', '\037', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c',
-'k', 'e', 't', '_', 'm', 'a', 't', 'c', 'h', '_', 'c', 'r', 'i', 't', 'e', 'r', 'i', 'a', '\030', '\027', ' ', '\001', '(', '\013', '2',
-'\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'R',
-'\034', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'M', 'a', 't', 'c', 'h', 'C', 'r', 'i', 't',
-'e', 'r', 'i', 'a', '\032', '\200', '\001', '\n', '\007', 'P', 'a', 'y', 'l', 'o', 'a', 'd', '\022', '\035', '\n', '\004', 't', 'e', 'x', 't', '\030',
-'\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\004', 't', 'e', 'x', 't', '\022', '\030', '\n',
-'\006', 'b', 'i', 'n', 'a', 'r', 'y', '\030', '\002', ' ', '\001', '(', '\014', 'H', '\000', 'R', '\006', 'b', 'i', 'n', 'a', 'r', 'y', ':', ',',
-'\232', '\305', '\210', '\036', '\'', '\n', '%', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.',
-'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'P', 'a', 'y', 'l', 'o', 'a', 'd', 'B', '\016', '\n', '\007', 'p', 'a',
-'y', 'l', 'o', 'a', 'd', '\022', '\003', '\370', 'B', '\001', '\032', '\340', '\005', '\n', '\017', 'H', 't', 't', 'p', 'H', 'e', 'a', 'l', 't', 'h',
-'C', 'h', 'e', 'c', 'k', '\022', '\037', '\n', '\004', 'h', 'o', 's', 't', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r',
-'\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\004', 'h', 'o', 's', 't', '\022', '!', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\002', ' ', '\001',
-'(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\004', 'p', 'a', 't', 'h', '\022', '=',
-'\n', '\004', 's', 'e', 'n', 'd', '\030', '\003', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'P', 'a',
-'y', 'l', 'o', 'a', 'd', 'R', '\004', 's', 'e', 'n', 'd', '\022', 'C', '\n', '\007', 'r', 'e', 'c', 'e', 'i', 'v', 'e', '\030', '\004', ' ',
-'\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'P', 'a', 'y', 'l', 'o', 'a', 'd', 'R', '\007', 'r', 'e',
-'c', 'e', 'i', 'v', 'e', '\022', 'g', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_',
-'t', 'o', '_', 'a', 'd', 'd', '\030', '\006', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't',
-'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e',
-'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'K', '\n', '\031', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a',
-'d', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\010', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r',
-'\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a',
-'d', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', 'F', '\n', '\021', 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd', '_',
-'s', 't', 'a', 't', 'u', 's', 'e', 's', '\030', '\t', ' ', '\003', '(', '\013', '2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
-'p', 'e', '.', 'v', '3', '.', 'I', 'n', 't', '6', '4', 'R', 'a', 'n', 'g', 'e', 'R', '\020', 'e', 'x', 'p', 'e', 'c', 't', 'e',
-'d', 'S', 't', 'a', 't', 'u', 's', 'e', 's', '\022', 'T', '\n', '\021', 'c', 'o', 'd', 'e', 'c', '_', 'c', 'l', 'i', 'e', 'n', 't',
-'_', 't', 'y', 'p', 'e', '\030', '\n', ' ', '\001', '(', '\016', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.',
-'v', '3', '.', 'C', 'o', 'd', 'e', 'c', 'C', 'l', 'i', 'e', 'n', 't', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001',
-'\002', '\020', '\001', 'R', '\017', 'c', 'o', 'd', 'e', 'c', 'C', 'l', 'i', 'e', 'n', 't', 'T', 'y', 'p', 'e', '\022', 'V', '\n', '\024', 's',
-'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', '_', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\030', '\013', ' ', '\001', '(', '\013',
-'2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.',
-'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\022', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm',
-'e', 'M', 'a', 't', 'c', 'h', 'e', 'r', ':', '4', '\232', '\305', '\210', '\036', '/', '\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'H', 't', 't',
-'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'J', '\004', '\010', '\005', '\020', '\006', 'J', '\004', '\010', '\007', '\020', '\010', 'R',
-'\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', 'R', '\t', 'u', 's', 'e', '_', 'h', 't', 't', 'p', '2', '\032',
-'\311', '\001', '\n', '\016', 'T', 'c', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '=', '\n', '\004', 's', 'e', 'n',
-'d', '\030', '\001', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'P', 'a', 'y', 'l', 'o', 'a', 'd',
-'R', '\004', 's', 'e', 'n', 'd', '\022', 'C', '\n', '\007', 'r', 'e', 'c', 'e', 'i', 'v', 'e', '\030', '\002', ' ', '\003', '(', '\013', '2', ')',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a',
-'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'P', 'a', 'y', 'l', 'o', 'a', 'd', 'R', '\007', 'r', 'e', 'c', 'e', 'i', 'v', 'e',
-':', '3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r',
-'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'T', 'c', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h',
-'e', 'c', 'k', '\032', '[', '\n', '\020', 'R', 'e', 'd', 'i', 's', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '\020',
-'\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', ':', '5', '\232', '\305', '\210', '\036', '0', '\n', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C',
-'h', 'e', 'c', 'k', '.', 'R', 'e', 'd', 'i', 's', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\032', '\225', '\001', '\n',
-'\017', 'G', 'r', 'p', 'c', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'i',
-'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\013', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm',
-'e', '\022', ')', '\n', '\t', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010',
-'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\t', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', ':', '4', '\232', '\305', '\210', '\036',
-'/', '\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l',
-'t', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'G', 'r', 'p', 'c', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\032', '\300',
-'\001', '\n', '\021', 'C', 'u', 's', 't', 'o', 'm', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '\033', '\n', '\004', 'n',
-'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022',
-'9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p',
-'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '6', '\232', '\305', '\210', '\036', '1', '\n', '/', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'C', 'u', 's',
-'t', 'o', 'm', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_',
-'t', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\032', 'd', '\n', '\n', 'T', 'l', 's',
-'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '%', '\n', '\016', 'a', 'l', 'p', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's',
-'\030', '\001', ' ', '\003', '(', '\t', 'R', '\r', 'a', 'l', 'p', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', ':', '/', '\232', '\305',
-'\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e',
-'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'T', 'l', 's', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', '$', '\232', '\305', '\210',
-'\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a',
-'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'B', '\025', '\n', '\016', 'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', 'e',
-'r', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\n', '\020', '\013', '*', '`', '\n', '\014', 'H', 'e', 'a', 'l', 't', 'h', 'S', 't', 'a',
-'t', 'u', 's', '\022', '\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O', 'W', 'N', '\020', '\000', '\022', '\013', '\n', '\007', 'H', 'E', 'A', 'L', 'T',
-'H', 'Y', '\020', '\001', '\022', '\r', '\n', '\t', 'U', 'N', 'H', 'E', 'A', 'L', 'T', 'H', 'Y', '\020', '\002', '\022', '\014', '\n', '\010', 'D', 'R',
-'A', 'I', 'N', 'I', 'N', 'G', '\020', '\003', '\022', '\013', '\n', '\007', 'T', 'I', 'M', 'E', 'O', 'U', 'T', '\020', '\004', '\022', '\014', '\n', '\010',
-'D', 'E', 'G', 'R', 'A', 'D', 'E', 'D', '\020', '\005', 'B', '@', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o',
-'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\020',
-'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020',
-'\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'k', '.', 'P', 'a', 'y', 'l', 'o', 'a', 'd', 'R', '\007', 'r', 'e', 'c', 'e', 'i', 'v', 'e', '\022', 'g', '\n', '\026', 'r', 'e', 'q',
+'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\006', ' ', '\003', '(', '\013',
+'2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H',
+'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020',
+'\350', '\007', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'K',
+'\n', '\031', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o',
+'v', 'e', '\030', '\010', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001',
+'\000', 'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e',
+'\022', 'F', '\n', '\021', 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd', '_', 's', 't', 'a', 't', 'u', 's', 'e', 's', '\030', '\t', ' ', '\003',
+'(', '\013', '2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'I', 'n', 't', '6', '4', 'R',
+'a', 'n', 'g', 'e', 'R', '\020', 'e', 'x', 'p', 'e', 'c', 't', 'e', 'd', 'S', 't', 'a', 't', 'u', 's', 'e', 's', '\022', 'T', '\n',
+'\021', 'c', 'o', 'd', 'e', 'c', '_', 'c', 'l', 'i', 'e', 'n', 't', '_', 't', 'y', 'p', 'e', '\030', '\n', ' ', '\001', '(', '\016', '2',
+'\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'C', 'o', 'd', 'e', 'c', 'C', 'l', 'i', 'e',
+'n', 't', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\017', 'c', 'o', 'd', 'e', 'c', 'C', 'l',
+'i', 'e', 'n', 't', 'T', 'y', 'p', 'e', '\022', 'V', '\n', '\024', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', '_',
+'m', 'a', 't', 'c', 'h', 'e', 'r', '\030', '\013', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p',
+'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e',
+'r', 'R', '\022', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', 'M', 'a', 't', 'c', 'h', 'e', 'r', ':', '4', '\232', '\305',
+'\210', '\036', '/', '\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e',
+'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'H', 't', 't', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k',
+'J', '\004', '\010', '\005', '\020', '\006', 'J', '\004', '\010', '\007', '\020', '\010', 'R', '\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm',
+'e', 'R', '\t', 'u', 's', 'e', '_', 'h', 't', 't', 'p', '2', '\032', '\311', '\001', '\n', '\016', 'T', 'c', 'p', 'H', 'e', 'a', 'l', 't',
+'h', 'C', 'h', 'e', 'c', 'k', '\022', '=', '\n', '\004', 's', 'e', 'n', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h',
+'C', 'h', 'e', 'c', 'k', '.', 'P', 'a', 'y', 'l', 'o', 'a', 'd', 'R', '\004', 's', 'e', 'n', 'd', '\022', 'C', '\n', '\007', 'r', 'e',
+'c', 'e', 'i', 'v', 'e', '\030', '\002', ' ', '\003', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'P', 'a', 'y',
+'l', 'o', 'a', 'd', 'R', '\007', 'r', 'e', 'c', 'e', 'i', 'v', 'e', ':', '3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c',
+'k', '.', 'T', 'c', 'p', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\032', '[', '\n', '\020', 'R', 'e', 'd', 'i', 's',
+'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R',
+'\003', 'k', 'e', 'y', ':', '5', '\232', '\305', '\210', '\036', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2',
+'.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'R', 'e', 'd', 'i', 's', 'H', 'e',
+'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\032', '\225', '\001', '\n', '\017', 'G', 'r', 'p', 'c', 'H', 'e', 'a', 'l', 't', 'h', 'C',
+'h', 'e', 'c', 'k', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'i', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(',
+'\t', 'R', '\013', 's', 'e', 'r', 'v', 'i', 'c', 'e', 'N', 'a', 'm', 'e', '\022', ')', '\n', '\t', 'a', 'u', 't', 'h', 'o', 'r', 'i',
+'t', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\t', 'a', 'u',
+'t', 'h', 'o', 'r', 'i', 't', 'y', ':', '4', '\232', '\305', '\210', '\036', '/', '\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'G', 'r', 'p', 'c',
+'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\032', '\300', '\001', '\n', '\021', 'C', 'u', 's', 't', 'o', 'm', 'H', 'e', 'a',
+'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372',
+'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n',
+'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '6', '\232', '\305',
+'\210', '\036', '1', '\n', '/', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e',
+'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'C', 'u', 's', 't', 'o', 'm', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e',
+'c', 'k', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006',
+'c', 'o', 'n', 'f', 'i', 'g', '\032', 'd', '\n', '\n', 'T', 'l', 's', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '%', '\n', '\016', 'a',
+'l', 'p', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\030', '\001', ' ', '\003', '(', '\t', 'R', '\r', 'a', 'l', 'p', 'n',
+'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'a',
+'p', 'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', '.', 'T', 'l',
+'s', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'c', 'o', 'r', 'e', '.', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'B', '\025', '\n', '\016',
+'h', 'e', 'a', 'l', 't', 'h', '_', 'c', 'h', 'e', 'c', 'k', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\n', '\020', '\013',
+'*', '`', '\n', '\014', 'H', 'e', 'a', 'l', 't', 'h', 'S', 't', 'a', 't', 'u', 's', '\022', '\013', '\n', '\007', 'U', 'N', 'K', 'N', 'O',
+'W', 'N', '\020', '\000', '\022', '\013', '\n', '\007', 'H', 'E', 'A', 'L', 'T', 'H', 'Y', '\020', '\001', '\022', '\r', '\n', '\t', 'U', 'N', 'H', 'E',
+'A', 'L', 'T', 'H', 'Y', '\020', '\002', '\022', '\014', '\n', '\010', 'D', 'R', 'A', 'I', 'N', 'I', 'N', 'G', '\020', '\003', '\022', '\013', '\n', '\007',
+'T', 'I', 'M', 'E', 'O', 'U', 'T', '\020', '\004', '\022', '\014', '\n', '\010', 'D', 'E', 'G', 'R', 'A', 'D', 'E', 'D', '\020', '\005', 'B', '@',
+'\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\020', 'H', 'e', 'a', 'l', 't', 'h', 'C', 'h', 'e', 'c', 'k', 'P',
+'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[14] = {
+static upb_def_init *deps[13] = {
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_core_v3_event_service_config_proto_upbdefinit,
&envoy_type_matcher_v3_string_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
- &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
&validate_validate_proto_upbdefinit,
deps,
layouts,
"envoy/config/core/v3/health_check.proto",
- UPB_STRVIEW_INIT(descriptor, 4084)
+ UPB_STRVIEW_INIT(descriptor, 4147)
};
#include "envoy/config/core/v3/proxy_protocol.upbdefs.h"
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
-extern upb_def_init validate_validate_proto_upbdefinit;
extern const upb_msglayout envoy_config_core_v3_ProxyProtocolConfig_msginit;
static const upb_msglayout *layouts[1] = {
&envoy_config_core_v3_ProxyProtocolConfig_msginit,
};
-static const char descriptor[324] = {'\n', ')', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'p', 'r',
+static const char descriptor[299] = {'\n', ')', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'p', 'r',
'o', 'x', 'y', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '.', 'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y',
'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n',
-'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a',
-'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '}', '\n', '\023',
+'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\"', '}', '\n', '\023',
'P', 'r', 'o', 'x', 'y', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'K', '\n', '\007', 'v', 'e',
'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\016', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'P', 'r', 'o', 'x', 'y', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'C', 'o',
'l', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[3] = {
+static upb_def_init *deps[2] = {
&udpa_annotations_status_proto_upbdefinit,
- &validate_validate_proto_upbdefinit,
NULL
};
deps,
layouts,
"envoy/config/core/v3/proxy_protocol.proto",
- UPB_STRVIEW_INIT(descriptor, 324)
+ UPB_STRVIEW_INIT(descriptor, 299)
};
#include "upb/def.h"
#include "envoy/config/core/v3/substitution_format_string.upbdefs.h"
+extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
+extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init validate_validate_proto_upbdefinit;
&envoy_config_core_v3_SubstitutionFormatString_msginit,
};
-static const char descriptor[487] = {'\n', '5', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 's', 'u',
+static const char descriptor[711] = {'\n', '5', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 's', 'u',
'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o', 'n', '_', 'f', 'o', 'r', 'm', 'a', 't', '_', 's', 't', 'r', 'i', 'n', 'g', '.',
'p', 'r', 'o', 't', 'o', '\022', '\024', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
-'v', '3', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c',
-'t', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's',
-'/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v',
-'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\352', '\001', '\n', '\030', 'S', 'u', 'b', 's', 't', 'i', 't',
-'u', 't', 'i', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', '\022', '*', '\n', '\013', 't', 'e', 'x', 't',
-'_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R',
-'\n', 't', 'e', 'x', 't', 'F', 'o', 'r', 'm', 'a', 't', '\022', 'D', '\n', '\013', 'j', 's', 'o', 'n', '_', 'f', 'o', 'r', 'm', 'a',
-'t', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'S', 't', 'r', 'u', 'c', 't', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\n', 'j', 's', 'o', 'n',
-'F', 'o', 'r', 'm', 'a', 't', '\022', '*', '\n', '\021', 'o', 'm', 'i', 't', '_', 'e', 'm', 'p', 't', 'y', '_', 'v', 'a', 'l', 'u',
-'e', 's', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\017', 'o', 'm', 'i', 't', 'E', 'm', 'p', 't', 'y', 'V', 'a', 'l', 'u', 'e', 's',
-'\022', '!', '\n', '\014', 'c', 'o', 'n', 't', 'e', 'n', 't', '_', 't', 'y', 'p', 'e', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\013', 'c',
-'o', 'n', 't', 'e', 'n', 't', 'T', 'y', 'p', 'e', 'B', '\r', '\n', '\006', 'f', 'o', 'r', 'm', 'a', 't', '\022', '\003', '\370', 'B', '\001',
-'B', 'M', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\035', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i',
-'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321',
-'\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'v', '3', '\032', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/',
+'b', 'a', 's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '$', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/',
+'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034',
+'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r',
+'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a',
+'t', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd',
+'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\203', '\003', '\n', '\030', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o',
+'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', '\022', '%', '\n', '\013', 't', 'e', 'x', 't', '_', 'f', 'o', 'r',
+'m', 'a', 't', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\002', '\030', '\001', 'H', '\000', 'R', '\n', 't', 'e', 'x', 't', 'F', 'o', 'r', 'm',
+'a', 't', '\022', 'D', '\n', '\013', 'j', 's', 'o', 'n', '_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\027',
+'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'S', 't', 'r', 'u', 'c', 't', 'B', '\010',
+'\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\n', 'j', 's', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', '\022', 'P', '\n',
+'\022', 't', 'e', 'x', 't', '_', 'f', 'o', 'r', 'm', 'a', 't', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\005', ' ', '\001', '(', '\013',
+'2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D',
+'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\020', 't', 'e', 'x', 't', 'F', 'o', 'r', 'm', 'a', 't', 'S', 'o',
+'u', 'r', 'c', 'e', '\022', '*', '\n', '\021', 'o', 'm', 'i', 't', '_', 'e', 'm', 'p', 't', 'y', '_', 'v', 'a', 'l', 'u', 'e', 's',
+'\030', '\003', ' ', '\001', '(', '\010', 'R', '\017', 'o', 'm', 'i', 't', 'E', 'm', 'p', 't', 'y', 'V', 'a', 'l', 'u', 'e', 's', '\022', '!',
+'\n', '\014', 'c', 'o', 'n', 't', 'e', 'n', 't', '_', 't', 'y', 'p', 'e', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\013', 'c', 'o', 'n',
+'t', 'e', 'n', 't', 'T', 'y', 'p', 'e', '\022', 'J', '\n', '\n', 'f', 'o', 'r', 'm', 'a', 't', 't', 'e', 'r', 's', '\030', '\006', ' ',
+'\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\n', 'f',
+'o', 'r', 'm', 'a', 't', 't', 'e', 'r', 's', 'B', '\r', '\n', '\006', 'f', 'o', 'r', 'm', 'a', 't', '\022', '\003', '\370', 'B', '\001', 'B',
+'M', '\n', '\"', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\035', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o',
+'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006',
+'\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[4] = {
+static upb_def_init *deps[6] = {
+ &envoy_config_core_v3_base_proto_upbdefinit,
+ &envoy_config_core_v3_extension_proto_upbdefinit,
&google_protobuf_struct_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&validate_validate_proto_upbdefinit,
deps,
layouts,
"envoy/config/core/v3/substitution_format_string.proto",
- UPB_STRVIEW_INIT(descriptor, 487)
+ UPB_STRVIEW_INIT(descriptor, 711)
};
extern upb_def_init envoy_config_endpoint_v3_endpoint_components_proto_upbdefinit;
extern upb_def_init envoy_type_v3_percent_proto_upbdefinit;
-extern upb_def_init google_api_annotations_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
&envoy_config_endpoint_v3_ClusterLoadAssignment_NamedEndpointsEntry_msginit,
};
-static const char descriptor[1473] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/', 'v',
+static const char descriptor[1443] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/', 'v',
'3', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\022', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'c',
'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '\032', '2', 'e', 'n', 'v', 'o', 'y', '/',
'c', 'o', 'n', 'f', 'i', 'g', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/', 'v', '3', '/', 'e', 'n', 'd', 'p', 'o', 'i',
'n', 't', '_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\033', 'e', 'n', 'v', 'o',
-'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 'p', 'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034',
-'g', 'o', 'o', 'g', 'l', 'e', '/', 'a', 'p', 'i', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '.', 'p', 'r',
-'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a',
-'t', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!',
-'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i',
-'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a',
-'t', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\246', '\010', '\n', '\025', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A',
-'s', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', '\022', '*', '\n', '\014', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'n', 'a', 'm', 'e',
-'\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\013', 'c', 'l', 'u', 's', 't', 'e', 'r', 'N',
-'a', 'm', 'e', '\022', 'K', '\n', '\t', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '-', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.',
-'L', 'o', 'c', 'a', 'l', 'i', 't', 'y', 'L', 'b', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', 'R', '\t', 'e', 'n', 'd', 'p',
-'o', 'i', 'n', 't', 's', '\022', 'l', '\n', '\017', 'n', 'a', 'm', 'e', 'd', '_', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\030',
-'\005', ' ', '\003', '(', '\013', '2', 'C', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p',
-'o', 'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n',
-'m', 'e', 'n', 't', '.', 'N', 'a', 'm', 'e', 'd', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', 'E', 'n', 't', 'r', 'y', 'R',
-'\016', 'n', 'a', 'm', 'e', 'd', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\022', 'N', '\n', '\006', 'p', 'o', 'l', 'i', 'c', 'y',
-'\030', '\004', ' ', '\001', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd',
-'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g',
-'n', 'm', 'e', 'n', 't', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\006', 'p', 'o', 'l', 'i', 'c', 'y', '\032', '\303', '\004', '\n', '\006',
-'P', 'o', 'l', 'i', 'c', 'y', '\022', 'j', '\n', '\016', 'd', 'r', 'o', 'p', '_', 'o', 'v', 'e', 'r', 'l', 'o', 'a', 'd', 's', '\030',
-'\002', ' ', '\003', '(', '\013', '2', 'C', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p',
-'o', 'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n',
-'m', 'e', 'n', 't', '.', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'D', 'r', 'o', 'p', 'O', 'v', 'e', 'r', 'l', 'o', 'a', 'd', 'R',
-'\r', 'd', 'r', 'o', 'p', 'O', 'v', 'e', 'r', 'l', 'o', 'a', 'd', 's', '\022', '^', '\n', '\027', 'o', 'v', 'e', 'r', 'p', 'r', 'o',
-'v', 'i', 's', 'i', 'o', 'n', 'i', 'n', 'g', '_', 'f', 'a', 'c', 't', 'o', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '\034', '.',
-'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l',
-'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', ' ', '\000', 'R', '\026', 'o', 'v', 'e', 'r', 'p', 'r', 'o', 'v', 'i', 's', 'i', 'o',
-'n', 'i', 'n', 'g', 'F', 'a', 'c', 't', 'o', 'r', '\022', 'U', '\n', '\024', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '_', 's', 't',
-'a', 'l', 'e', '_', 'a', 'f', 't', 'e', 'r', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002',
-'*', '\000', 'R', '\022', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', 'a', 'l', 'e', 'A', 'f', 't', 'e', 'r', '\032', '\275', '\001',
-'\n', '\014', 'D', 'r', 'o', 'p', 'O', 'v', 'e', 'r', 'l', 'o', 'a', 'd', '\022', '#', '\n', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r',
-'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r',
-'y', '\022', 'I', '\n', '\017', 'd', 'r', 'o', 'p', '_', 'p', 'e', 'r', 'c', 'e', 'n', 't', 'a', 'g', 'e', '\030', '\002', ' ', '\001', '(',
-'\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o',
-'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'd', 'r', 'o', 'p', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'a', 'g',
-'e', ':', '=', '\232', '\305', '\210', '\036', '8', '\n', '6', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l',
-'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', '.', 'P', 'o', 'l', 'i', 'c',
-'y', '.', 'D', 'r', 'o', 'p', 'O', 'v', 'e', 'r', 'l', 'o', 'a', 'd', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's',
-'i', 'g', 'n', 'm', 'e', 'n', 't', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\005', '\020',
-'\006', 'R', '\030', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'o', 'v', 'e', 'r', 'p', 'r', 'o', 'v', 'i', 's', 'i', 'o', 'n', 'i',
-'n', 'g', '\032', 'e', '\n', '\023', 'N', 'a', 'm', 'e', 'd', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', 'E', 'n', 't', 'r', 'y',
-'\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '8', '\n', '\005', 'v', 'a', 'l',
-'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e',
-'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'R', '\005', 'v', 'a', 'l', 'u',
-'e', ':', '\002', '8', '\001', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
-'2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', 'B', 'A',
-'\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', 'B', '\r', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't',
-'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 'p', 'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036',
+'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.',
+'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r',
+'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a',
+'t', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/',
+'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r',
+'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r',
+'o', 't', 'o', '\"', '\246', '\010', '\n', '\025', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n',
+'m', 'e', 'n', 't', '\022', '*', '\n', '\014', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(',
+'\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\013', 'c', 'l', 'u', 's', 't', 'e', 'r', 'N', 'a', 'm', 'e', '\022', 'K',
+'\n', '\t', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'L', 'o', 'c', 'a', 'l',
+'i', 't', 'y', 'L', 'b', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', 'R', '\t', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's',
+'\022', 'l', '\n', '\017', 'n', 'a', 'm', 'e', 'd', '_', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\030', '\005', ' ', '\003', '(', '\013',
+'2', 'C', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.',
+'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', '.',
+'N', 'a', 'm', 'e', 'd', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', 'E', 'n', 't', 'r', 'y', 'R', '\016', 'n', 'a', 'm', 'e',
+'d', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\022', 'N', '\n', '\006', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\004', ' ', '\001', '(',
+'\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't',
+'.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't',
+'.', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\006', 'p', 'o', 'l', 'i', 'c', 'y', '\032', '\303', '\004', '\n', '\006', 'P', 'o', 'l', 'i', 'c',
+'y', '\022', 'j', '\n', '\016', 'd', 'r', 'o', 'p', '_', 'o', 'v', 'e', 'r', 'l', 'o', 'a', 'd', 's', '\030', '\002', ' ', '\003', '(', '\013',
+'2', 'C', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.',
+'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', '.',
+'P', 'o', 'l', 'i', 'c', 'y', '.', 'D', 'r', 'o', 'p', 'O', 'v', 'e', 'r', 'l', 'o', 'a', 'd', 'R', '\r', 'd', 'r', 'o', 'p',
+'O', 'v', 'e', 'r', 'l', 'o', 'a', 'd', 's', '\022', '^', '\n', '\027', 'o', 'v', 'e', 'r', 'p', 'r', 'o', 'v', 'i', 's', 'i', 'o',
+'n', 'i', 'n', 'g', '_', 'f', 'a', 'c', 't', 'o', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372',
+'B', '\004', '*', '\002', ' ', '\000', 'R', '\026', 'o', 'v', 'e', 'r', 'p', 'r', 'o', 'v', 'i', 's', 'i', 'o', 'n', 'i', 'n', 'g', 'F',
+'a', 'c', 't', 'o', 'r', '\022', 'U', '\n', '\024', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '_', 's', 't', 'a', 'l', 'e', '_', 'a',
+'f', 't', 'e', 'r', '\030', '\004', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\022', 'e',
+'n', 'd', 'p', 'o', 'i', 'n', 't', 'S', 't', 'a', 'l', 'e', 'A', 'f', 't', 'e', 'r', '\032', '\275', '\001', '\n', '\014', 'D', 'r', 'o',
+'p', 'O', 'v', 'e', 'r', 'l', 'o', 'a', 'd', '\022', '#', '\n', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\030', '\001', ' ', '\001',
+'(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\010', 'c', 'a', 't', 'e', 'g', 'o', 'r', 'y', '\022', 'I', '\n', '\017',
+'d', 'r', 'o', 'p', '_', 'p', 'e', 'r', 'c', 'e', 'n', 't', 'a', 'g', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e',
+'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e',
+'r', 'c', 'e', 'n', 't', 'R', '\016', 'd', 'r', 'o', 'p', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'a', 'g', 'e', ':', '=', '\232', '\305',
+'\210', '\036', '8', '\n', '6', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r',
+'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', '.', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'D', 'r', 'o',
+'p', 'O', 'v', 'e', 'r', 'l', 'o', 'a', 'd', ':', '0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a',
+'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e',
+'n', 't', '.', 'P', 'o', 'l', 'i', 'c', 'y', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\030', 'd', 'i',
+'s', 'a', 'b', 'l', 'e', '_', 'o', 'v', 'e', 'r', 'p', 'r', 'o', 'v', 'i', 's', 'i', 'o', 'n', 'i', 'n', 'g', '\032', 'e', '\n',
+'\023', 'N', 'a', 'm', 'e', 'd', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k',
+'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '8', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ',
+'\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i',
+'n', 't', '.', 'v', '3', '.', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001',
+':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'C', 'l', 'u',
+'s', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', 'B', 'A', '\n', '&', 'i', 'o', '.',
+'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e',
+'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', 'B', '\r', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'P', 'r', 'o', 't', 'o',
+'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[9] = {
+static upb_def_init *deps[8] = {
&envoy_config_endpoint_v3_endpoint_components_proto_upbdefinit,
&envoy_type_v3_percent_proto_upbdefinit,
- &google_api_annotations_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
deps,
layouts,
"envoy/config/endpoint/v3/endpoint.proto",
- UPB_STRVIEW_INIT(descriptor, 1473)
+ UPB_STRVIEW_INIT(descriptor, 1443)
};
extern upb_def_init envoy_config_listener_v3_api_listener_proto_upbdefinit;
extern upb_def_init envoy_config_listener_v3_listener_components_proto_upbdefinit;
extern upb_def_init envoy_config_listener_v3_udp_listener_config_proto_upbdefinit;
-extern upb_def_init google_api_annotations_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_collection_entry_proto_upbdefinit;
+extern upb_def_init xds_core_v3_collection_entry_proto_upbdefinit;
extern upb_def_init udpa_annotations_security_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
&envoy_config_listener_v3_Listener_ConnectionBalanceConfig_ExactBalance_msginit,
};
-static const char descriptor[3016] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
+static const char descriptor[3185] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
'3', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'c',
'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '\032', ')', 'e', 'n', 'v', 'o', 'y', '/',
'c', 'o', 'n', 'f', 'i', 'g', '/', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '/', 'v', '3', '/', 'a', 'c', 'c', 'e', 's',
'e', 'r', '/', 'v', '3', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's',
'.', 'p', 'r', 'o', 't', 'o', '\032', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't',
'e', 'n', 'e', 'r', '/', 'v', '3', '/', 'u', 'd', 'p', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'a', 'p', 'i', '/', 'a', 'n', 'n', 'o',
-'t', 'a', 't', 'i', 'o', 'n', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o',
-'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '#', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i',
-'o', 'n', '_', 'e', 'n', 't', 'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o',
-'t', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u',
-'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r',
-'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r',
-'s', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v',
-'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 'M', '\n', '\022', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r',
-'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '\022', '7', '\n', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\030', '\001', ' ', '\003',
-'(', '\013', '2', '\035', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't',
-'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', 'R', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\"', '\224', '\021', '\n', '\010', 'L', 'i', 's',
-'t', 'e', 'n', 'e', 'r', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e',
-'\022', 'A', '\n', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'B', '\010',
-'\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\022', 'J', '\n', '\r', 'f', 'i', 'l', 't',
-'e', 'r', '_', 'c', 'h', 'a', 'i', 'n', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C',
-'h', 'a', 'i', 'n', 'R', '\014', 'f', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 's', '\022', 'o', '\n', '!', 'p', 'e', 'r',
-'_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i', 't', '_',
-'b', 'y', 't', 'e', 's', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
-'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001',
-'R', '\035', 'p', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i', 'm', 'i',
-'t', 'B', 'y', 't', 'e', 's', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\006', ' ', '\001', '(', '\013', '2',
-'\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e',
-'t', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'T', '\n', '\r', 'd', 'e', 'p', 'r', 'e',
-'c', 'a', 't', 'e', 'd', '_', 'v', '1', '\030', '\007', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r',
-'.', 'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'V', '1', 'R', '\014', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd',
-'V', '1', '\022', 'K', '\n', '\n', 'd', 'r', 'a', 'i', 'n', '_', 't', 'y', 'p', 'e', '\030', '\010', ' ', '\001', '(', '\016', '2', ',', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.',
-'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'D', 'r', 'a', 'i', 'n', 'T', 'y', 'p', 'e', 'R', '\t', 'd', 'r', 'a', 'i', 'n',
-'T', 'y', 'p', 'e', '\022', 'S', '\n', '\020', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030',
-'\t', ' ', '\003', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
-'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\017', 'l',
-'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', '\022', 'S', '\n', '\030', 'l', 'i', 's', 't', 'e', 'n', 'e',
-'r', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\017', ' ', '\001', '(', '\013', '2', '\031',
-'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n',
-'R', '\026', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022',
-'N', '\n', '$', 'c', 'o', 'n', 't', 'i', 'n', 'u', 'e', '_', 'o', 'n', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'f',
-'i', 'l', 't', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\021', ' ', '\001', '(', '\010', 'R', ' ', 'c', 'o', 'n',
-'t', 'i', 'n', 'u', 'e', 'O', 'n', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', 'T', 'i', 'm',
-'e', 'o', 'u', 't', '\022', '<', '\n', '\013', 't', 'r', 'a', 'n', 's', 'p', 'a', 'r', 'e', 'n', 't', '\030', '\n', ' ', '\001', '(', '\013',
-'2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a',
-'l', 'u', 'e', 'R', '\013', 't', 'r', 'a', 'n', 's', 'p', 'a', 'r', 'e', 'n', 't', '\022', '6', '\n', '\010', 'f', 'r', 'e', 'e', 'b',
-'i', 'n', 'd', '\030', '\013', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\010', 'f', 'r', 'e', 'e', 'b', 'i', 'n', 'd', '\022', 'I', '\n',
-'\016', 's', 'o', 'c', 'k', 'e', 't', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\r', ' ', '\003', '(', '\013', '2', '\"', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'S', 'o', 'c', 'k', 'e',
-'t', 'O', 'p', 't', 'i', 'o', 'n', 'R', '\r', 's', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'X', '\n',
-'\032', 't', 'c', 'p', '_', 'f', 'a', 's', 't', '_', 'o', 'p', 'e', 'n', '_', 'q', 'u', 'e', 'u', 'e', '_', 'l', 'e', 'n', 'g',
-'t', 'h', '\030', '\014', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\026', 't', 'c', 'p', 'F', 'a', 's', 't', 'O', 'p', 'e',
-'n', 'Q', 'u', 'e', 'u', 'e', 'L', 'e', 'n', 'g', 't', 'h', '\022', 'S', '\n', '\021', 't', 'r', 'a', 'f', 'f', 'i', 'c', '_', 'd',
-'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\020', ' ', '\001', '(', '\016', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'f', 'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c',
-'t', 'i', 'o', 'n', 'R', '\020', 't', 'r', 'a', 'f', 'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', '\022', '[', '\n',
-'\023', 'u', 'd', 'p', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\022', ' ', '\001', '(',
-'\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r',
-'.', 'v', '3', '.', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\021', 'u', 'd',
-'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'H', '\n', '\014', 'a', 'p', 'i', '_', 'l', 'i',
-'s', 't', 'e', 'n', 'e', 'r', '\030', '\023', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'A', 'p', 'i', 'L', 'i', 's', 't', 'e', 'n', 'e',
-'r', 'R', '\013', 'a', 'p', 'i', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '\022', 'v', '\n', '\031', 'c', 'o', 'n', 'n', 'e', 'c', 't',
-'i', 'o', 'n', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\024', ' ', '\001', '(', '\013', '2',
-':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v',
-'3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a',
-'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\027', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a',
-'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\035', '\n', '\n', 'r', 'e', 'u', 's', 'e', '_', 'p', 'o', 'r', 't', '\030', '\025',
-' ', '\001', '(', '\010', 'R', '\t', 'r', 'e', 'u', 's', 'e', 'P', 'o', 'r', 't', '\022', 'C', '\n', '\n', 'a', 'c', 'c', 'e', 's', 's',
-'_', 'l', 'o', 'g', '\030', '\026', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'R', '\t',
-'a', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', '\022', 'V', '\n', '\021', 'u', 'd', 'p', '_', 'w', 'r', 'i', 't', 'e', 'r', '_', 'c',
-'o', 'n', 'f', 'i', 'g', '\030', '\027', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C',
-'o', 'n', 'f', 'i', 'g', 'R', '\017', 'u', 'd', 'p', 'W', 'r', 'i', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'F', '\n',
-'\020', 't', 'c', 'p', '_', 'b', 'a', 'c', 'k', 'l', 'o', 'g', '_', 's', 'i', 'z', 'e', '\030', '\030', ' ', '\001', '(', '\013', '2', '\034',
-'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a',
-'l', 'u', 'e', 'R', '\016', 't', 'c', 'p', 'B', 'a', 'c', 'k', 'l', 'o', 'g', 'S', 'i', 'z', 'e', '\032', 'w', '\n', '\014', 'D', 'e',
-'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'V', '1', '\022', '<', '\n', '\014', 'b', 'i', 'n', 'd', '_', 't', 'o', '_', 'p', 'o', 'r',
-'t', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\n', 'b', 'i', 'n', 'd', 'T', 'o', 'P', 'o', 'r', 't', ':', ')', '\232',
-'\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n',
-'e', 'r', '.', 'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'V', '1', '\032', '\247', '\002', '\n', '\027', 'C', 'o', 'n', 'n', 'e',
-'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\r', 'e', 'x', 'a',
-'c', 't', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'i', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'x',
+'d', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_', 'e', 'n', 't',
+'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
+'s', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u',
+'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n',
+'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't',
+'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 'L', '\n', '\022', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'l', 'l', 'e', 'c',
+'t', 'i', 'o', 'n', '\022', '6', '\n', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\034', '.', 'x',
+'d', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r',
+'y', 'R', '\007', 'e', 'n', 't', 'r', 'i', 'e', 's', '\"', '\335', '\022', '\n', '\010', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '\022', '\022',
+'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'A', '\n', '\007', 'a', 'd', 'd',
+'r', 'e', 's', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\035', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'A', 'd', 'd', 'r', 'e', 's', 's', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020',
+'\001', 'R', '\007', 'a', 'd', 'd', 'r', 'e', 's', 's', '\022', 'J', '\n', '\r', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'h', 'a', 'i',
+'n', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l',
+'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'R', '\014', 'f',
+'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 's', '\022', 'D', '\n', '\020', 'u', 's', 'e', '_', 'o', 'r', 'i', 'g', 'i', 'n',
+'a', 'l', '_', 'd', 's', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'u', 's', 'e', 'O', 'r', 'i', 'g', 'i',
+'n', 'a', 'l', 'D', 's', 't', '\022', 'W', '\n', '\024', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'f', 'i', 'l', 't', 'e', 'r', '_',
+'c', 'h', 'a', 'i', 'n', '\030', '\031', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n',
+'R', '\022', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', '\022', 'o', '\n', '!', 'p',
+'e', 'r', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i',
+'t', '_', 'b', 'y', 't', 'e', 's', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002',
+'\010', '\001', 'R', '\035', 'p', 'e', 'r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i',
+'m', 'i', 't', 'B', 'y', 't', 'e', 's', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\006', ' ', '\001', '(',
+'\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
+'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'X', '\n', '\r', 'd', 'e', 'p',
+'r', 'e', 'c', 'a', 't', 'e', 'd', '_', 'v', '1', '\030', '\007', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.',
'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n',
-'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i',
-'g', '.', 'E', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'H', '\000', 'R', '\014', 'e', 'x', 'a', 'c', 't', 'B', 'a',
-'l', 'a', 'n', 'c', 'e', '\032', 'Q', '\n', '\014', 'E', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c', 'e', ':', 'A', '\232', '\305',
-'\210', '\036', '<', '\n', ':', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e',
-'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g',
-'.', 'E', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c', 'e', ':', '4', '\232', '\305', '\210', '\036', '/', '\n', '-', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c',
-'t', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\023', '\n', '\014', 'b', 'a', 'l', 'a',
-'n', 'c', 'e', '_', 't', 'y', 'p', 'e', '\022', '\003', '\370', 'B', '\001', '\"', ')', '\n', '\t', 'D', 'r', 'a', 'i', 'n', 'T', 'y', 'p',
-'e', '\022', '\013', '\n', '\007', 'D', 'E', 'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', '\017', '\n', '\013', 'M', 'O', 'D', 'I', 'F', 'Y', '_',
-'O', 'N', 'L', 'Y', '\020', '\001', ':', '\034', '\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
-'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'J', '\004', '\010', '\016', '\020', '\017', 'J', '\004', '\010', '\004', '\020', '\005', 'R', '\020',
-'u', 's', 'e', '_', 'o', 'r', 'i', 'g', 'i', 'n', 'a', 'l', '_', 'd', 's', 't', 'B', 'A', '\n', '&', 'i', 'o', '.', 'e', 'n',
-'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's',
-'t', 'e', 'n', 'e', 'r', '.', 'v', '3', 'B', '\r', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001',
-'\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'e', 'r', '.', 'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e', 'd', 'V', '1', 'B', '\002', '\030', '\001', 'R', '\014', 'd', 'e', 'p', 'r',
+'e', 'c', 'a', 't', 'e', 'd', 'V', '1', '\022', 'K', '\n', '\n', 'd', 'r', 'a', 'i', 'n', '_', 't', 'y', 'p', 'e', '\030', '\010', ' ',
+'\001', '(', '\016', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n',
+'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'D', 'r', 'a', 'i', 'n', 'T', 'y', 'p', 'e', 'R',
+'\t', 'd', 'r', 'a', 'i', 'n', 'T', 'y', 'p', 'e', '\022', 'S', '\n', '\020', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'f', 'i',
+'l', 't', 'e', 'r', 's', '\030', '\t', ' ', '\003', '(', '\013', '2', '(', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l',
+'t', 'e', 'r', 'R', '\017', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', '\022', 'S', '\n', '\030', 'l',
+'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\017',
+' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
+'r', 'a', 't', 'i', 'o', 'n', 'R', '\026', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 's', 'T', 'i',
+'m', 'e', 'o', 'u', 't', '\022', 'N', '\n', '$', 'c', 'o', 'n', 't', 'i', 'n', 'u', 'e', '_', 'o', 'n', '_', 'l', 'i', 's', 't',
+'e', 'n', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\021', ' ', '\001', '(',
+'\010', 'R', ' ', 'c', 'o', 'n', 't', 'i', 'n', 'u', 'e', 'O', 'n', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't',
+'e', 'r', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '<', '\n', '\013', 't', 'r', 'a', 'n', 's', 'p', 'a', 'r', 'e', 'n', 't',
+'\030', '\n', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\013', 't', 'r', 'a', 'n', 's', 'p', 'a', 'r', 'e', 'n', 't', '\022', '6', '\n',
+'\010', 'f', 'r', 'e', 'e', 'b', 'i', 'n', 'd', '\030', '\013', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\010', 'f', 'r', 'e', 'e', 'b',
+'i', 'n', 'd', '\022', 'I', '\n', '\016', 's', 'o', 'c', 'k', 'e', 't', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '\r', ' ', '\003',
+'(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
+'.', 'S', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i', 'o', 'n', 'R', '\r', 's', 'o', 'c', 'k', 'e', 't', 'O', 'p', 't', 'i',
+'o', 'n', 's', '\022', 'X', '\n', '\032', 't', 'c', 'p', '_', 'f', 'a', 's', 't', '_', 'o', 'p', 'e', 'n', '_', 'q', 'u', 'e', 'u',
+'e', '_', 'l', 'e', 'n', 'g', 't', 'h', '\030', '\014', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\026', 't', 'c', 'p', 'F',
+'a', 's', 't', 'O', 'p', 'e', 'n', 'Q', 'u', 'e', 'u', 'e', 'L', 'e', 'n', 'g', 't', 'h', '\022', 'S', '\n', '\021', 't', 'r', 'a',
+'f', 'f', 'i', 'c', '_', 'd', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', '\030', '\020', ' ', '\001', '(', '\016', '2', '&', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'f', 'f', 'i',
+'c', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'o', 'n', 'R', '\020', 't', 'r', 'a', 'f', 'f', 'i', 'c', 'D', 'i', 'r', 'e', 'c', 't',
+'i', 'o', 'n', '\022', '[', '\n', '\023', 'u', 'd', 'p', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i',
+'g', '\030', '\022', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i',
+'s', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f',
+'i', 'g', 'R', '\021', 'u', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'H', '\n', '\014',
+'a', 'p', 'i', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '\030', '\023', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'A', 'p', 'i', 'L',
+'i', 's', 't', 'e', 'n', 'e', 'r', 'R', '\013', 'a', 'p', 'i', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '\022', 'v', '\n', '\031', 'c',
+'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030',
+'\024', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
+'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\027', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\035', '\n', '\n', 'r', 'e', 'u', 's', 'e', '_',
+'p', 'o', 'r', 't', '\030', '\025', ' ', '\001', '(', '\010', 'R', '\t', 'r', 'e', 'u', 's', 'e', 'P', 'o', 'r', 't', '\022', 'C', '\n', '\n',
+'a', 'c', 'c', 'e', 's', 's', '_', 'l', 'o', 'g', '\030', '\026', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's',
+'s', 'L', 'o', 'g', 'R', '\t', 'a', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', '\022', 'V', '\n', '\021', 'u', 'd', 'p', '_', 'w', 'r',
+'i', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\027', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e',
+'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\017', 'u', 'd', 'p', 'W', 'r', 'i', 't', 'e', 'r', 'C', 'o', 'n',
+'f', 'i', 'g', '\022', 'F', '\n', '\020', 't', 'c', 'p', '_', 'b', 'a', 'c', 'k', 'l', 'o', 'g', '_', 's', 'i', 'z', 'e', '\030', '\030',
+' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I',
+'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 't', 'c', 'p', 'B', 'a', 'c', 'k', 'l', 'o', 'g', 'S', 'i', 'z', 'e',
+'\022', '<', '\n', '\014', 'b', 'i', 'n', 'd', '_', 't', 'o', '_', 'p', 'o', 'r', 't', '\030', '\032', ' ', '\001', '(', '\013', '2', '\032', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
+'R', '\n', 'b', 'i', 'n', 'd', 'T', 'o', 'P', 'o', 'r', 't', '\032', 'w', '\n', '\014', 'D', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'e',
+'d', 'V', '1', '\022', '<', '\n', '\014', 'b', 'i', 'n', 'd', '_', 't', 'o', '_', 'p', 'o', 'r', 't', '\030', '\001', ' ', '\001', '(', '\013',
+'2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a',
+'l', 'u', 'e', 'R', '\n', 'b', 'i', 'n', 'd', 'T', 'o', 'P', 'o', 'r', 't', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e',
+'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'D', 'e', 'p', 'r',
+'e', 'c', 'a', 't', 'e', 'd', 'V', '1', '\032', '\247', '\002', '\n', '\027', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a',
+'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\r', 'e', 'x', 'a', 'c', 't', '_', 'b', 'a', 'l', 'a',
+'n', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n',
+'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'E', 'x', 'a', 'c', 't',
+'B', 'a', 'l', 'a', 'n', 'c', 'e', 'H', '\000', 'R', '\014', 'e', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c', 'e', '\032', 'Q',
+'\n', '\014', 'E', 'x', 'a', 'c', 't', 'B', 'a', 'l', 'a', 'n', 'c', 'e', ':', 'A', '\232', '\305', '\210', '\036', '<', '\n', ':', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e',
+'c', 't', 'i', 'o', 'n', 'B', 'a', 'l', 'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'E', 'x', 'a', 'c', 't', 'B',
+'a', 'l', 'a', 'n', 'c', 'e', ':', '4', '\232', '\305', '\210', '\036', '/', '\n', '-', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
+'v', '2', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'B', 'a', 'l',
+'a', 'n', 'c', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\023', '\n', '\014', 'b', 'a', 'l', 'a', 'n', 'c', 'e', '_', 't', 'y', 'p',
+'e', '\022', '\003', '\370', 'B', '\001', '\"', ')', '\n', '\t', 'D', 'r', 'a', 'i', 'n', 'T', 'y', 'p', 'e', '\022', '\013', '\n', '\007', 'D', 'E',
+'F', 'A', 'U', 'L', 'T', '\020', '\000', '\022', '\017', '\n', '\013', 'M', 'O', 'D', 'I', 'F', 'Y', '_', 'O', 'N', 'L', 'Y', '\020', '\001', ':',
+'\034', '\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'i', 's', 't',
+'e', 'n', 'e', 'r', 'J', '\004', '\010', '\016', '\020', '\017', 'B', 'A', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o',
+'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.',
+'v', '3', 'B', '\r', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002',
+'\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[17] = {
+static upb_def_init *deps[16] = {
&envoy_config_accesslog_v3_accesslog_proto_upbdefinit,
&envoy_config_core_v3_address_proto_upbdefinit,
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_listener_v3_api_listener_proto_upbdefinit,
&envoy_config_listener_v3_listener_components_proto_upbdefinit,
&envoy_config_listener_v3_udp_listener_config_proto_upbdefinit,
- &google_api_annotations_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
- &udpa_core_v1_collection_entry_proto_upbdefinit,
+ &xds_core_v3_collection_entry_proto_upbdefinit,
&udpa_annotations_security_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
deps,
layouts,
"envoy/config/listener/v3/listener.proto",
- UPB_STRVIEW_INIT(descriptor, 3016)
+ UPB_STRVIEW_INIT(descriptor, 3185)
};
extern upb_def_init envoy_config_core_v3_address_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
+extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
extern upb_def_init envoy_type_v3_range_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
-extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
&envoy_config_listener_v3_ListenerFilter_msginit,
};
-static const char descriptor[3082] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
+static const char descriptor[3284] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
'3', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', '.', 'p', 'r', 'o',
't', 'o', '\022', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r',
'.', 'v', '3', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3',
'/', 'a', 'd', 'd', 'r', 'e', 's', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n',
-'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'e',
-'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 'r', 'a', 'n', 'g', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032',
-'\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't',
-'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i',
-'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p',
-'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't',
-'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i',
-'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l',
-'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\250', '\001', '\n', '\006', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\033', '\n',
-'\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm',
-'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\024',
-'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't',
-'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '#', '\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.',
-'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n',
-'\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\002', '\020', '\003', 'R',
-'\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\212', '\006', '\n', '\020', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a',
-'t', 'c', 'h', '\022', 'T', '\n', '\020', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'p', 'o', 'r', 't', '\030', '\010',
-' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I',
-'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\372', 'B', '\010', '*', '\006', '\030', '\377', '\377', '\003', '(', '\001', 'R', '\017', 'd',
-'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'P', 'o', 'r', 't', '\022', 'D', '\n', '\r', 'p', 'r', 'e', 'f', 'i', 'x', '_',
-'r', 'a', 'n', 'g', 'e', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'R', '\014', 'p', 'r', 'e',
-'f', 'i', 'x', 'R', 'a', 'n', 'g', 'e', 's', '\022', '%', '\n', '\016', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 's', 'u', 'f', 'f',
-'i', 'x', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\r', 'a', 'd', 'd', 'r', 'e', 's', 's', 'S', 'u', 'f', 'f', 'i', 'x', '\022', ';',
-'\n', '\n', 's', 'u', 'f', 'f', 'i', 'x', '_', 'l', 'e', 'n', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\t',
-'s', 'u', 'f', 'f', 'i', 'x', 'L', 'e', 'n', '\022', 'j', '\n', '\013', 's', 'o', 'u', 'r', 'c', 'e', '_', 't', 'y', 'p', 'e', '\030',
-'\014', ' ', '\001', '(', '\016', '2', '?', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
-'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', '.',
-'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'S', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005',
-'\202', '\001', '\002', '\020', '\001', 'R', '\n', 's', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', 'Q', '\n', '\024', 's', 'o', 'u', 'r',
-'c', 'e', '_', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'a', 'n', 'g', 'e', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', '\037', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r',
-'R', 'a', 'n', 'g', 'e', 'R', '\022', 's', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'e', 'f', 'i', 'x', 'R', 'a', 'n', 'g', 'e', 's',
-'\022', '3', '\n', '\014', 's', 'o', 'u', 'r', 'c', 'e', '_', 'p', 'o', 'r', 't', 's', '\030', '\007', ' ', '\003', '(', '\r', 'B', '\020', '\372',
-'B', '\r', '\222', '\001', '\n', '\"', '\010', '*', '\006', '\030', '\377', '\377', '\003', '(', '\001', 'R', '\013', 's', 'o', 'u', 'r', 'c', 'e', 'P', 'o',
-'r', 't', 's', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm', 'e', 's', '\030', '\013', ' ', '\003', '(', '\t',
-'R', '\013', 's', 'e', 'r', 'v', 'e', 'r', 'N', 'a', 'm', 'e', 's', '\022', '-', '\n', '\022', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r',
-'t', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\030', '\t', ' ', '\001', '(', '\t', 'R', '\021', 't', 'r', 'a', 'n', 's', 'p', 'o',
-'r', 't', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\022', '3', '\n', '\025', 'a', 'p', 'p', 'l', 'i', 'c', 'a', 't', 'i', 'o', 'n',
-'_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\030', '\n', ' ', '\003', '(', '\t', 'R', '\024', 'a', 'p', 'p', 'l', 'i', 'c', 'a',
-'t', 'i', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\"', 'F', '\n', '\024', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', 'S', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', '\007', '\n', '\003', 'A', 'N', 'Y', '\020', '\000', '\022', '\027', '\n', '\023',
-'S', 'A', 'M', 'E', '_', 'I', 'P', '_', 'O', 'R', '_', 'L', 'O', 'O', 'P', 'B', 'A', 'C', 'K', '\020', '\001', '\022', '\014', '\n', '\010',
-'E', 'X', 'T', 'E', 'R', 'N', 'A', 'L', '\020', '\002', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.',
-'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a',
-'i', 'n', 'M', 'a', 't', 'c', 'h', 'J', '\004', '\010', '\001', '\020', '\002', '\"', '\230', '\005', '\n', '\013', 'F', 'i', 'l', 't', 'e', 'r', 'C',
-'h', 'a', 'i', 'n', '\022', 'X', '\n', '\022', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'h', 'a', 'i', 'n', '_', 'm', 'a', 't', 'c',
-'h', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i',
-'s', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c',
-'h', 'R', '\020', 'f', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', '\022', ':', '\n', '\007', 'f', 'i',
-'l', 't', 'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\007', 'f', 'i', 'l',
-'t', 'e', 'r', 's', '\022', 'B', '\n', '\017', 'u', 's', 'e', '_', 'p', 'r', 'o', 'x', 'y', '_', 'p', 'r', 'o', 't', 'o', '\030', '\004',
-' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o',
-'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\r', 'u', 's', 'e', 'P', 'r', 'o', 'x', 'y', 'P', 'r', 'o', 't', 'o', '\022', ':', '\n',
-'\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\005', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm',
-'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k',
-'e', 't', '\030', '\006', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
-'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R', '\017', 't',
-'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\007', ' ',
-'\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 's', '\n', '\027', 'o', 'n', '_', 'd', 'e', 'm', 'a', 'n', 'd', '_', 'c', 'o',
-'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e',
-'r', 'C', 'h', 'a', 'i', 'n', '.', 'O', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't',
-'i', 'o', 'n', 'R', '\025', 'o', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o',
-'n', '\032', '[', '\n', '\025', 'O', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o',
-'n', '\022', 'B', '\n', '\017', 'r', 'e', 'b', 'u', 'i', 'l', 'd', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001', ' ', '\001', '(',
-'\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't',
-'i', 'o', 'n', 'R', '\016', 'r', 'e', 'b', 'u', 'i', 'l', 'd', 'T', 'i', 'm', 'e', 'o', 'u', 't', ':', '(', '\232', '\305', '\210', '\036',
-'#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.',
-'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\013', 't', 'l', 's', '_', 'c', 'o',
-'n', 't', 'e', 'x', 't', '\"', '\302', '\005', '\n', '!', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C',
-'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022', 'a', '\n', '\010', 'o', 'r', '_',
-'m', 'a', 't', 'c', 'h', '\030', '\001', ' ', '\001', '(', '\013', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l',
-'t', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '.', 'M', 'a',
-'t', 'c', 'h', 'S', 'e', 't', 'H', '\000', 'R', '\007', 'o', 'r', 'M', 'a', 't', 'c', 'h', '\022', 'c', '\n', '\t', 'a', 'n', 'd', '_',
-'m', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l',
-'t', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '.', 'M', 'a',
-'t', 'c', 'h', 'S', 'e', 't', 'H', '\000', 'R', '\010', 'a', 'n', 'd', 'M', 'a', 't', 'c', 'h', '\022', 'Z', '\n', '\t', 'n', 'o', 't',
-'_', 'm', 'a', 't', 'c', 'h', '\030', '\003', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i',
-'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'H', '\000',
-'R', '\010', 'n', 'o', 't', 'M', 'a', 't', 'c', 'h', '\022', '&', '\n', '\t', 'a', 'n', 'y', '_', 'm', 'a', 't', 'c', 'h', '\030', '\004',
-' ', '\001', '(', '\010', 'B', '\007', '\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H', '\000', 'R', '\010', 'a', 'n', 'y', 'M', 'a', 't', 'c', 'h',
-'\022', 'Q', '\n', '\026', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'p', 'o', 'r', 't', '_', 'r', 'a', 'n', 'g',
-'e', '\030', '\005', ' ', '\001', '(', '\013', '2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'I',
-'n', 't', '3', '2', 'R', 'a', 'n', 'g', 'e', 'H', '\000', 'R', '\024', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'P',
-'o', 'r', 't', 'R', 'a', 'n', 'g', 'e', '\032', '\260', '\001', '\n', '\010', 'M', 'a', 't', 'c', 'h', 'S', 'e', 't', '\022', '[', '\n', '\005',
-'r', 'u', 'l', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l',
-'t', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'B', '\010', '\372',
-'B', '\005', '\222', '\001', '\002', '\010', '\002', 'R', '\005', 'r', 'u', 'l', 'e', 's', ':', 'G', '\232', '\305', '\210', '\036', 'B', '\n', '@', 'e', 'n',
+'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '$', 'e',
+'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'e', 'x', 't', 'e', 'n',
+'s', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3',
+'/', 'r', 'a', 'n', 'g', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o',
+'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r',
+'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a',
+'t', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o',
+'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i',
+'d', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\202', '\002', '\n', '\006', 'F',
+'i', 'l', 't', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
+'\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g',
+'\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
+'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'X', '\n', '\020', 'c', 'o', 'n',
+'f', 'i', 'g', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '\030', '\005', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E', 'x', 't', 'e', 'n', 's', 'i',
+'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\017', 'c', 'o', 'n', 'f', 'i', 'g', 'D',
+'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', ':', '#', '\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c',
+'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c',
+'o', 'n', 'f', 'i', 'g', '\"', '\212', '\006', '\n', '\020', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c',
+'h', '\022', 'T', '\n', '\020', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'p', 'o', 'r', 't', '\030', '\010', ' ', '\001',
+'(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't',
+'3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\372', 'B', '\010', '*', '\006', '\030', '\377', '\377', '\003', '(', '\001', 'R', '\017', 'd', 'e', 's',
+'t', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'P', 'o', 'r', 't', '\022', 'D', '\n', '\r', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'a',
+'n', 'g', 'e', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a', 'n', 'g', 'e', 'R', '\014', 'p', 'r', 'e', 'f', 'i',
+'x', 'R', 'a', 'n', 'g', 'e', 's', '\022', '%', '\n', '\016', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 's', 'u', 'f', 'f', 'i', 'x',
+'\030', '\004', ' ', '\001', '(', '\t', 'R', '\r', 'a', 'd', 'd', 'r', 'e', 's', 's', 'S', 'u', 'f', 'f', 'i', 'x', '\022', ';', '\n', '\n',
+'s', 'u', 'f', 'f', 'i', 'x', '_', 'l', 'e', 'n', '\030', '\005', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 's', 'u',
+'f', 'f', 'i', 'x', 'L', 'e', 'n', '\022', 'j', '\n', '\013', 's', 'o', 'u', 'r', 'c', 'e', '_', 't', 'y', 'p', 'e', '\030', '\014', ' ',
+'\001', '(', '\016', '2', '?', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n',
+'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', '.', 'C', 'o',
+'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'S', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001',
+'\002', '\020', '\001', 'R', '\n', 's', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', 'Q', '\n', '\024', 's', 'o', 'u', 'r', 'c', 'e',
+'_', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'a', 'n', 'g', 'e', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', '\037', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'i', 'd', 'r', 'R', 'a',
+'n', 'g', 'e', 'R', '\022', 's', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'e', 'f', 'i', 'x', 'R', 'a', 'n', 'g', 'e', 's', '\022', '3',
+'\n', '\014', 's', 'o', 'u', 'r', 'c', 'e', '_', 'p', 'o', 'r', 't', 's', '\030', '\007', ' ', '\003', '(', '\r', 'B', '\020', '\372', 'B', '\r',
+'\222', '\001', '\n', '\"', '\010', '*', '\006', '\030', '\377', '\377', '\003', '(', '\001', 'R', '\013', 's', 'o', 'u', 'r', 'c', 'e', 'P', 'o', 'r', 't',
+'s', '\022', '!', '\n', '\014', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm', 'e', 's', '\030', '\013', ' ', '\003', '(', '\t', 'R', '\013',
+'s', 'e', 'r', 'v', 'e', 'r', 'N', 'a', 'm', 'e', 's', '\022', '-', '\n', '\022', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_',
+'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\030', '\t', ' ', '\001', '(', '\t', 'R', '\021', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't',
+'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\022', '3', '\n', '\025', 'a', 'p', 'p', 'l', 'i', 'c', 'a', 't', 'i', 'o', 'n', '_', 'p',
+'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\030', '\n', ' ', '\003', '(', '\t', 'R', '\024', 'a', 'p', 'p', 'l', 'i', 'c', 'a', 't', 'i',
+'o', 'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\"', 'F', '\n', '\024', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'S', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', '\007', '\n', '\003', 'A', 'N', 'Y', '\020', '\000', '\022', '\027', '\n', '\023', 'S', 'A',
+'M', 'E', '_', 'I', 'P', '_', 'O', 'R', '_', 'L', 'O', 'O', 'P', 'B', 'A', 'C', 'K', '\020', '\001', '\022', '\014', '\n', '\010', 'E', 'X',
+'T', 'E', 'R', 'N', 'A', 'L', '\020', '\002', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n',
+'M', 'a', 't', 'c', 'h', 'J', '\004', '\010', '\001', '\020', '\002', '\"', '\200', '\006', '\n', '\013', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a',
+'i', 'n', '\022', 'X', '\n', '\022', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'h', 'a', 'i', 'n', '_', 'm', 'a', 't', 'c', 'h', '\030',
+'\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
+'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'R',
+'\020', 'f', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', '\022', ':', '\n', '\007', 'f', 'i', 'l', 't',
+'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\007', 'f', 'i', 'l', 't', 'e',
+'r', 's', '\022', 'F', '\n', '\017', 'u', 's', 'e', '_', 'p', 'r', 'o', 'x', 'y', '_', 'p', 'r', 'o', 't', 'o', '\030', '\004', ' ', '\001',
+'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
+'V', 'a', 'l', 'u', 'e', 'B', '\002', '\030', '\001', 'R', '\r', 'u', 's', 'e', 'P', 'r', 'o', 'x', 'y', 'P', 'r', 'o', 't', 'o', '\022',
+':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\005', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R',
+'\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'P', '\n', '\020', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o',
+'c', 'k', 'e', 't', '\030', '\006', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', 'R',
+'\017', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k', 'e', 't', '\022', 'b', '\n', ' ', 't', 'r', 'a', 'n', 's',
+'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 't', 'i', 'm', 'e', 'o',
+'u', 't', '\030', '\t', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\035', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', 'S', 'o', 'c', 'k',
+'e', 't', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030',
+'\007', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 's', '\n', '\027', 'o', 'n', '_', 'd', 'e', 'm', 'a', 'n', 'd', '_',
+'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\010', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'F', 'i', 'l',
+'t', 'e', 'r', 'C', 'h', 'a', 'i', 'n', '.', 'O', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r',
+'a', 't', 'i', 'o', 'n', 'R', '\025', 'o', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't',
+'i', 'o', 'n', '\032', '[', '\n', '\025', 'O', 'n', 'D', 'e', 'm', 'a', 'n', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't',
+'i', 'o', 'n', '\022', 'B', '\n', '\017', 'r', 'e', 'b', 'u', 'i', 'l', 'd', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\001', ' ',
+'\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r',
+'a', 't', 'i', 'o', 'n', 'R', '\016', 'r', 'e', 'b', 'u', 'i', 'l', 'd', 'T', 'i', 'm', 'e', 'o', 'u', 't', ':', '(', '\232', '\305',
+'\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e',
+'r', '.', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\013', 't', 'l', 's', '_',
+'c', 'o', 'n', 't', 'e', 'x', 't', '\"', '\302', '\005', '\n', '!', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e',
+'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022', 'a', '\n', '\010', 'o',
+'r', '_', 'm', 'a', 't', 'c', 'h', '\030', '\001', ' ', '\001', '(', '\013', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F',
+'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '.',
+'M', 'a', 't', 'c', 'h', 'S', 'e', 't', 'H', '\000', 'R', '\007', 'o', 'r', 'M', 'a', 't', 'c', 'h', '\022', 'c', '\n', '\t', 'a', 'n',
+'d', '_', 'm', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F',
+'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '.',
+'M', 'a', 't', 'c', 'h', 'S', 'e', 't', 'H', '\000', 'R', '\010', 'a', 'n', 'd', 'M', 'a', 't', 'c', 'h', '\022', 'Z', '\n', '\t', 'n',
+'o', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\003', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r',
+'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e',
+'H', '\000', 'R', '\010', 'n', 'o', 't', 'M', 'a', 't', 'c', 'h', '\022', '&', '\n', '\t', 'a', 'n', 'y', '_', 'm', 'a', 't', 'c', 'h',
+'\030', '\004', ' ', '\001', '(', '\010', 'B', '\007', '\372', 'B', '\004', 'j', '\002', '\010', '\001', 'H', '\000', 'R', '\010', 'a', 'n', 'y', 'M', 'a', 't',
+'c', 'h', '\022', 'Q', '\n', '\026', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'p', 'o', 'r', 't', '_', 'r', 'a',
+'n', 'g', 'e', '\030', '\005', ' ', '\001', '(', '\013', '2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3',
+'.', 'I', 'n', 't', '3', '2', 'R', 'a', 'n', 'g', 'e', 'H', '\000', 'R', '\024', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o',
+'n', 'P', 'o', 'r', 't', 'R', 'a', 'n', 'g', 'e', '\032', '\260', '\001', '\n', '\010', 'M', 'a', 't', 'c', 'h', 'S', 'e', 't', '\022', '[',
+'\n', '\005', 'r', 'u', 'l', 'e', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F',
+'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'B',
+'\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\002', 'R', '\005', 'r', 'u', 'l', 'e', 's', ':', 'G', '\232', '\305', '\210', '\036', 'B', '\n', '@',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'L', 'i', 's',
+'t', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd',
+'i', 'c', 'a', 't', 'e', '.', 'M', 'a', 't', 'c', 'h', 'S', 'e', 't', ':', '>', '\232', '\305', '\210', '\036', '9', '\n', '7', 'e', 'n',
'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'L', 'i', 's', 't', 'e',
'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c',
-'a', 't', 'e', '.', 'M', 'a', 't', 'c', 'h', 'S', 'e', 't', ':', '>', '\232', '\305', '\210', '\036', '9', '\n', '7', 'e', 'n', 'v', 'o',
-'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'L', 'i', 's', 't', 'e', 'n', 'e',
-'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't',
-'e', 'B', '\013', '\n', '\004', 'r', 'u', 'l', 'e', '\022', '\003', '\370', 'B', '\001', '\"', '\230', '\002', '\n', '\016', 'L', 'i', 's', 't', 'e', 'n',
-'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372',
-'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n',
-'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'd', '\n', '\017',
-'f', 'i', 'l', 't', 'e', 'r', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2', ';', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L',
-'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h', 'P', 'r',
-'e', 'd', 'i', 'c', 'a', 't', 'e', 'R', '\016', 'f', 'i', 'l', 't', 'e', 'r', 'D', 'i', 's', 'a', 'b', 'l', 'e', 'd', ':', '+',
-'\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e',
-'n', 'e', 'r', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n',
-'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'B', 'K', '\n',
-'&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', 'B', '\027', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C',
-'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b',
-'\006', 'p', 'r', 'o', 't', 'o', '3',
+'a', 't', 'e', 'B', '\013', '\n', '\004', 'r', 'u', 'l', 'e', '\022', '\003', '\370', 'B', '\001', '\"', '\230', '\002', '\n', '\016', 'L', 'i', 's', 't',
+'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B',
+'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c',
+'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'd',
+'\n', '\017', 'f', 'i', 'l', 't', 'e', 'r', '_', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2', ';',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3',
+'.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'h', 'a', 'i', 'n', 'M', 'a', 't', 'c', 'h',
+'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'R', '\016', 'f', 'i', 'l', 't', 'e', 'r', 'D', 'i', 's', 'a', 'b', 'l', 'e', 'd',
+':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's',
+'t', 'e', 'n', 'e', 'r', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c',
+'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', 'B',
+'K', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', 'B', '\027', 'L', 'i', 's', 't', 'e', 'n', 'e',
+'r', 'C', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020',
+'\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[11] = {
&envoy_config_core_v3_address_proto_upbdefinit,
&envoy_config_core_v3_base_proto_upbdefinit,
+ &envoy_config_core_v3_extension_proto_upbdefinit,
&envoy_type_v3_range_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
- &google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
deps,
layouts,
"envoy/config/listener/v3/listener_components.proto",
- UPB_STRVIEW_INIT(descriptor, 3082)
+ UPB_STRVIEW_INIT(descriptor, 3284)
};
#include "envoy/config/listener/v3/udp_listener_config.upbdefs.h"
extern upb_def_init google_protobuf_any_proto_upbdefinit;
-extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern const upb_msglayout envoy_config_listener_v3_UdpListenerConfig_msginit;
&envoy_config_listener_v3_ActiveRawUdpListenerConfig_msginit,
};
-static const char descriptor[574] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
+static const char descriptor[544] = {'\n', '2', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/', 'v',
'3', '/', 'u', 'd', 'p', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'p', 'r', 'o',
't', 'o', '\022', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r',
'.', 'v', '3', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.',
-'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't',
-'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i',
-'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n',
-'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't',
-'o', '\"', '\307', '\001', '\n', '\021', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '*',
-'\n', '\021', 'u', 'd', 'p', '_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
-'R', '\017', 'u', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'N', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e',
-'d', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i',
-'g', ':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i',
-'s', 't', 'e', 'n', 'e', 'r', '.', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'B',
-'\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n',
-'f', 'i', 'g', '\"', 'U', '\n', '\032', 'A', 'c', 't', 'i', 'v', 'e', 'R', 'a', 'w', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n',
-'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'A', 'c', 't', 'i', 'v', 'e', 'R', 'a', 'w', 'U', 'd',
-'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'B', 'J', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v',
-'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't',
-'e', 'n', 'e', 'r', '.', 'v', '3', 'B', '\026', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i',
-'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's',
+'t', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
+'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\"', '\307', '\001', '\n',
+'\021', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '*', '\n', '\021', 'u', 'd', 'p',
+'_', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\017', 'u', 'd', 'p',
+'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'N', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n',
+'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '.', '\232', '\305',
+'\210', '\036', ')', '\n', '\'', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'l', 'i', 's', 't', 'e', 'n', 'e',
+'r', '.', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\r', '\n', '\013', 'c', 'o',
+'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', 'U',
+'\n', '\032', 'A', 'c', 't', 'i', 'v', 'e', 'R', 'a', 'w', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n',
+'f', 'i', 'g', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
+'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'A', 'c', 't', 'i', 'v', 'e', 'R', 'a', 'w', 'U', 'd', 'p', 'L', 'i', 's', 't',
+'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'B', 'J', '\n', '&', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o',
+'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.',
+'v', '3', 'B', '\026', 'U', 'd', 'p', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'P', 'r', 'o', 't',
+'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[5] = {
+static upb_def_init *deps[4] = {
&google_protobuf_any_proto_upbdefinit,
- &google_protobuf_struct_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
NULL
deps,
layouts,
"envoy/config/listener/v3/udp_listener_config.proto",
- UPB_STRVIEW_INIT(descriptor, 574)
+ UPB_STRVIEW_INIT(descriptor, 544)
};
&envoy_config_route_v3_Vhds_msginit,
};
-static const char descriptor[1282] = {'\n', '!', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 'r',
+static const char descriptor[1389] = {'\n', '!', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 'r',
'o', 'u', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\022', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
'r', 'o', 'u', 't', 'e', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o',
'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '(', 'e', 'n', 'v', 'o', 'y', '/', 'c',
'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a',
'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o',
't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o',
-'t', 'o', '\"', '\227', '\006', '\n', '\022', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n',
+'t', 'o', '\"', '\202', '\007', '\n', '\022', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n',
'\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'G', '\n', '\r', 'v',
'i', 'r', 't', 'u', 'a', 'l', '_', 'h', 'o', 's', 't', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o',
'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l',
'i', 'o', 'n', 's', 'W', 'i', 'n', 's', '\022', 'G', '\n', '\021', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '_', 'c', 'l', 'u', 's',
't', 'e', 'r', 's', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\020', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'C', 'l',
-'u', 's', 't', 'e', 'r', 's', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
-'v', '2', '.', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\"', 's', '\n', '\004',
-'V', 'h', 'd', 's', '\022', 'Q', '\n', '\r', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\001', ' ', '\001',
-'(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
-'.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\014',
-'c', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', ':', '\030', '\232', '\305', '\210', '\036', '\023', '\n', '\021', 'e', 'n', 'v', 'o',
-'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'V', 'h', 'd', 's', 'B', ';', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y',
-'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
-'v', '3', 'B', '\n', 'R', 'o', 'u', 't', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b',
-'\006', 'p', 'r', 'o', 't', 'o', '3',
+'u', 's', 't', 'e', 'r', 's', '\022', 'i', '\n', '#', 'm', 'a', 'x', '_', 'd', 'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 's', 'p',
+'o', 'n', 's', 'e', '_', 'b', 'o', 'd', 'y', '_', 's', 'i', 'z', 'e', '_', 'b', 'y', 't', 'e', 's', '\030', '\013', ' ', '\001', '(',
+'\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3',
+'2', 'V', 'a', 'l', 'u', 'e', 'R', '\036', 'm', 'a', 'x', 'D', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e',
+'B', 'o', 'd', 'y', 'S', 'i', 'z', 'e', 'B', 'y', 't', 'e', 's', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't',
+'i', 'o', 'n', '\"', 's', '\n', '\004', 'V', 'h', 'd', 's', '\022', 'Q', '\n', '\r', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u',
+'r', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005',
+'\212', '\001', '\002', '\020', '\001', 'R', '\014', 'c', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', ':', '\030', '\232', '\305', '\210', '\036',
+'\023', '\n', '\021', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'V', 'h', 'd', 's', 'B', ';', '\n', '#', 'i',
+'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', 'B', '\n', 'R', 'o', 'u', 't', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200',
+'\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[8] = {
deps,
layouts,
"envoy/config/route/v3/route.proto",
- UPB_STRVIEW_INIT(descriptor, 1282)
+ UPB_STRVIEW_INIT(descriptor, 1389)
};
extern upb_def_init envoy_type_v3_range_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
-extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Action_GenericKey_msginit;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Action_HeaderValueMatch_msginit;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Action_DynamicMetaData_msginit;
+extern const upb_msglayout envoy_config_route_v3_RateLimit_Action_MetaData_msginit;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Override_msginit;
extern const upb_msglayout envoy_config_route_v3_RateLimit_Override_DynamicMetadata_msginit;
extern const upb_msglayout envoy_config_route_v3_HeaderMatcher_msginit;
extern const upb_msglayout envoy_config_route_v3_QueryParameterMatcher_msginit;
extern const upb_msglayout envoy_config_route_v3_InternalRedirectPolicy_msginit;
-static const upb_msglayout *layouts[50] = {
+static const upb_msglayout *layouts[51] = {
&envoy_config_route_v3_VirtualHost_msginit,
&envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry_msginit,
&envoy_config_route_v3_FilterAction_msginit,
&envoy_config_route_v3_RateLimit_Action_GenericKey_msginit,
&envoy_config_route_v3_RateLimit_Action_HeaderValueMatch_msginit,
&envoy_config_route_v3_RateLimit_Action_DynamicMetaData_msginit,
+ &envoy_config_route_v3_RateLimit_Action_MetaData_msginit,
&envoy_config_route_v3_RateLimit_Override_msginit,
&envoy_config_route_v3_RateLimit_Override_DynamicMetadata_msginit,
&envoy_config_route_v3_HeaderMatcher_msginit,
&envoy_config_route_v3_InternalRedirectPolicy_msginit,
};
-static const char descriptor[18792] = {'\n', ',', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 'r',
+static const char descriptor[19368] = {'\n', ',', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/', 'r',
'o', 'u', 't', 'e', '_', 'c', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', '.', 'p', 'r', 'o', 't', 'o', '\022', '\025', 'e', 'n',
'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v', 'o',
'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r', 'o',
'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/',
'v', '3', '/', 'r', 'a', 'n', 'g', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r',
'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034',
-'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r',
-'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p',
-'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
-'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u',
-'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p',
-'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't',
-'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i',
-'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l',
-'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\324', '\014', '\n', '\013',
-'V', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
-'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', ',', '\n', '\007', 'd', 'o', 'm', 'a', 'i', 'n',
-'s', '\030', '\002', ' ', '\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\010', '\001', '\"', '\010', 'r', '\006', '\300', '\001', '\002', '\310',
-'\001', '\000', 'R', '\007', 'd', 'o', 'm', 'a', 'i', 'n', 's', '\022', '4', '\n', '\006', 'r', 'o', 'u', 't', 'e', 's', '\030', '\003', ' ', '\003',
-'(', '\013', '2', '\034', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
-'3', '.', 'R', 'o', 'u', 't', 'e', 'R', '\006', 'r', 'o', 'u', 't', 'e', 's', '\022', '`', '\n', '\013', 'r', 'e', 'q', 'u', 'i', 'r',
-'e', '_', 't', 'l', 's', '\030', '\004', ' ', '\001', '(', '\016', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', '.', 'T', 'l',
-'s', 'R', 'e', 'q', 'u', 'i', 'r', 'e', 'm', 'e', 'n', 't', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020',
-'\001', 'R', '\n', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'T', 'l', 's', '\022', 'P', '\n', '\020', 'v', 'i', 'r', 't', 'u', 'a', 'l', '_',
-'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l', 'u', 's',
-'t', 'e', 'r', 'R', '\017', 'v', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l', 'u', 's', 't', 'e', 'r', 's', '\022', 'A', '\n', '\013', 'r',
-'a', 't', 'e', '_', 'l', 'i', 'm', 'i', 't', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't',
-'R', '\n', 'r', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 's', '\022', 'g', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h',
-'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\007', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V',
-'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\023', 'r', 'e',
-'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\031', 'r', 'e', 'q', 'u',
-'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\r', ' ', '\003',
-'(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\"', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\026', 'r',
-'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', 'i', '\n', '\027',
-'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\n',
-' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
-'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006',
-'\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o',
-'A', 'd', 'd', '\022', 'O', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't',
-'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\013', ' ', '\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\"', '\n', 'r',
-'\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r',
-'s', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', '5', '\n', '\004', 'c', 'o', 'r', 's', '\030', '\010', ' ', '\001', '(', '\013', '2', '!',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'C', 'o',
-'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\004', 'c', 'o', 'r', 's', '\022', 's', '\n', '\027', 't', 'y', 'p', 'e', 'd', '_', 'p',
-'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\017', ' ', '\003', '(', '\013', '2', '<', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'V', 'i', 'r',
-'t', 'u', 'a', 'l', 'H', 'o', 's', 't', '.', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o',
-'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', 'R', '\024', 't', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r',
-'C', 'o', 'n', 'f', 'i', 'g', '\022', 'A', '\n', '\035', 'i', 'n', 'c', 'l', 'u', 'd', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't',
-'_', 'a', 't', 't', 'e', 'm', 'p', 't', '_', 'c', 'o', 'u', 'n', 't', '\030', '\016', ' ', '\001', '(', '\010', 'R', '\032', 'i', 'n', 'c',
-'l', 'u', 'd', 'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'A', 't', 't', 'e', 'm', 'p', 't', 'C', 'o', 'u', 'n', 't', '\022', 'H',
-'\n', '!', 'i', 'n', 'c', 'l', 'u', 'd', 'e', '_', 'a', 't', 't', 'e', 'm', 'p', 't', '_', 'c', 'o', 'u', 'n', 't', '_', 'i',
-'n', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '\030', '\023', ' ', '\001', '(', '\010', 'R', '\035', 'i', 'n', 'c', 'l', 'u', 'd', 'e',
-'A', 't', 't', 'e', 'm', 'p', 't', 'C', 'o', 'u', 'n', 't', 'I', 'n', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\022', 'E', '\n',
-'\014', 'r', 'e', 't', 'r', 'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\020', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P',
-'o', 'l', 'i', 'c', 'y', 'R', '\013', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\031', 'r', 'e', 't',
-'r', 'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '_', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\024', ' ',
-'\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y',
-'R', '\026', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'T', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022',
-'E', '\n', '\014', 'h', 'e', 'd', 'g', 'e', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\021', ' ', '\001', '(', '\013', '2', '\"', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'd', 'g',
-'e', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'h', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '`', '\n', '\036', 'p',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036',
+'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.',
+'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/',
+'d', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a',
+'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.',
+'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v',
+'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\324', '\014', '\n', '\013', 'V', 'i', 'r', 't', 'u',
+'a', 'l', 'H', 'o', 's', 't', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
+'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', ',', '\n', '\007', 'd', 'o', 'm', 'a', 'i', 'n', 's', '\030', '\002', ' ', '\003',
+'(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\010', '\001', '\"', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\007', 'd',
+'o', 'm', 'a', 'i', 'n', 's', '\022', '4', '\n', '\006', 'r', 'o', 'u', 't', 'e', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\034', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u',
+'t', 'e', 'R', '\006', 'r', 'o', 'u', 't', 'e', 's', '\022', '`', '\n', '\013', 'r', 'e', 'q', 'u', 'i', 'r', 'e', '_', 't', 'l', 's',
+'\030', '\004', ' ', '\001', '(', '\016', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u',
+'t', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', '.', 'T', 'l', 's', 'R', 'e', 'q', 'u',
+'i', 'r', 'e', 'm', 'e', 'n', 't', 'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\n', 'r', 'e',
+'q', 'u', 'i', 'r', 'e', 'T', 'l', 's', '\022', 'P', '\n', '\020', 'v', 'i', 'r', 't', 'u', 'a', 'l', '_', 'c', 'l', 'u', 's', 't',
+'e', 'r', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l', 'u', 's', 't', 'e', 'r', 'R', '\017',
+'v', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l', 'u', 's', 't', 'e', 'r', 's', '\022', 'A', '\n', '\013', 'r', 'a', 't', 'e', '_', 'l',
+'i', 'm', 'i', 't', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'R', '\n', 'r', 'a', 't',
+'e', 'L', 'i', 'm', 'i', 't', 's', '\022', 'g', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r',
+'s', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\007', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O',
+'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't',
+'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\031', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h',
+'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\r', ' ', '\003', '(', '\t', 'B', '\022', '\372',
+'B', '\017', '\222', '\001', '\014', '\"', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\026', 'r', 'e', 'q', 'u', 'e', 's',
+'t', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', 'i', '\n', '\027', 'r', 'e', 's', 'p', 'o',
+'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\n', ' ', '\003', '(', '\013', '2',
+'\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e',
+'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350',
+'\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'O',
+'\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm',
+'o', 'v', 'e', '\030', '\013', ' ', '\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\"', '\n', 'r', '\010', '\020', '\001', '\300', '\001',
+'\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e',
+'m', 'o', 'v', 'e', '\022', '5', '\n', '\004', 'c', 'o', 'r', 's', '\030', '\010', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'C', 'o', 'r', 's', 'P', 'o', 'l',
+'i', 'c', 'y', 'R', '\004', 'c', 'o', 'r', 's', '\022', 's', '\n', '\027', 't', 'y', 'p', 'e', 'd', '_', 'p', 'e', 'r', '_', 'f', 'i',
+'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\017', ' ', '\003', '(', '\013', '2', '<', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H',
+'o', 's', 't', '.', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E',
+'n', 't', 'r', 'y', 'R', '\024', 't', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i',
+'g', '\022', 'A', '\n', '\035', 'i', 'n', 'c', 'l', 'u', 'd', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'a', 't', 't', 'e',
+'m', 'p', 't', '_', 'c', 'o', 'u', 'n', 't', '\030', '\016', ' ', '\001', '(', '\010', 'R', '\032', 'i', 'n', 'c', 'l', 'u', 'd', 'e', 'R',
+'e', 'q', 'u', 'e', 's', 't', 'A', 't', 't', 'e', 'm', 'p', 't', 'C', 'o', 'u', 'n', 't', '\022', 'H', '\n', '!', 'i', 'n', 'c',
+'l', 'u', 'd', 'e', '_', 'a', 't', 't', 'e', 'm', 'p', 't', '_', 'c', 'o', 'u', 'n', 't', '_', 'i', 'n', '_', 'r', 'e', 's',
+'p', 'o', 'n', 's', 'e', '\030', '\023', ' ', '\001', '(', '\010', 'R', '\035', 'i', 'n', 'c', 'l', 'u', 'd', 'e', 'A', 't', 't', 'e', 'm',
+'p', 't', 'C', 'o', 'u', 'n', 't', 'I', 'n', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\022', 'E', '\n', '\014', 'r', 'e', 't', 'r',
+'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\020', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y',
+'R', '\013', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\031', 'r', 'e', 't', 'r', 'y', '_', 'p', 'o',
+'l', 'i', 'c', 'y', '_', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\024', ' ', '\001', '(', '\013', '2', '\024',
+'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\026', 'r', 'e', 't',
+'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'T', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'E', '\n', '\014', 'h', 'e',
+'d', 'g', 'e', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\021', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i',
+'c', 'y', 'R', '\013', 'h', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '`', '\n', '\036', 'p', 'e', 'r', '_', 'r', 'e',
+'q', 'u', 'e', 's', 't', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i', 't', '_', 'b', 'y', 't', 'e', 's', '\030',
+'\022', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U',
+'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\032', 'p', 'e', 'r', 'R', 'e', 'q', 'u', 'e', 's', 't', 'B', 'u', 'f',
+'f', 'e', 'r', 'L', 'i', 'm', 'i', 't', 'B', 'y', 't', 'e', 's', '\032', ']', '\n', '\031', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r',
+'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030',
+'\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013',
+'2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v',
+'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', ':', '\n', '\022', 'T', 'l', 's', 'R', 'e', 'q', 'u', 'i', 'r', 'e', 'm', 'e', 'n',
+'t', 'T', 'y', 'p', 'e', '\022', '\010', '\n', '\004', 'N', 'O', 'N', 'E', '\020', '\000', '\022', '\021', '\n', '\r', 'E', 'X', 'T', 'E', 'R', 'N',
+'A', 'L', '_', 'O', 'N', 'L', 'Y', '\020', '\001', '\022', '\007', '\n', '\003', 'A', 'L', 'L', '\020', '\002', ':', '%', '\232', '\305', '\210', '\036', ' ',
+'\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'V', 'i', 'r', 't',
+'u', 'a', 'l', 'H', 'o', 's', 't', 'J', '\004', '\010', '\t', '\020', '\n', 'J', '\004', '\010', '\014', '\020', '\r', 'R', '\021', 'p', 'e', 'r', '_',
+'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\"', 'd', '\n', '\014', 'F', 'i', 'l', 't', 'e', 'r', 'A', 'c',
+'t', 'i', 'o', 'n', '\022', ',', '\n', '\006', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\006', 'a', 'c', 't', 'i', 'o', 'n',
+':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u',
+'t', 'e', '.', 'F', 'i', 'l', 't', 'e', 'r', 'A', 'c', 't', 'i', 'o', 'n', '\"', '\254', '\n', '\n', '\005', 'R', 'o', 'u', 't', 'e',
+'\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\016', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'A', '\n', '\005', 'm',
+'a', 't', 'c', 'h', '\030', '\001', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'B', '\010', '\372', 'B', '\005',
+'\212', '\001', '\002', '\020', '\001', 'R', '\005', 'm', 'a', 't', 'c', 'h', '\022', ':', '\n', '\005', 'r', 'o', 'u', 't', 'e', '\030', '\002', ' ', '\001',
+'(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
+'3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\005', 'r', 'o', 'u', 't', 'e', '\022', 'C', '\n',
+'\010', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c',
+'t', 'i', 'o', 'n', 'H', '\000', 'R', '\010', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', 'V', '\n', '\017', 'd', 'i', 'r', 'e', 'c',
+'t', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '\030', '\007', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'D', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's',
+'p', 'o', 'n', 's', 'e', 'A', 'c', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\016', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p',
+'o', 'n', 's', 'e', '\022', 'J', '\n', '\r', 'f', 'i', 'l', 't', 'e', 'r', '_', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\021', ' ', '\001',
+'(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
+'3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'A', 'c', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\014', 'f', 'i', 'l', 't', 'e', 'r', 'A',
+'c', 't', 'i', 'o', 'n', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\004', ' ', '\001', '(', '\013', '2', '\036',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't',
+'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '>', '\n', '\t', 'd', 'e', 'c', 'o', 'r', 'a',
+'t', 'o', 'r', '\030', '\005', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', 'R', '\t', 'd', 'e', 'c', 'o', 'r',
+'a', 't', 'o', 'r', '\022', 'm', '\n', '\027', 't', 'y', 'p', 'e', 'd', '_', 'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_',
+'c', 'o', 'n', 'f', 'i', 'g', '\030', '\r', ' ', '\003', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', '.', 'T', 'y', 'p', 'e', 'd', 'P', 'e',
+'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', 'R', '\024', 't', 'y', 'p', 'e', 'd',
+'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'g', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's',
+'t', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\t', ' ', '\003', '(', '\013', '2', '\'', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd',
+'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R',
+'\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\031', 'r',
+'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030',
+'\014', ' ', '\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\"', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000',
+'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022',
+'i', '\n', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd',
+'d', '\030', '\n', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t',
+'\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r',
+'s', 'T', 'o', 'A', 'd', 'd', '\022', 'O', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r',
+'s', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\013', ' ', '\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014',
+'\"', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e', 'a',
+'d', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', '8', '\n', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\030', '\017',
+' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'R', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\022', '`', '\n', '\036', 'p',
'e', 'r', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i', 'm', 'i', 't', '_', 'b',
-'y', 't', 'e', 's', '\030', '\022', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'y', 't', 'e', 's', '\030', '\020', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\032', 'p', 'e', 'r', 'R', 'e', 'q', 'u', 'e',
's', 't', 'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i', 'm', 'i', 't', 'B', 'y', 't', 'e', 's', '\032', ']', '\n', '\031', 'T', 'y', 'p',
'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n',
'\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030',
'\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A',
-'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', ':', '\n', '\022', 'T', 'l', 's', 'R', 'e', 'q', 'u', 'i',
-'r', 'e', 'm', 'e', 'n', 't', 'T', 'y', 'p', 'e', '\022', '\010', '\n', '\004', 'N', 'O', 'N', 'E', '\020', '\000', '\022', '\021', '\n', '\r', 'E',
-'X', 'T', 'E', 'R', 'N', 'A', 'L', '_', 'O', 'N', 'L', 'Y', '\020', '\001', '\022', '\007', '\n', '\003', 'A', 'L', 'L', '\020', '\002', ':', '%',
-'\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
-'.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', 'J', '\004', '\010', '\t', '\020', '\n', 'J', '\004', '\010', '\014', '\020', '\r', 'R',
-'\021', 'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\"', 'd', '\n', '\014', 'F', 'i', 'l',
-'t', 'e', 'r', 'A', 'c', 't', 'i', 'o', 'n', '\022', ',', '\n', '\006', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013',
-'2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\006', 'a',
-'c', 't', 'i', 'o', 'n', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
-'2', '.', 'r', 'o', 'u', 't', 'e', '.', 'F', 'i', 'l', 't', 'e', 'r', 'A', 'c', 't', 'i', 'o', 'n', '\"', '\254', '\n', '\n', '\005',
-'R', 'o', 'u', 't', 'e', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\016', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e',
-'\022', 'A', '\n', '\005', 'm', 'a', 't', 'c', 'h', '\030', '\001', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h',
-'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\005', 'm', 'a', 't', 'c', 'h', '\022', ':', '\n', '\005', 'r', 'o', 'u', 't',
-'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o',
-'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\005', 'r', 'o', 'u',
-'t', 'e', '\022', 'C', '\n', '\010', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '%', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 'd', 'i', 'r',
-'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\010', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', 'V', '\n', '\017',
-'d', 'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '\030', '\007', ' ', '\001', '(', '\013', '2', '+', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'D', 'i', 'r', 'e',
-'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'A', 'c', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\016', 'd', 'i', 'r', 'e', 'c',
-'t', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\022', 'J', '\n', '\r', 'f', 'i', 'l', 't', 'e', 'r', '_', 'a', 'c', 't', 'i', 'o',
-'n', '\030', '\021', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o',
-'u', 't', 'e', '.', 'v', '3', '.', 'F', 'i', 'l', 't', 'e', 'r', 'A', 'c', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\014', 'f', 'i',
-'l', 't', 'e', 'r', 'A', 'c', 't', 'i', 'o', 'n', '\022', ':', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\004', ' ',
-'\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', '>', '\n', '\t', 'd',
-'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', '\030', '\005', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', 'R', '\t',
-'d', 'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', '\022', 'm', '\n', '\027', 't', 'y', 'p', 'e', 'd', '_', 'p', 'e', 'r', '_', 'f', 'i',
-'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\r', ' ', '\003', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', '.', 'T', 'y',
-'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', 'R', '\024',
-'t', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'g', '\n', '\026', 'r',
-'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\t', ' ', '\003',
-'(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
-'.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001',
-'\003', '\020', '\350', '\007', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd',
-'\022', 'M', '\n', '\031', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e',
-'m', 'o', 'v', 'e', '\030', '\014', ' ', '\003', '(', '\t', 'B', '\022', '\372', 'B', '\017', '\222', '\001', '\014', '\"', '\n', 'r', '\010', '\020', '\001', '\300',
-'\001', '\001', '\310', '\001', '\000', 'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e',
-'m', 'o', 'v', 'e', '\022', 'i', '\n', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_',
-'t', 'o', '_', 'a', 'd', 'd', '\030', '\n', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't',
-'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H',
-'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'O', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h',
-'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\013', ' ', '\003', '(', '\t', 'B', '\022', '\372',
-'B', '\017', '\222', '\001', '\014', '\"', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n',
-'s', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', '8', '\n', '\007', 't', 'r', 'a', 'c',
-'i', 'n', 'g', '\030', '\017', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'R', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g',
-'\022', '`', '\n', '\036', 'p', 'e', 'r', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'b', 'u', 'f', 'f', 'e', 'r', '_', 'l', 'i',
-'m', 'i', 't', '_', 'b', 'y', 't', 'e', 's', '\030', '\020', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\032', 'p', 'e', 'r',
-'R', 'e', 'q', 'u', 'e', 's', 't', 'B', 'u', 'f', 'f', 'e', 'r', 'L', 'i', 'm', 'i', 't', 'B', 'y', 't', 'e', 's', '\032', ']',
-'\n', '\031', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n', 't',
-'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n', '\005', 'v',
-'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '\037', '\232', '\305', '\210', '\036', '\032',
-'\n', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't',
-'e', 'B', '\r', '\n', '\006', 'a', 'c', 't', 'i', 'o', 'n', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\006', '\020', '\007', 'J', '\004', '\010',
-'\010', '\020', '\t', 'R', '\021', 'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\353', '\010',
-'\n', '\017', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'Z', '\n', '\010', 'c', 'l', 'u', 's',
-'t', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r',
-'.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g', 'h', 't', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R',
-'\010', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\022', 'H', '\n', '\014', 't', 'o', 't', 'a', 'l', '_', 'w', 'e', 'i', 'g', 'h', 't',
-'\030', '\003', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\013', 't', 'o', 't',
-'a', 'l', 'W', 'e', 'i', 'g', 'h', 't', '\022', ',', '\n', '\022', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '_', 'p',
-'r', 'e', 'f', 'i', 'x', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', 'P', 'r',
-'e', 'f', 'i', 'x', '\032', '\330', '\006', '\n', '\r', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g', 'h', 't', '\022', '\033', '\n',
-'\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm',
-'e', '\022', '4', '\n', '\006', 'w', 'e', 'i', 'g', 'h', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\006', 'w',
-'e', 'i', 'g', 'h', 't', '\022', 'E', '\n', '\016', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'm', 'a', 't', 'c', 'h', '\030', '\003',
-' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
-'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\r', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c',
-'h', '\022', 'g', '\n', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a',
-'d', 'd', '\030', '\004', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
-'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B',
-'\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r',
-'s', 'T', 'o', 'A', 'd', 'd', '\022', 'K', '\n', '\031', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's',
-'_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\t', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"',
-'\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's',
-'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', 'i', '\n', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd',
-'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\005', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u',
-'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o',
-'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n',
-'s', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\006', ' ', '\003', '(',
-'\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p',
-'o', 'n', 's', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', '\205', '\001', '\n', '\027', 't',
-'y', 'p', 'e', 'd', '_', 'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\n', ' ',
-'\003', '(', '\013', '2', 'N', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
-'v', '3', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e',
-'r', 'W', 'e', 'i', 'g', 'h', 't', '.', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n',
-'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', 'R', '\024', 't', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C',
-'o', 'n', 'f', 'i', 'g', '\032', ']', '\n', '\031', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o',
-'n', 'f', 'i', 'g', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k',
-'e', 'y', '\022', '*', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001',
-':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u',
-'t', 'e', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e',
-'r', 'W', 'e', 'i', 'g', 'h', 't', 'J', '\004', '\010', '\007', '\020', '\010', 'J', '\004', '\010', '\010', '\020', '\t', 'R', '\021', 'p', 'e', 'r', '_',
-'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C',
-'l', 'u', 's', 't', 'e', 'r', '\"', '\313', '\010', '\n', '\n', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '\022', '\030', '\n', '\006',
-'p', 'r', 'e', 'f', 'i', 'x', '\030', '\001', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\022', '\024', '\n',
-'\004', 'p', 'a', 't', 'h', '\030', '\002', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\004', 'p', 'a', 't', 'h', '\022', 'N', '\n', '\n', 's', 'a',
-'f', 'e', '_', 'r', 'e', 'g', 'e', 'x', '\030', '\n', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
-'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e',
-'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\t', 's', 'a', 'f', 'e', 'R', 'e', 'g', 'e', 'x', '\022',
-'[', '\n', '\017', 'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\030', '\014', ' ', '\001', '(', '\013', '2',
-'0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R',
-'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H',
-'\000', 'R', '\016', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'A', '\n', '\016', 'c', 'a', 's', 'e',
-'_', 's', 'e', 'n', 's', 'i', 't', 'i', 'v', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\r', 'c', 'a', 's', 'e',
-'S', 'e', 'n', 's', 'i', 't', 'i', 'v', 'e', '\022', 'Y', '\n', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'f', 'r', 'a', 'c',
-'t', 'i', 'o', 'n', '\030', '\t', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a',
-'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n',
-'\022', '>', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a',
-'t', 'c', 'h', 'e', 'r', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'W', '\n', '\020', 'q', 'u', 'e', 'r', 'y', '_', 'p',
-'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\030', '\007', ' ', '\003', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm',
-'e', 't', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\017', 'q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't',
-'e', 'r', 's', '\022', 'K', '\n', '\004', 'g', 'r', 'p', 'c', '\030', '\010', ' ', '\001', '(', '\013', '2', '7', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't',
-'c', 'h', '.', 'G', 'r', 'p', 'c', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R',
-'\004', 'g', 'r', 'p', 'c', '\022', 'Y', '\n', '\013', 't', 'l', 's', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\013', ' ', '\001', '(',
-'\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
-'.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't',
-'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\n', 't', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\032', 'S', '\n', '\025',
-'G', 'r', 'p', 'c', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', ':', '\232', '\305',
-'\210', '\036', '5', '\n', '3', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R',
-'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'G', 'r', 'p', 'c', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O',
-'p', 't', 'i', 'o', 'n', 's', '\032', '\311', '\001', '\n', '\026', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c',
-'h', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', '8', '\n', '\t', 'p', 'r', 'e', 's', 'e', 'n', 't', 'e', 'd', '\030', '\001', ' ', '\001',
-'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
-'V', 'a', 'l', 'u', 'e', 'R', '\t', 'p', 'r', 'e', 's', 'e', 'n', 't', 'e', 'd', '\022', '8', '\n', '\t', 'v', 'a', 'l', 'i', 'd',
-'a', 't', 'e', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'd', ':',
-';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't',
-'e', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a',
-'t', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', '\032', '\020', '\n', '\016', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c',
-'h', 'e', 'r', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
-'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'B', '\025', '\n', '\016', 'p', 'a', 't', 'h', '_',
-'s', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\005', '\020', '\006', 'J', '\004', '\010', '\003', '\020',
-'\004', 'R', '\005', 'r', 'e', 'g', 'e', 'x', '\"', '\350', '\004', '\n', '\n', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '_',
-'\n', '\031', 'a', 'l', 'l', 'o', 'w', '_', 'o', 'r', 'i', 'g', 'i', 'n', '_', 's', 't', 'r', 'i', 'n', 'g', '_', 'm', 'a', 't',
-'c', 'h', '\030', '\013', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't',
-'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\026', 'a', 'l',
-'l', 'o', 'w', 'O', 'r', 'i', 'g', 'i', 'n', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', '\022', '#', '\n', '\r', 'a',
-'l', 'l', 'o', 'w', '_', 'm', 'e', 't', 'h', 'o', 'd', 's', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\014', 'a', 'l', 'l', 'o', 'w',
-'M', 'e', 't', 'h', 'o', 'd', 's', '\022', '#', '\n', '\r', 'a', 'l', 'l', 'o', 'w', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030',
-'\003', ' ', '\001', '(', '\t', 'R', '\014', 'a', 'l', 'l', 'o', 'w', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '%', '\n', '\016', 'e', 'x',
-'p', 'o', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\r', 'e', 'x', 'p', 'o', 's',
-'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '\027', '\n', '\007', 'm', 'a', 'x', '_', 'a', 'g', 'e', '\030', '\005', ' ', '\001', '(', '\t',
-'R', '\006', 'm', 'a', 'x', 'A', 'g', 'e', '\022', 'G', '\n', '\021', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'r', 'e', 'd', 'e', 'n', 't',
-'i', 'a', 'l', 's', '\030', '\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\020', 'a', 'l', 'l', 'o', 'w', 'C', 'r', 'e', 'd', 'e',
-'n', 't', 'i', 'a', 'l', 's', '\022', 'W', '\n', '\016', 'f', 'i', 'l', 't', 'e', 'r', '_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030',
+'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '\037', '\232', '\305', '\210', '\036', '\032', '\n', '\030', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'B', '\r', '\n', '\006',
+'a', 'c', 't', 'i', 'o', 'n', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\006', '\020', '\007', 'J', '\004', '\010', '\010', '\020', '\t', 'R', '\021',
+'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\353', '\010', '\n', '\017', 'W', 'e', 'i',
+'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'Z', '\n', '\010', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\030',
+'\001', ' ', '\003', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
+'e', '.', 'v', '3', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's',
+'t', 'e', 'r', 'W', 'e', 'i', 'g', 'h', 't', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\010', 'c', 'l', 'u', 's',
+'t', 'e', 'r', 's', '\022', 'H', '\n', '\014', 't', 'o', 't', 'a', 'l', '_', 'w', 'e', 'i', 'g', 'h', 't', '\030', '\003', ' ', '\001', '(',
+'\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3',
+'2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\013', 't', 'o', 't', 'a', 'l', 'W', 'e', 'i',
+'g', 'h', 't', '\022', ',', '\n', '\022', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '_', 'p', 'r', 'e', 'f', 'i', 'x',
+'\030', '\002', ' ', '\001', '(', '\t', 'R', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'K', 'e', 'y', 'P', 'r', 'e', 'f', 'i', 'x', '\032',
+'\330', '\006', '\n', '\r', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g', 'h', 't', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e',
+'\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '4', '\n', '\006',
+'w', 'e', 'i', 'g', 'h', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\006', 'w', 'e', 'i', 'g', 'h', 't',
+'\022', 'E', '\n', '\016', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'm', 'a', 't', 'c', 'h', '\030', '\003', ' ', '\001', '(', '\013', '2',
+'\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e',
+'t', 'a', 'd', 'a', 't', 'a', 'R', '\r', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', '\022', 'g', '\n', '\026',
+'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\004', ' ',
+'\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222',
+'\001', '\003', '\020', '\350', '\007', 'R', '\023', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd',
+'d', '\022', 'K', '\n', '\031', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r',
+'e', 'm', 'o', 'v', 'e', '\030', '\t', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B', '\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001',
+'\001', '\310', '\001', '\000', 'R', '\026', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm',
+'o', 'v', 'e', '\022', 'i', '\n', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't',
+'o', '_', 'a', 'd', 'd', '\030', '\005', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i',
+'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\024', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H', 'e',
+'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\022', 'M', '\n', '\032', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'h', 'e',
+'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'r', 'e', 'm', 'o', 'v', 'e', '\030', '\006', ' ', '\003', '(', '\t', 'B', '\020', '\372', 'B',
+'\r', '\222', '\001', '\n', '\"', '\010', 'r', '\006', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\027', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'H',
+'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'R', 'e', 'm', 'o', 'v', 'e', '\022', '\205', '\001', '\n', '\027', 't', 'y', 'p', 'e', 'd', '_',
+'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e', 'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\n', ' ', '\003', '(', '\013', '2', 'N',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'W', 'e',
+'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g',
+'h', 't', '.', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E', 'n',
+'t', 'r', 'y', 'R', '\024', 't', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g',
+'\032', ']', '\n', '\031', 'T', 'y', 'p', 'e', 'd', 'P', 'e', 'r', 'F', 'i', 'l', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i', 'g', 'E',
+'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '*', '\n',
+'\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', '7', '\232', '\305', '\210',
+'\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'W', 'e',
+'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'W', 'e', 'i', 'g',
+'h', 't', 'J', '\004', '\010', '\007', '\020', '\010', 'J', '\004', '\010', '\010', '\020', '\t', 'R', '\021', 'p', 'e', 'r', '_', 'f', 'i', 'l', 't', 'e',
+'r', '_', 'c', 'o', 'n', 'f', 'i', 'g', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e',
+'r', '\"', '\313', '\010', '\n', '\n', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '\022', '\030', '\n', '\006', 'p', 'r', 'e', 'f', 'i',
+'x', '\030', '\001', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\022', '\024', '\n', '\004', 'p', 'a', 't', 'h',
+'\030', '\002', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\004', 'p', 'a', 't', 'h', '\022', 'N', '\n', '\n', 's', 'a', 'f', 'e', '_', 'r', 'e',
+'g', 'e', 'x', '\030', '\n', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a',
+'t', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B',
+'\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\t', 's', 'a', 'f', 'e', 'R', 'e', 'g', 'e', 'x', '\022', '[', '\n', '\017', 'c', 'o',
+'n', 'n', 'e', 'c', 't', '_', 'm', 'a', 't', 'c', 'h', 'e', 'r', '\030', '\014', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M',
+'a', 't', 'c', 'h', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\016', 'c', 'o',
+'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'A', '\n', '\016', 'c', 'a', 's', 'e', '_', 's', 'e', 'n', 's',
+'i', 't', 'i', 'v', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\r', 'c', 'a', 's', 'e', 'S', 'e', 'n', 's', 'i',
+'t', 'i', 'v', 'e', '\022', 'Y', '\n', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'f', 'r', 'a', 'c', 't', 'i', 'o', 'n', '\030',
'\t', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
'.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c',
-'e', 'n', 't', 'H', '\000', 'R', '\r', 'f', 'i', 'l', 't', 'e', 'r', 'E', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'U', '\n', '\016', 's',
-'h', 'a', 'd', 'o', 'w', '_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\n', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e',
-'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\r', 's', 'h', 'a', 'd', 'o', 'w',
-'E', 'n', 'a', 'b', 'l', 'e', 'd', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
-'.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\023', '\n', '\021', 'e',
-'n', 'a', 'b', 'l', 'e', 'd', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010',
-'\010', '\020', '\t', 'J', '\004', '\010', '\007', '\020', '\010', 'R', '\014', 'a', 'l', 'l', 'o', 'w', '_', 'o', 'r', 'i', 'g', 'i', 'n', 'R', '\022',
-'a', 'l', 'l', 'o', 'w', '_', 'o', 'r', 'i', 'g', 'i', 'n', '_', 'r', 'e', 'g', 'e', 'x', 'R', '\007', 'e', 'n', 'a', 'b', 'l',
-'e', 'd', '\"', '\236', '&', '\n', '\013', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '\022', '#', '\n', '\007', 'c', 'l', 'u',
-'s', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\007', 'c', 'l',
-'u', 's', 't', 'e', 'r', '\022', '6', '\n', '\016', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\002',
-' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'H', '\000', 'R', '\r', 'c', 'l',
-'u', 's', 't', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', '\022', 'U', '\n', '\021', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', '_', 'c',
-'l', 'u', 's', 't', 'e', 'r', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's',
-'t', 'e', 'r', 'H', '\000', 'R', '\020', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', 's', '\022', '\216',
-'\001', '\n', '\037', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'n', 'o', 't', '_', 'f', 'o', 'u', 'n', 'd', '_', 'r', 'e', 's', 'p',
-'o', 'n', 's', 'e', '_', 'c', 'o', 'd', 'e', '\030', '\024', ' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o',
-'n', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e',
-'C', 'o', 'd', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\033', 'c', 'l', 'u', 's', 't', 'e', 'r', 'N', 'o',
-'t', 'F', 'o', 'u', 'n', 'd', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', 'E', '\n', '\016', 'm', 'e', 't',
-'a', 'd', 'a', 't', 'a', '_', 'm', 'a', 't', 'c', 'h', '\030', '\004', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R',
-'\r', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', '\022', '2', '\n', '\016', 'p', 'r', 'e', 'f', 'i', 'x', '_',
-'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001',
-'\000', 'R', '\r', 'p', 'r', 'e', 'f', 'i', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', 'S', '\n', '\r', 'r', 'e', 'g', 'e', 'x',
-'_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', ' ', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
-'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A',
-'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'e', 'R', '\014', 'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't',
-'e', '\022', '?', '\n', '\024', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 'l', 'i', 't', 'e', 'r', 'a', 'l',
-'\030', '\006', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\022', 'h', 'o',
-'s', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', 'L', 'i', 't', 'e', 'r', 'a', 'l', '\022', 'H', '\n', '\021', 'a', 'u', 't', 'o', '_',
-'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'H', '\001', 'R', '\017',
-'a', 'u', 't', 'o', 'H', 'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', '=', '\n', '\023', 'h', 'o', 's', 't', '_', 'r',
-'e', 'w', 'r', 'i', 't', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\035', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r',
-'\006', '\300', '\001', '\001', '\310', '\001', '\000', 'H', '\001', 'R', '\021', 'h', 'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', 'H', 'e', 'a',
-'d', 'e', 'r', '\022', 'g', '\n', '\027', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 'p', 'a', 't', 'h', '_',
-'r', 'e', 'g', 'e', 'x', '\030', '#', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.',
-'m', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S',
-'u', 'b', 's', 't', 'i', 't', 'u', 't', 'e', 'H', '\001', 'R', '\024', 'h', 'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', 'P',
-'a', 't', 'h', 'R', 'e', 'g', 'e', 'x', '\022', '3', '\n', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\010', ' ', '\001', '(', '\013',
-'2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i',
-'o', 'n', 'R', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\022', '<', '\n', '\014', 'i', 'd', 'l', 'e', '_', 't', 'i', 'm', 'e', 'o',
-'u', 't', '\030', '\030', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\013', 'i', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'E',
-'\n', '\014', 'r', 'e', 't', 'r', 'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\t', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y',
-'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\031', 'r', 'e',
-'t', 'r', 'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '_', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '!',
-' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n',
-'y', 'R', '\026', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'T', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g',
-'\022', 'n', '\n', '\027', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'm', 'i', 'r', 'r', 'o', 'r', '_', 'p', 'o', 'l', 'i', 'c', 'i',
-'e', 's', '\030', '\036', ' ', '\003', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r',
-'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e',
-'s', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i',
-'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\022', 'K', '\n', '\010', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\030',
-'\013', ' ', '\001', '(', '\016', '2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
-'.', 'v', '3', '.', 'R', 'o', 'u', 't', 'i', 'n', 'g', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'B', '\010', '\372', 'B', '\005', '\202',
-'\001', '\002', '\020', '\001', 'R', '\010', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', 'A', '\n', '\013', 'r', 'a', 't', 'e', '_', 'l', 'i',
-'m', 'i', 't', 's', '\030', '\r', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'R', '\n', 'r', 'a', 't', 'e',
-'L', 'i', 'm', 'i', 't', 's', '\022', 'S', '\n', '\026', 'i', 'n', 'c', 'l', 'u', 'd', 'e', '_', 'v', 'h', '_', 'r', 'a', 't', 'e',
-'_', 'l', 'i', 'm', 'i', 't', 's', '\030', '\016', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\002', '\030', '\001', 'R', '\023', 'i', 'n', 'c',
-'l', 'u', 'd', 'e', 'V', 'h', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 's', '\022', 'N', '\n', '\013', 'h', 'a', 's', 'h', '_',
-'p', 'o', 'l', 'i', 'c', 'y', '\030', '\017', ' ', '\003', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H',
-'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\n', 'h', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '5', '\n', '\004',
-'c', 'o', 'r', 's', '\030', '\021', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\004', 'c', 'o', 'r',
-'s', '\022', 'C', '\n', '\020', 'm', 'a', 'x', '_', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\027', ' ', '\001',
-'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a',
-'t', 'i', 'o', 'n', 'R', '\016', 'm', 'a', 'x', 'G', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'I', '\n', '\023', 'g',
-'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'o', 'f', 'f', 's', 'e', 't', '\030', '\034', ' ', '\001', '(', '\013', '2',
-'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
-'n', 'R', '\021', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'O', 'f', 'f', 's', 'e', 't', '\022', 'Y', '\n', '\017', 'u',
-'p', 'g', 'r', 'a', 'd', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\031', ' ', '\003', '(', '\013', '2', '0', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e',
-'A', 'c', 't', 'i', 'o', 'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u', 'p', 'g',
-'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 's', '\022', 'g', '\n', '\030', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '_', 'r',
-'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\"', ' ', '\001', '(', '\013', '2', '-', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'I', 'n', 't', 'e', 'r',
-'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\026', 'i', 'n', 't', 'e', 'r', 'n',
-'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'w', '\n', '\030', 'i', 'n', 't', 'e', 'r',
-'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\032', ' ', '\001', '(', '\016',
-'2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
-'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r',
-'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\002', '\030', '\001', 'R', '\026', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e',
-'d', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', '\022', 'V', '\n', '\026', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r',
-'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's', '\030', '\037', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o',
-'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B',
-'\002', '\030', '\001', 'R', '\024', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's',
-'\022', 'E', '\n', '\014', 'h', 'e', 'd', 'g', 'e', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\033', ' ', '\001', '(', '\013', '2', '\"', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'd',
-'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'h', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'd', '\n', '\023',
-'m', 'a', 'x', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '$', ' ', '\001', '(', '\013',
+'e', 'n', 't', 'R', '\017', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', '\022', '>', '\n', '\007', 'h',
+'e', 'a', 'd', 'e', 'r', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r',
+'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'W', '\n', '\020', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r', 'a', 'm', 'e',
+'t', 'e', 'r', 's', '\030', '\007', ' ', '\003', '(', '\013', '2', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 'M',
+'a', 't', 'c', 'h', 'e', 'r', 'R', '\017', 'q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022', 'K',
+'\n', '\004', 'g', 'r', 'p', 'c', '\030', '\010', ' ', '\001', '(', '\013', '2', '7', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', '.', 'G', 'r',
+'p', 'c', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', 'R', '\004', 'g', 'r', 'p', 'c',
+'\022', 'Y', '\n', '\013', 't', 'l', 's', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\013', ' ', '\001', '(', '\013', '2', '8', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't',
+'e', 'M', 'a', 't', 'c', 'h', '.', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't',
+'i', 'o', 'n', 's', 'R', '\n', 't', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\032', 'S', '\n', '\025', 'G', 'r', 'p', 'c', 'R',
+'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n', 's', ':', ':', '\232', '\305', '\210', '\036', '5', '\n', '3',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'M',
+'a', 't', 'c', 'h', '.', 'G', 'r', 'p', 'c', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i', 'o', 'n',
+'s', '\032', '\311', '\001', '\n', '\026', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c', 'h', 'O', 'p', 't', 'i',
+'o', 'n', 's', '\022', '8', '\n', '\t', 'p', 'r', 'e', 's', 'e', 'n', 't', 'e', 'd', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e',
+'R', '\t', 'p', 'r', 'e', 's', 'e', 'n', 't', 'e', 'd', '\022', '8', '\n', '\t', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'd', '\030',
+'\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B',
+'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'd', ':', ';', '\232', '\305', '\210', '\036',
+'6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u',
+'t', 'e', 'M', 'a', 't', 'c', 'h', '.', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'M', 'a', 't', 'c', 'h', 'O', 'p',
+'t', 'i', 'o', 'n', 's', '\032', '\020', '\n', '\016', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', 'e', 'r', ':', '$',
+'\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'R', 'o', 'u', 't', 'e', 'M', 'a', 't', 'c', 'h', 'B', '\025', '\n', '\016', 'p', 'a', 't', 'h', '_', 's', 'p', 'e', 'c', 'i',
+'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\005', '\020', '\006', 'J', '\004', '\010', '\003', '\020', '\004', 'R', '\005', 'r', 'e',
+'g', 'e', 'x', '\"', '\350', '\004', '\n', '\n', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '_', '\n', '\031', 'a', 'l', 'l',
+'o', 'w', '_', 'o', 'r', 'i', 'g', 'i', 'n', '_', 's', 't', 'r', 'i', 'n', 'g', '_', 'm', 'a', 't', 'c', 'h', '\030', '\013', ' ',
+'\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.',
+'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\026', 'a', 'l', 'l', 'o', 'w', 'O', 'r',
+'i', 'g', 'i', 'n', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', '\022', '#', '\n', '\r', 'a', 'l', 'l', 'o', 'w', '_',
+'m', 'e', 't', 'h', 'o', 'd', 's', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\014', 'a', 'l', 'l', 'o', 'w', 'M', 'e', 't', 'h', 'o',
+'d', 's', '\022', '#', '\n', '\r', 'a', 'l', 'l', 'o', 'w', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\001', '(', '\t',
+'R', '\014', 'a', 'l', 'l', 'o', 'w', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '%', '\n', '\016', 'e', 'x', 'p', 'o', 's', 'e', '_',
+'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\r', 'e', 'x', 'p', 'o', 's', 'e', 'H', 'e', 'a', 'd',
+'e', 'r', 's', '\022', '\027', '\n', '\007', 'm', 'a', 'x', '_', 'a', 'g', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'R', '\006', 'm', 'a', 'x',
+'A', 'g', 'e', '\022', 'G', '\n', '\021', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'r', 'e', 'd', 'e', 'n', 't', 'i', 'a', 'l', 's', '\030',
+'\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B',
+'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\020', 'a', 'l', 'l', 'o', 'w', 'C', 'r', 'e', 'd', 'e', 'n', 't', 'i', 'a', 'l',
+'s', '\022', 'W', '\n', '\016', 'f', 'i', 'l', 't', 'e', 'r', '_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\t', ' ', '\001', '(', '\013',
+'2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R',
+'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'H', '\000',
+'R', '\r', 'f', 'i', 'l', 't', 'e', 'r', 'E', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'U', '\n', '\016', 's', 'h', 'a', 'd', 'o', 'w',
+'_', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\n', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't',
+'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\r', 's', 'h', 'a', 'd', 'o', 'w', 'E', 'n', 'a', 'b', 'l',
+'e', 'd', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r',
+'o', 'u', 't', 'e', '.', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\023', '\n', '\021', 'e', 'n', 'a', 'b', 'l', 'e',
+'d', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\010', '\020', '\t', 'J', '\004',
+'\010', '\007', '\020', '\010', 'R', '\014', 'a', 'l', 'l', 'o', 'w', '_', 'o', 'r', 'i', 'g', 'i', 'n', 'R', '\022', 'a', 'l', 'l', 'o', 'w',
+'_', 'o', 'r', 'i', 'g', 'i', 'n', '_', 'r', 'e', 'g', 'e', 'x', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\"', '\310', '&',
+'\n', '\013', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '\022', '#', '\n', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030',
+'\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r',
+'\022', '6', '\n', '\016', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\t', 'B',
+'\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'H', '\000', 'R', '\r', 'c', 'l', 'u', 's', 't', 'e', 'r',
+'H', 'e', 'a', 'd', 'e', 'r', '\022', 'U', '\n', '\021', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', '_', 'c', 'l', 'u', 's', 't', 'e',
+'r', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r',
+'o', 'u', 't', 'e', '.', 'v', '3', '.', 'W', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', 'H', '\000',
+'R', '\020', 'w', 'e', 'i', 'g', 'h', 't', 'e', 'd', 'C', 'l', 'u', 's', 't', 'e', 'r', 's', '\022', '\216', '\001', '\n', '\037', 'c', 'l',
+'u', 's', 't', 'e', 'r', '_', 'n', 'o', 't', '_', 'f', 'o', 'u', 'n', 'd', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_',
+'c', 'o', 'd', 'e', '\030', '\024', ' ', '\001', '(', '\016', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'C', 'l', 'u',
+'s', 't', 'e', 'r', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', 'B',
+'\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\033', 'c', 'l', 'u', 's', 't', 'e', 'r', 'N', 'o', 't', 'F', 'o', 'u', 'n',
+'d', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', 'E', '\n', '\016', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a',
+'_', 'm', 'a', 't', 'c', 'h', '\030', '\004', ' ', '\001', '(', '\013', '2', '\036', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'R', '\r', 'm', 'e', 't', 'a',
+'d', 'a', 't', 'a', 'M', 'a', 't', 'c', 'h', '\022', '2', '\n', '\016', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'e', 'w', 'r', 'i',
+'t', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\r', 'p', 'r',
+'e', 'f', 'i', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', 'S', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r',
+'i', 't', 'e', '\030', ' ', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a',
+'t', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b',
+'s', 't', 'i', 't', 'u', 't', 'e', 'R', '\014', 'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', '?', '\n', '\024',
+'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 'l', 'i', 't', 'e', 'r', 'a', 'l', '\030', '\006', ' ', '\001', '(',
+'\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\022', 'h', 'o', 's', 't', 'R', 'e', 'w',
+'r', 'i', 't', 'e', 'L', 'i', 't', 'e', 'r', 'a', 'l', '\022', 'H', '\n', '\021', 'a', 'u', 't', 'o', '_', 'h', 'o', 's', 't', '_',
+'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\007', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'H', '\001', 'R', '\017', 'a', 'u', 't', 'o', 'H',
+'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', '=', '\n', '\023', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't',
+'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\035', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\001', '\310',
+'\001', '\000', 'H', '\001', 'R', '\021', 'h', 'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', 'H', 'e', 'a', 'd', 'e', 'r', '\022', 'g',
+'\n', '\027', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 'p', 'a', 't', 'h', '_', 'r', 'e', 'g', 'e', 'x',
+'\030', '#', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h',
+'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i',
+'t', 'u', 't', 'e', 'H', '\001', 'R', '\024', 'h', 'o', 's', 't', 'R', 'e', 'w', 'r', 'i', 't', 'e', 'P', 'a', 't', 'h', 'R', 'e',
+'g', 'e', 'x', '\022', '3', '\n', '\007', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\010', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\007', 't',
+'i', 'm', 'e', 'o', 'u', 't', '\022', '<', '\n', '\014', 'i', 'd', 'l', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\030', ' ',
+'\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r',
+'a', 't', 'i', 'o', 'n', 'R', '\013', 'i', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'E', '\n', '\014', 'r', 'e', 't',
+'r', 'y', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\t', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c',
+'y', 'R', '\013', 'r', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'O', '\n', '\031', 'r', 'e', 't', 'r', 'y', '_', 'p',
+'o', 'l', 'i', 'c', 'y', '_', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '!', ' ', '\001', '(', '\013', '2',
+'\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\026', 'r', 'e',
+'t', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', 'T', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'n', '\n', '\027', 'r',
+'e', 'q', 'u', 'e', 's', 't', '_', 'm', 'i', 'r', 'r', 'o', 'r', '_', 'p', 'o', 'l', 'i', 'c', 'i', 'e', 's', '\030', '\036', ' ',
+'\003', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
+'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r',
+'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P',
+'o', 'l', 'i', 'c', 'i', 'e', 's', '\022', 'K', '\n', '\010', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\030', '\013', ' ', '\001', '(', '\016',
+'2', '%', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R',
+'o', 'u', 't', 'i', 'n', 'g', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R',
+'\010', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', 'A', '\n', '\013', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i', 't', 's', '\030',
+'\r', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
+'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'R', '\n', 'r', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't',
+'s', '\022', 'S', '\n', '\026', 'i', 'n', 'c', 'l', 'u', 'd', 'e', '_', 'v', 'h', '_', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i',
+'t', 's', '\030', '\016', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\002', '\030', '\001', 'R', '\023', 'i', 'n', 'c', 'l', 'u', 'd', 'e', 'V',
+'h', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 's', '\022', 'N', '\n', '\013', 'h', 'a', 's', 'h', '_', 'p', 'o', 'l', 'i', 'c',
+'y', '\030', '\017', ' ', '\003', '(', '\013', '2', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o',
+'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o',
+'l', 'i', 'c', 'y', 'R', '\n', 'h', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '5', '\n', '\004', 'c', 'o', 'r', 's', '\030',
+'\021', ' ', '\001', '(', '\013', '2', '!', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
+'e', '.', 'v', '3', '.', 'C', 'o', 'r', 's', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\004', 'c', 'o', 'r', 's', '\022', 'G', '\n', '\020',
+'m', 'a', 'x', '_', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\027', ' ', '\001', '(', '\013', '2', '\031', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B',
+'\002', '\030', '\001', 'R', '\016', 'm', 'a', 'x', 'G', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'M', '\n', '\023', 'g', 'r',
+'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'o', 'f', 'f', 's', 'e', 't', '\030', '\034', ' ', '\001', '(', '\013', '2', '\031',
+'.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n',
+'B', '\002', '\030', '\001', 'R', '\021', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'O', 'f', 'f', 's', 'e', 't', '\022', 'Y',
+'\n', '\017', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\031', ' ', '\003', '(', '\013', '2', '0',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o',
+'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016',
+'u', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 's', '\022', 'g', '\n', '\030', 'i', 'n', 't', 'e', 'r', 'n', 'a',
+'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\"', ' ', '\001', '(', '\013', '2', '-',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'I', 'n',
+'t', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\026', 'i', 'n', 't',
+'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'w', '\n', '\030', 'i', 'n',
+'t', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'a', 'c', 't', 'i', 'o', 'n', '\030', '\032', ' ',
+'\001', '(', '\016', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
+'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e',
+'d', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\002', '\030', '\001', 'R', '\026', 'i', 'n', 't', 'e', 'r', 'n', 'a',
+'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', '\022', 'V', '\n', '\026', 'm', 'a', 'x', '_', 'i', 'n',
+'t', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's', '\030', '\037', ' ', '\001', '(', '\013', '2', '\034', '.',
+'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l',
+'u', 'e', 'B', '\002', '\030', '\001', 'R', '\024', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e',
+'c', 't', 's', '\022', 'E', '\n', '\014', 'h', 'e', 'd', 'g', 'e', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\033', ' ', '\001', '(', '\013',
+'2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
+'H', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', 'R', '\013', 'h', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\022',
+'d', '\n', '\023', 'm', 'a', 'x', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '$', ' ',
+'\001', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
+'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D',
+'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\021', 'm', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o',
+'n', '\032', '\242', '\002', '\n', '\023', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y',
+'\022', '!', '\n', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020',
+'\001', 'R', '\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\022', 'Y', '\n', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'f', 'r', 'a',
+'c', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n',
+'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o',
+'n', '\022', '?', '\n', '\r', 't', 'r', 'a', 'c', 'e', '_', 's', 'a', 'm', 'p', 'l', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2',
+'\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l',
+'u', 'e', 'R', '\014', 't', 'r', 'a', 'c', 'e', 'S', 'a', 'm', 'p', 'l', 'e', 'd', ':', '9', '\232', '\305', '\210', '\036', '4', '\n', '2',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A',
+'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y',
+'J', '\004', '\010', '\002', '\020', '\003', 'R', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\032', '\226', '\n', '\n', '\n', 'H',
+'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'N', '\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013',
'2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
-'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a',
-'t', 'i', 'o', 'n', 'R', '\021', 'm', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\032', '\242',
-'\002', '\n', '\023', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '!', '\n',
-'\007', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\007',
-'c', 'l', 'u', 's', 't', 'e', 'r', '\022', 'Y', '\n', '\020', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'f', 'r', 'a', 'c', 't', 'i',
-'o', 'n', '\030', '\003', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
-'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P',
-'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'r', 'u', 'n', 't', 'i', 'm', 'e', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', '\022', '?',
-'\n', '\r', 't', 'r', 'a', 'c', 'e', '_', 's', 'a', 'm', 'p', 'l', 'e', 'd', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R',
-'\014', 't', 'r', 'a', 'c', 'e', 'S', 'a', 'm', 'p', 'l', 'e', 'd', ':', '9', '\232', '\305', '\210', '\036', '4', '\n', '2', 'e', 'n', 'v',
-'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i',
-'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'M', 'i', 'r', 'r', 'o', 'r', 'P', 'o', 'l', 'i', 'c', 'y', 'J', '\004', '\010',
-'\002', '\020', '\003', 'R', '\013', 'r', 'u', 'n', 't', 'i', 'm', 'e', '_', 'k', 'e', 'y', '\032', '\226', '\n', '\n', '\n', 'H', 'a', 's', 'h',
-'P', 'o', 'l', 'i', 'c', 'y', '\022', 'N', '\n', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '4', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u',
-'t', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'H', 'e', 'a', 'd', 'e',
-'r', 'H', '\000', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\022', 'N', '\n', '\006', 'c', 'o', 'o', 'k', 'i', 'e', '\030', '\002', ' ', '\001',
-'(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
-'3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.',
-'C', 'o', 'o', 'k', 'i', 'e', 'H', '\000', 'R', '\006', 'c', 'o', 'o', 'k', 'i', 'e', '\022', 'y', '\n', '\025', 'c', 'o', 'n', 'n', 'e',
-'c', 't', 'i', 'o', 'n', '_', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', 'B', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u',
-'t', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'C', 'o', 'n', 'n', 'e',
-'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', 'H', '\000', 'R', '\024', 'c', 'o', 'n', 'n', 'e', 'c',
-'t', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\022', 'g', '\n', '\017', 'q', 'u', 'e', 'r', 'y', '_', 'p',
-'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\030', '\005', ' ', '\001', '(', '\013', '2', '<', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n',
-'.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e',
-'r', 'H', '\000', 'R', '\016', 'q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\022', '^', '\n', '\014', 'f', 'i',
-'l', 't', 'e', 'r', '_', 's', 't', 'a', 't', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i',
-'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'F', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e',
-'H', '\000', 'R', '\013', 'f', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', '\022', '\032', '\n', '\010', 't', 'e', 'r', 'm', 'i', 'n',
-'a', 'l', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\010', 't', 'e', 'r', 'm', 'i', 'n', 'a', 'l', '\032', '\306', '\001', '\n', '\006', 'H', 'e',
-'a', 'd', 'e', 'r', '\022', '.', '\n', '\013', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
-'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\n', 'h', 'e', 'a', 'd', 'e', 'r', 'N', 'a',
-'m', 'e', '\022', 'S', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013',
-'2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.',
-'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'e', 'R', '\014',
-'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o',
+'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'H', 'e',
+'a', 'd', 'e', 'r', 'H', '\000', 'R', '\006', 'h', 'e', 'a', 'd', 'e', 'r', '\022', 'N', '\n', '\006', 'c', 'o', 'o', 'k', 'i', 'e', '\030',
+'\002', ' ', '\001', '(', '\013', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't',
+'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i',
+'c', 'y', '.', 'C', 'o', 'o', 'k', 'i', 'e', 'H', '\000', 'R', '\006', 'c', 'o', 'o', 'k', 'i', 'e', '\022', 'y', '\n', '\025', 'c', 'o',
+'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'p', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\030', '\003', ' ', '\001', '(', '\013',
+'2', 'B', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
+'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'C', 'o',
+'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', 'H', '\000', 'R', '\024', 'c', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\022', 'g', '\n', '\017', 'q', 'u', 'e', 'r',
+'y', '_', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\030', '\005', ' ', '\001', '(', '\013', '2', '<', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't',
+'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm',
+'e', 't', 'e', 'r', 'H', '\000', 'R', '\016', 'q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\022', '^', '\n',
+'\014', 'f', 'i', 'l', 't', 'e', 'r', '_', 's', 't', 'a', 't', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A',
+'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'F', 'i', 'l', 't', 'e', 'r', 'S', 't',
+'a', 't', 'e', 'H', '\000', 'R', '\013', 'f', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', '\022', '\032', '\n', '\010', 't', 'e', 'r',
+'m', 'i', 'n', 'a', 'l', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\010', 't', 'e', 'r', 'm', 'i', 'n', 'a', 'l', '\032', '\306', '\001', '\n',
+'\006', 'H', 'e', 'a', 'd', 'e', 'r', '\022', '.', '\n', '\013', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ',
+'\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\n', 'h', 'e', 'a', 'd', 'e',
+'r', 'N', 'a', 'm', 'e', '\022', 'S', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\002', ' ',
+'\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.',
+'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't',
+'e', 'R', '\014', 'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e',
+'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c',
+'t', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'H', 'e', 'a', 'd', 'e', 'r', '\032', '\237', '\001',
+'\n', '\006', 'C', 'o', 'o', 'k', 'i', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372',
+'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '+', '\n', '\003', 't', 't', 'l', '\030', '\002', ' ', '\001', '(', '\013',
+'2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i',
+'o', 'n', 'R', '\003', 't', 't', 'l', '\022', '\022', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\004', 'p', 'a',
+'t', 'h', ':', '7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r',
+'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i',
+'c', 'y', '.', 'C', 'o', 'o', 'k', 'i', 'e', '\032', 'z', '\n', '\024', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r',
+'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\022', '\033', '\n', '\t', 's', 'o', 'u', 'r', 'c', 'e', '_', 'i', 'p', '\030', '\001', ' ', '\001',
+'(', '\010', 'R', '\010', 's', 'o', 'u', 'r', 'c', 'e', 'I', 'p', ':', 'E', '\232', '\305', '\210', '\036', '@', '\n', '>', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o',
+'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r',
+'o', 'p', 'e', 'r', 't', 'i', 'e', 's', '\032', 'n', '\n', '\016', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e',
+'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
+'\004', 'n', 'a', 'm', 'e', ':', '?', '\232', '\305', '\210', '\036', ':', '\n', '8', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
+'2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P',
+'o', 'l', 'i', 'c', 'y', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\032', 'f', '\n', '\013', 'F',
+'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', '\022', '\031', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
+'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\003', 'k', 'e', 'y', ':', '<', '\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o',
'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o',
-'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'H', 'e', 'a', 'd', 'e', 'r', '\032', '\237', '\001', '\n', '\006', 'C',
-'o', 'o', 'k', 'i', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
-'\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '+', '\n', '\003', 't', 't', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.',
+'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'F', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', ':',
+'0', '\232', '\305', '\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't',
+'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', 'B',
+'\027', '\n', '\020', 'p', 'o', 'l', 'i', 'c', 'y', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '\032',
+'\243', '\003', '\n', '\r', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '0', '\n', '\014', 'u', 'p', 'g', 'r',
+'a', 'd', 'e', '_', 't', 'y', 'p', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001',
+'\002', '\310', '\001', '\000', 'R', '\013', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'T', 'y', 'p', 'e', '\022', '4', '\n', '\007', 'e', 'n', 'a', 'b',
+'l', 'e', 'd', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'e', '\n', '\016',
+'c', 'o', 'n', 'n', 'e', 'c', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '>', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e',
+'A', 'c', 't', 'i', 'o', 'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 'n',
+'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\r', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032',
+'\215', '\001', '\n', '\r', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', ']', '\n', '\025', 'p', 'r', 'o', 'x',
+'y', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', ')',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'P', 'r', 'o',
+'x', 'y', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\023', 'p', 'r', 'o', 'x', 'y', 'P', 'r',
+'o', 't', 'o', 'c', 'o', 'l', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\035', '\n', '\n', 'a', 'l', 'l', 'o', 'w', '_', 'p', 'o', 's',
+'t', '\030', '\002', ' ', '\001', '(', '\010', 'R', '\t', 'a', 'l', 'l', 'o', 'w', 'P', 'o', 's', 't', ':', '3', '\232', '\305', '\210', '\036', '.',
+'\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't',
+'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\210', '\002', '\n',
+'\021', 'M', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', 'I', '\n', '\023', 'm', 'a', 'x',
+'_', 's', 't', 'r', 'e', 'a', 'm', '_', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.',
'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R',
-'\003', 't', 't', 'l', '\022', '\022', '\n', '\004', 'p', 'a', 't', 'h', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\004', 'p', 'a', 't', 'h', ':',
-'7', '\232', '\305', '\210', '\036', '2', '\n', '0', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't',
-'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.',
-'C', 'o', 'o', 'k', 'i', 'e', '\032', 'z', '\n', '\024', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e',
-'r', 't', 'i', 'e', 's', '\022', '\033', '\n', '\t', 's', 'o', 'u', 'r', 'c', 'e', '_', 'i', 'p', '\030', '\001', ' ', '\001', '(', '\010', 'R',
-'\010', 's', 'o', 'u', 'r', 'c', 'e', 'I', 'p', ':', 'E', '\232', '\305', '\210', '\036', '@', '\n', '>', 'e', 'n', 'v', 'o', 'y', '.', 'a',
-'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H',
-'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'P', 'r', 'o', 'p', 'e',
-'r', 't', 'i', 'e', 's', '\032', 'n', '\n', '\016', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\022', '\033',
-'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a',
-'m', 'e', ':', '?', '\232', '\305', '\210', '\036', ':', '\n', '8', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r',
-'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i',
-'c', 'y', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', '\032', 'f', '\n', '\013', 'F', 'i', 'l', 't',
-'e', 'r', 'S', 't', 'a', 't', 'e', '\022', '\031', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
-'r', '\002', '\020', '\001', 'R', '\003', 'k', 'e', 'y', ':', '<', '\232', '\305', '\210', '\036', '7', '\n', '5', 'e', 'n', 'v', 'o', 'y', '.', 'a',
-'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H',
-'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'F', 'i', 'l', 't', 'e', 'r', 'S', 't', 'a', 't', 'e', ':', '0', '\232', '\305',
-'\210', '\036', '+', '\n', ')', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R',
-'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'a', 's', 'h', 'P', 'o', 'l', 'i', 'c', 'y', 'B', '\027', '\n', '\020',
-'p', 'o', 'l', 'i', 'c', 'y', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '\032', '\201', '\003', '\n',
-'\r', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '.', '\n', '\014', 'u', 'p', 'g', 'r', 'a', 'd', 'e',
-'_', 't', 'y', 'p', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R',
-'\013', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'T', 'y', 'p', 'e', '\022', '4', '\n', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030', '\002',
-' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o',
-'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\022', 'e', '\n', '\016', 'c', 'o', 'n', 'n', 'e',
-'c', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '>', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o',
-'n', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '.', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'C', 'o',
-'n', 'f', 'i', 'g', 'R', '\r', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\032', 'n', '\n', '\r', 'C', 'o',
-'n', 'n', 'e', 'c', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', ']', '\n', '\025', 'p', 'r', 'o', 'x', 'y', '_', 'p', 'r', 'o', 't',
-'o', 'c', 'o', 'l', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'P', 'r', 'o', 'x', 'y', 'P', 'r', 'o', 't',
-'o', 'c', 'o', 'l', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\023', 'p', 'r', 'o', 'x', 'y', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l',
-'C', 'o', 'n', 'f', 'i', 'g', ':', '3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
-'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', '.', 'U', 'p', 'g', 'r',
-'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\210', '\002', '\n', '\021', 'M', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u',
-'r', 'a', 't', 'i', 'o', 'n', '\022', 'I', '\n', '\023', 'm', 'a', 'x', '_', 's', 't', 'r', 'e', 'a', 'm', '_', 'd', 'u', 'r', 'a',
-'t', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\021', 'm', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u',
-'r', 'a', 't', 'i', 'o', 'n', '\022', 'P', '\n', '\027', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'h', 'e',
-'a', 'd', 'e', 'r', '_', 'm', 'a', 'x', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
-'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\024', 'g', 'r', 'p', 'c', 'T', 'i', 'm',
-'e', 'o', 'u', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'x', '\022', 'V', '\n', '\032', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm',
-'e', 'o', 'u', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'o', 'f', 'f', 's', 'e', 't', '\030', '\003', ' ', '\001', '(', '\013', '2',
-'\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o',
-'n', 'R', '\027', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'O', 'f', 'f', 's', 'e',
-'t', '\"', 'E', '\n', '\033', 'C', 'l', 'u', 's', 't', 'e', 'r', 'N', 'o', 't', 'F', 'o', 'u', 'n', 'd', 'R', 'e', 's', 'p', 'o',
-'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', '\027', '\n', '\023', 'S', 'E', 'R', 'V', 'I', 'C', 'E', '_', 'U', 'N', 'A', 'V', 'A', 'I',
-'L', 'A', 'B', 'L', 'E', '\020', '\000', '\022', '\r', '\n', '\t', 'N', 'O', 'T', '_', 'F', 'O', 'U', 'N', 'D', '\020', '\001', '\"', '^', '\n',
-'\026', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', '\022', '\"',
-'\n', '\036', 'P', 'A', 'S', 'S', '_', 'T', 'H', 'R', 'O', 'U', 'G', 'H', '_', 'I', 'N', 'T', 'E', 'R', 'N', 'A', 'L', '_', 'R',
-'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020', '\000', '\022', '\034', '\n', '\030', 'H', 'A', 'N', 'D', 'L', 'E', '_', 'I', 'N', 'T', 'E', 'R',
-'N', 'A', 'L', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020', '\001', '\032', '\002', '\030', '\001', ':', '%', '\232', '\305', '\210', '\036', ' ',
-'\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't',
-'e', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\030', '\n', '\021', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f',
-'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '\030', '\n', '\026', 'h', 'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_',
-'s', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\014', '\020', '\r', 'J', '\004', '\010', '\022', '\020', '\023', 'J', '\004', '\010', '\023',
-'\020', '\024', 'J', '\004', '\010', '\020', '\020', '\021', 'J', '\004', '\010', '\026', '\020', '\027', 'J', '\004', '\010', '\025', '\020', '\026', 'J', '\004', '\010', '\n', '\020',
-'\013', 'R', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'm', 'i', 'r', 'r', 'o', 'r', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\"',
-'\215', '\017', '\n', '\013', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\022', '\031', '\n', '\010', 'r', 'e', 't', 'r', 'y', '_',
-'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\007', 'r', 'e', 't', 'r', 'y', 'O', 'n', '\022', 'R', '\n', '\013', 'n', 'u', 'm', '_',
-'r', 'e', 't', 'r', 'i', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\023', '\362', '\230', '\376', '\217', '\005',
-'\r', '\n', '\013', 'm', 'a', 'x', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', 'R', '\n', 'n', 'u', 'm', 'R', 'e', 't', 'r', 'i', 'e',
-'s', '\022', 'A', '\n', '\017', 'p', 'e', 'r', '_', 't', 'r', 'y', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\003', ' ', '\001', '(',
+'\021', 'm', 'a', 'x', 'S', 't', 'r', 'e', 'a', 'm', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', '\022', 'P', '\n', '\027', 'g', 'r', 'p',
+'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'm', 'a', 'x', '\030', '\002', ' ', '\001', '(',
'\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't',
-'i', 'o', 'n', 'R', '\r', 'p', 'e', 'r', 'T', 'r', 'y', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'W', '\n', '\016', 'r', 'e', 't',
-'r', 'y', '_', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\030', '\004', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l',
-'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'R', '\r', 'r', 'e', 't', 'r', 'y', 'P',
-'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', 'g', '\n', '\024', 'r', 'e', 't', 'r', 'y', '_', 'h', 'o', 's', 't', '_', 'p', 'r', 'e',
-'d', 'i', 'c', 'a', 't', 'e', '\030', '\005', ' ', '\003', '(', '\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R',
-'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'R', '\022', 'r', 'e', 't', 'r', 'y', 'H',
-'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022', 'H', '\n', '!', 'h', 'o', 's', 't', '_', 's', 'e', 'l', 'e',
-'c', 't', 'i', 'o', 'n', '_', 'r', 'e', 't', 'r', 'y', '_', 'm', 'a', 'x', '_', 'a', 't', 't', 'e', 'm', 'p', 't', 's', '\030',
-'\006', ' ', '\001', '(', '\003', 'R', '\035', 'h', 'o', 's', 't', 'S', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'R', 'e', 't', 'r', 'y',
-'M', 'a', 'x', 'A', 't', 't', 'e', 'm', 'p', 't', 's', '\022', '4', '\n', '\026', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', '_',
-'s', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd', 'e', 's', '\030', '\007', ' ', '\003', '(', '\r', 'R', '\024', 'r', 'e', 't', 'r', 'i',
-'a', 'b', 'l', 'e', 'S', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', 's', '\022', 'U', '\n', '\016', 'r', 'e', 't', 'r', 'y', '_',
-'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\010', ' ', '\001', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y',
-'.', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', 'R', '\014', 'r', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O',
-'f', 'f', '\022', 'x', '\n', '\033', 'r', 'a', 't', 'e', '_', 'l', 'i', 'm', 'i', 't', 'e', 'd', '_', 'r', 'e', 't', 'r', 'y', '_',
-'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\013', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y',
-'.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', 'R',
-'\027', 'r', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022',
-'Q', '\n', '\021', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\t', ' ', '\003', '(',
-'\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
-'.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\020', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e',
-'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '`', '\n', '\031', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', '_', 'r', 'e', 'q', 'u',
-'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\n', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a',
-'t', 'c', 'h', 'e', 'r', 'R', '\027', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e',
-'a', 'd', 'e', 'r', 's', '\032', '\271', '\001', '\n', '\r', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', '\033',
-'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a',
-'m', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2',
-'\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013',
-'t', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '3', '\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v', 'o', 'y',
-'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y',
-'.', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_',
-'t', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\032', '\303', '\001', '\n', '\022', 'R', 'e',
-'t', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030',
-'\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't',
-'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o',
-'n', 'f', 'i', 'g', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'H',
-'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y',
-'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\032', '\326', '\001', '\n', '\014', 'R', 'e', 't', 'r',
-'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'J', '\n', '\r', 'b', 'a', 's', 'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l',
-'\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\n', '\372', 'B', '\007', '\252', '\001', '\004', '\010', '\001', '*', '\000', 'R', '\014', 'b', 'a', 's',
-'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'F', '\n', '\014', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l',
-'\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\013', 'm', 'a', 'x', 'I', 'n',
-'t', 'e', 'r', 'v', 'a', 'l', ':', '2', '\232', '\305', '\210', '\036', '-', '\n', '+', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
-'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r',
-'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\032', '\210', '\001', '\n', '\013', 'R', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', '\022',
-'!', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001',
-'\310', '\001', '\000', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'V', '\n', '\006', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\002', ' ', '\001', '(', '\016',
-'2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
-'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'o',
-'r', 'm', 'a', 't', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\006', 'f', 'o', 'r', 'm', 'a', 't', '\032', '\300', '\001',
-'\n', '\027', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f',
-'\022', ']', '\n', '\r', 'r', 'e', 's', 'e', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '.',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e',
-'t', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'B', '\010', '\372', 'B',
-'\005', '\222', '\001', '\002', '\010', '\001', 'R', '\014', 'r', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'F', '\n', '\014', 'm',
-'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252',
-'\001', '\002', '*', '\000', 'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\"', '4', '\n', '\021', 'R', 'e', 's', 'e',
-'t', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'o', 'r', 'm', 'a', 't', '\022', '\013', '\n', '\007', 'S', 'E', 'C', 'O', 'N', 'D', 'S', '\020',
-'\000', '\022', '\022', '\n', '\016', 'U', 'N', 'I', 'X', '_', 'T', 'I', 'M', 'E', 'S', 'T', 'A', 'M', 'P', '\020', '\001', ':', '%', '\232', '\305',
-'\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R',
-'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\234', '\002', '\n', '\013', 'H', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c',
-'y', '\022', 'P', '\n', '\020', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', '\001', ' ', '\001',
-'(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't',
-'3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002', '(', '\001', 'R', '\017', 'i', 'n', 'i', 't', 'i', 'a', 'l',
-'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', '\\', '\n', '\031', 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', '_', 'r', 'e',
-'q', 'u', 'e', 's', 't', '_', 'c', 'h', 'a', 'n', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o',
-'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e',
-'n', 't', 'R', '\027', 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 'C', 'h', 'a', 'n',
-'c', 'e', '\022', '6', '\n', '\030', 'h', 'e', 'd', 'g', 'e', '_', 'o', 'n', '_', 'p', 'e', 'r', '_', 't', 'r', 'y', '_', 't', 'i',
-'m', 'e', 'o', 'u', 't', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\024', 'h', 'e', 'd', 'g', 'e', 'O', 'n', 'P', 'e', 'r', 'T', 'r',
-'y', 'T', 'i', 'm', 'e', 'o', 'u', 't', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'H', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\212', '\005',
-'\n', '\016', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', '\022', '\'', '\n', '\016', 'h', 't', 't', 'p', 's',
-'_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\004', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\r', 'h', 't', 't', 'p', 's', 'R',
-'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', ')', '\n', '\017', 's', 'c', 'h', 'e', 'm', 'e', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c',
-'t', '\030', '\007', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\016', 's', 'c', 'h', 'e', 'm', 'e', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't',
-'\022', '0', '\n', '\r', 'h', 'o', 's', 't', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\013',
-'\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\014', 'h', 'o', 's', 't', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't',
-'\022', '#', '\n', '\r', 'p', 'o', 'r', 't', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\010', ' ', '\001', '(', '\r', 'R', '\014',
-'p', 'o', 'r', 't', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '2', '\n', '\r', 'p', 'a', 't', 'h', '_', 'r', 'e', 'd', 'i',
-'r', 'e', 'c', 't', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001',
-'R', '\014', 'p', 'a', 't', 'h', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '4', '\n', '\016', 'p', 'r', 'e', 'f', 'i', 'x', '_',
-'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001',
-'\000', 'H', '\001', 'R', '\r', 'p', 'r', 'e', 'f', 'i', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', 'i', '\n', '\r', 'r', 'e', 's',
-'p', 'o', 'n', 's', 'e', '_', 'c', 'o', 'd', 'e', '\030', '\003', ' ', '\001', '(', '\016', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A',
-'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd',
-'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\014', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e',
-'\022', '\037', '\n', '\013', 's', 't', 'r', 'i', 'p', '_', 'q', 'u', 'e', 'r', 'y', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\n', 's', 't',
-'r', 'i', 'p', 'Q', 'u', 'e', 'r', 'y', '\"', 'w', '\n', '\024', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o',
-'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', '\025', '\n', '\021', 'M', 'O', 'V', 'E', 'D', '_', 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N',
-'T', 'L', 'Y', '\020', '\000', '\022', '\t', '\n', '\005', 'F', 'O', 'U', 'N', 'D', '\020', '\001', '\022', '\r', '\n', '\t', 'S', 'E', 'E', '_', 'O',
-'T', 'H', 'E', 'R', '\020', '\002', '\022', '\026', '\n', '\022', 'T', 'E', 'M', 'P', 'O', 'R', 'A', 'R', 'Y', '_', 'R', 'E', 'D', 'I', 'R',
-'E', 'C', 'T', '\020', '\003', '\022', '\026', '\n', '\022', 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N', 'T', '_', 'R', 'E', 'D', 'I', 'R', 'E',
-'C', 'T', '\020', '\004', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\032', '\n', '\030',
-'s', 'c', 'h', 'e', 'm', 'e', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'B',
-'\030', '\n', '\026', 'p', 'a', 't', 'h', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r',
-'\"', '\240', '\001', '\n', '\024', 'D', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'A', 'c', 't', 'i', 'o', 'n',
-'\022', '\"', '\n', '\006', 's', 't', 'a', 't', 'u', 's', '\030', '\001', ' ', '\001', '(', '\r', 'B', '\n', '\372', 'B', '\007', '*', '\005', '\020', '\330',
-'\004', '(', 'd', 'R', '\006', 's', 't', 'a', 't', 'u', 's', '\022', '4', '\n', '\004', 'b', 'o', 'd', 'y', '\030', '\002', ' ', '\001', '(', '\013',
-'2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D',
-'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\004', 'b', 'o', 'd', 'y', ':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e',
-'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'D', 'i', 'r', 'e', 'c', 't', 'R',
-'e', 's', 'p', 'o', 'n', 's', 'e', 'A', 'c', 't', 'i', 'o', 'n', '\"', '\221', '\001', '\n', '\t', 'D', 'e', 'c', 'o', 'r', 'a', 't',
-'o', 'r', '\022', '%', '\n', '\t', 'o', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
-'\004', 'r', '\002', '\020', '\001', 'R', '\t', 'o', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '\022', '8', '\n', '\t', 'p', 'r', 'o', 'p', 'a',
-'g', 'a', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'p', 'r', 'o', 'p', 'a', 'g', 'a', 't', 'e', ':',
-'#', '\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't',
-'e', '.', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', '\"', '\322', '\002', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022', 'I',
-'\n', '\017', 'c', 'l', 'i', 'e', 'n', 't', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l',
-'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'c', 'l', 'i', 'e', 'n', 't', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'I',
-'\n', '\017', 'r', 'a', 'n', 'd', 'o', 'm', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l',
-'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'a', 'n', 'd', 'o', 'm', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'K',
-'\n', '\020', 'o', 'v', 'e', 'r', 'a', 'l', 'l', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2',
-' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a',
-'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'o', 'v', 'e', 'r', 'a', 'l', 'l', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g',
-'\022', 'A', '\n', '\013', 'c', 'u', 's', 't', 'o', 'm', '_', 't', 'a', 'g', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', ' ', '.', 'e',
-'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 't', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'v', '3', '.', 'C', 'u', 's', 't',
-'o', 'm', 'T', 'a', 'g', 'R', '\n', 'c', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 's', ':', '!', '\232', '\305', '\210', '\036', '\034', '\n',
-'\032', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'T', 'r', 'a', 'c', 'i',
-'n', 'g', '\"', '\264', '\001', '\n', '\016', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', '>', '\n', '\007',
-'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'i', 'o', 'n', 'R', '\024', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 'x',
+'\022', 'V', '\n', '\032', 'g', 'r', 'p', 'c', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'o',
+'f', 'f', 's', 'e', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\027', 'g', 'r', 'p', 'c', 'T', 'i', 'm', 'e', 'o', 'u',
+'t', 'H', 'e', 'a', 'd', 'e', 'r', 'O', 'f', 'f', 's', 'e', 't', '\"', 'E', '\n', '\033', 'C', 'l', 'u', 's', 't', 'e', 'r', 'N',
+'o', 't', 'F', 'o', 'u', 'n', 'd', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022', '\027', '\n', '\023', 'S', 'E',
+'R', 'V', 'I', 'C', 'E', '_', 'U', 'N', 'A', 'V', 'A', 'I', 'L', 'A', 'B', 'L', 'E', '\020', '\000', '\022', '\r', '\n', '\t', 'N', 'O',
+'T', '_', 'F', 'O', 'U', 'N', 'D', '\020', '\001', '\"', '^', '\n', '\026', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i',
+'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', '\022', '\"', '\n', '\036', 'P', 'A', 'S', 'S', '_', 'T', 'H', 'R', 'O', 'U', 'G',
+'H', '_', 'I', 'N', 'T', 'E', 'R', 'N', 'A', 'L', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020', '\000', '\022', '\034', '\n', '\030',
+'H', 'A', 'N', 'D', 'L', 'E', '_', 'I', 'N', 'T', 'E', 'R', 'N', 'A', 'L', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C', 'T', '\020',
+'\001', '\032', '\002', '\030', '\001', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
+'2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'o', 'u', 't', 'e', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\030', '\n', '\021', 'c', 'l',
+'u', 's', 't', 'e', 'r', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '\030', '\n', '\026', 'h',
+'o', 's', 't', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\014',
+'\020', '\r', 'J', '\004', '\010', '\022', '\020', '\023', 'J', '\004', '\010', '\023', '\020', '\024', 'J', '\004', '\010', '\020', '\020', '\021', 'J', '\004', '\010', '\026', '\020',
+'\027', 'J', '\004', '\010', '\025', '\020', '\026', 'J', '\004', '\010', '\n', '\020', '\013', 'R', '\025', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'm', 'i',
+'r', 'r', 'o', 'r', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\"', '\215', '\017', '\n', '\013', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i',
+'c', 'y', '\022', '\031', '\n', '\010', 'r', 'e', 't', 'r', 'y', '_', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\007', 'r', 'e', 't',
+'r', 'y', 'O', 'n', '\022', 'R', '\n', '\013', 'n', 'u', 'm', '_', 'r', 'e', 't', 'r', 'i', 'e', 's', '\030', '\002', ' ', '\001', '(', '\013',
+'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2',
+'V', 'a', 'l', 'u', 'e', 'B', '\023', '\362', '\230', '\376', '\217', '\005', '\r', '\n', '\013', 'm', 'a', 'x', '_', 'r', 'e', 't', 'r', 'i', 'e',
+'s', 'R', '\n', 'n', 'u', 'm', 'R', 'e', 't', 'r', 'i', 'e', 's', '\022', 'A', '\n', '\017', 'p', 'e', 'r', '_', 't', 'r', 'y', '_',
+'t', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\r', 'p', 'e', 'r', 'T', 'r', 'y', 'T', 'i',
+'m', 'e', 'o', 'u', 't', '\022', 'W', '\n', '\016', 'r', 'e', 't', 'r', 'y', '_', 'p', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\030', '\004',
+' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o',
+'r', 'i', 't', 'y', 'R', '\r', 'r', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', 'g', '\n', '\024', 'r', 'e',
+'t', 'r', 'y', '_', 'h', 'o', 's', 't', '_', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\030', '\005', ' ', '\003', '(', '\013', '2',
+'5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R',
+'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i',
+'c', 'a', 't', 'e', 'R', '\022', 'r', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', '\022',
+'H', '\n', '!', 'h', 'o', 's', 't', '_', 's', 'e', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_', 'r', 'e', 't', 'r', 'y', '_', 'm',
+'a', 'x', '_', 'a', 't', 't', 'e', 'm', 'p', 't', 's', '\030', '\006', ' ', '\001', '(', '\003', 'R', '\035', 'h', 'o', 's', 't', 'S', 'e',
+'l', 'e', 'c', 't', 'i', 'o', 'n', 'R', 'e', 't', 'r', 'y', 'M', 'a', 'x', 'A', 't', 't', 'e', 'm', 'p', 't', 's', '\022', '4',
+'\n', '\026', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', '_', 's', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd', 'e', 's', '\030',
+'\007', ' ', '\003', '(', '\r', 'R', '\024', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', 'S', 't', 'a', 't', 'u', 's', 'C', 'o', 'd',
+'e', 's', '\022', 'U', '\n', '\016', 'r', 'e', 't', 'r', 'y', '_', 'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\010', ' ', '\001', '(',
+'\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
+'.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f',
+'R', '\014', 'r', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'x', '\n', '\033', 'r', 'a', 't', 'e', '_', 'l', 'i',
+'m', 'i', 't', 'e', 'd', '_', 'r', 'e', 't', 'r', 'y', '_', 'b', 'a', 'c', 'k', '_', 'o', 'f', 'f', '\030', '\013', ' ', '\001', '(',
+'\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
+'.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R',
+'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', 'R', '\027', 'r', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd', 'R',
+'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'Q', '\n', '\021', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', '_',
+'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\t', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e',
-'r', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'B',
-'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'C',
-'l', 'u', 's', 't', 'e', 'r', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\003', '\020', '\004', 'R', '\007', 'p', 'a', 't', 't', 'e',
-'r', 'n', 'R', '\006', 'm', 'e', 't', 'h', 'o', 'd', '\"', '\304', '\022', '\n', '\t', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '\022',
-';', '\n', '\005', 's', 't', 'a', 'g', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'R', '\020', 'r', 'e', 't', 'r', 'i', 'a', 'b', 'l', 'e', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '`', '\n', '\031', 'r', 'e',
+'t', 'r', 'i', 'a', 'b', 'l', 'e', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\n',
+' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\027', 'r', 'e', 't', 'r', 'i', 'a',
+'b', 'l', 'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\032', '\271', '\001', '\n', '\r', 'R', 'e', 't',
+'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't', 'y', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B',
+'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c',
+'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '3',
+'\232', '\305', '\210', '\036', '.', '\n', ',', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'P', 'r', 'i', 'o', 'r', 'i', 't',
+'y', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c',
+'o', 'n', 'f', 'i', 'g', '\032', '\303', '\001', '\n', '\022', 'R', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c',
+'a', 't', 'e', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020',
+'\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003',
+' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n',
+'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P',
+'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'H', 'o', 's', 't', 'P', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 'B',
+'\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n',
+'f', 'i', 'g', '\032', '\326', '\001', '\n', '\014', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', 'J', '\n', '\r', 'b',
+'a', 's', 'e', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\n', '\372', 'B', '\007',
+'\252', '\001', '\004', '\010', '\001', '*', '\000', 'R', '\014', 'b', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\022', 'F', '\n', '\014',
+'m', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005',
+'\252', '\001', '\002', '*', '\000', 'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'v', 'a', 'l', ':', '2', '\232', '\305', '\210', '\036', '-',
+'\n', '+', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r',
+'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\032', '\210', '\001', '\n', '\013',
+'R', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', '\022', '!', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
+'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'V', '\n', '\006',
+'f', 'o', 'r', 'm', 'a', 't', '\030', '\002', ' ', '\001', '(', '\016', '2', '4', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R',
+'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'o', 'r', 'm', 'a', 't', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020',
+'\001', 'R', '\006', 'f', 'o', 'r', 'm', 'a', 't', '\032', '\300', '\001', '\n', '\027', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', 'e', 'd',
+'R', 'e', 't', 'r', 'y', 'B', 'a', 'c', 'k', 'O', 'f', 'f', '\022', ']', '\n', '\r', 'r', 'e', 's', 'e', 't', '_', 'h', 'e', 'a',
+'d', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '.', 'R', 'e', 's',
+'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\014', 'r', 'e', 's', 'e', 't',
+'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', 'F', '\n', '\014', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'v', 'a', 'l', '\030', '\002',
+' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u',
+'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\252', '\001', '\002', '*', '\000', 'R', '\013', 'm', 'a', 'x', 'I', 'n', 't', 'e',
+'r', 'v', 'a', 'l', '\"', '4', '\n', '\021', 'R', 'e', 's', 'e', 't', 'H', 'e', 'a', 'd', 'e', 'r', 'F', 'o', 'r', 'm', 'a', 't',
+'\022', '\013', '\n', '\007', 'S', 'E', 'C', 'O', 'N', 'D', 'S', '\020', '\000', '\022', '\022', '\n', '\016', 'U', 'N', 'I', 'X', '_', 'T', 'I', 'M',
+'E', 'S', 'T', 'A', 'M', 'P', '\020', '\001', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 't', 'r', 'y', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\234', '\002',
+'\n', '\013', 'H', 'e', 'd', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\022', 'P', '\n', '\020', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_',
+'r', 'e', 'q', 'u', 'e', 's', 't', 's', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*',
-'\002', '\030', '\n', 'R', '\005', 's', 't', 'a', 'g', 'e', '\022', '\037', '\n', '\013', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'k', 'e', 'y',
-'\030', '\002', ' ', '\001', '(', '\t', 'R', '\n', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'K', 'e', 'y', '\022', 'K', '\n', '\007', 'a', 'c', 't',
-'i', 'o', 'n', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o',
-'n', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\007', 'a', 'c', 't', 'i', 'o', 'n', 's', '\022', '?', '\n', '\005', 'l',
-'i', 'm', 'i', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'O', 'v', 'e', 'r', 'r',
-'i', 'd', 'e', 'R', '\005', 'l', 'i', 'm', 'i', 't', '\032', '\260', '\016', '\n', '\006', 'A', 'c', 't', 'i', 'o', 'n', '\022', '^', '\n', '\016',
-'s', 'o', 'u', 'r', 'c', 'e', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '5', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L',
-'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'S', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r',
-'H', '\000', 'R', '\r', 's', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'm', '\n', '\023', 'd', 'e', 's', 't',
-'i', 'n', 'a', 't', 'i', 'o', 'n', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', ':', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e',
-'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C',
-'l', 'u', 's', 't', 'e', 'r', 'H', '\000', 'R', '\022', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's',
-'t', 'e', 'r', '\022', 'a', '\n', '\017', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ',
-'\001', '(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
-'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e',
-'s', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'H', '\000', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e',
-'r', 's', '\022', '^', '\n', '\016', 'r', 'e', 'm', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\004', ' ', '\001', '(',
-'\013', '2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
-'.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'm', 'o', 't', 'e', 'A',
-'d', 'd', 'r', 'e', 's', 's', 'H', '\000', 'R', '\r', 'r', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', '\022', 'U',
-'\n', '\013', 'g', 'e', 'n', 'e', 'r', 'i', 'c', '_', 'k', 'e', 'y', '\030', '\005', ' ', '\001', '(', '\013', '2', '2', '.', 'e', 'n', 'v',
+'\002', '(', '\001', 'R', '\017', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 's', '\022', '\\', '\n', '\031', 'a',
+'d', 'd', 'i', 't', 'i', 'o', 'n', 'a', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'c', 'h', 'a', 'n', 'c', 'e', '\030',
+'\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a',
+'c', 't', 'i', 'o', 'n', 'a', 'l', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\027', 'a', 'd', 'd', 'i', 't', 'i', 'o', 'n', 'a',
+'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 'C', 'h', 'a', 'n', 'c', 'e', '\022', '6', '\n', '\030', 'h', 'e', 'd', 'g', 'e', '_', 'o',
+'n', '_', 'p', 'e', 'r', '_', 't', 'r', 'y', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\024',
+'h', 'e', 'd', 'g', 'e', 'O', 'n', 'P', 'e', 'r', 'T', 'r', 'y', 'T', 'i', 'm', 'e', 'o', 'u', 't', ':', '%', '\232', '\305', '\210',
+'\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'H', 'e',
+'d', 'g', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\"', '\341', '\005', '\n', '\016', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't',
+'i', 'o', 'n', '\022', '\'', '\n', '\016', 'h', 't', 't', 'p', 's', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\004', ' ', '\001',
+'(', '\010', 'H', '\000', 'R', '\r', 'h', 't', 't', 'p', 's', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', ')', '\n', '\017', 's', 'c',
+'h', 'e', 'm', 'e', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\007', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\016', 's', 'c',
+'h', 'e', 'm', 'e', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '0', '\n', '\r', 'h', 'o', 's', 't', '_', 'r', 'e', 'd', 'i',
+'r', 'e', 'c', 't', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\014',
+'h', 'o', 's', 't', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022', '#', '\n', '\r', 'p', 'o', 'r', 't', '_', 'r', 'e', 'd', 'i',
+'r', 'e', 'c', 't', '\030', '\010', ' ', '\001', '(', '\r', 'R', '\014', 'p', 'o', 'r', 't', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\022',
+'2', '\n', '\r', 'p', 'a', 't', 'h', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\013', '\372',
+'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\014', 'p', 'a', 't', 'h', 'R', 'e', 'd', 'i', 'r', 'e', 'c',
+'t', '\022', '4', '\n', '\016', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\005', ' ', '\001', '(', '\t',
+'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'H', '\001', 'R', '\r', 'p', 'r', 'e', 'f', 'i', 'x', 'R', 'e',
+'w', 'r', 'i', 't', 'e', '\022', 'U', '\n', '\r', 'r', 'e', 'g', 'e', 'x', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '\030', '\t', ' ',
+'\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.',
+'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'A', 'n', 'd', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't',
+'e', 'H', '\001', 'R', '\014', 'r', 'e', 'g', 'e', 'x', 'R', 'e', 'w', 'r', 'i', 't', 'e', '\022', 'i', '\n', '\r', 'r', 'e', 's', 'p',
+'o', 'n', 's', 'e', '_', 'c', 'o', 'd', 'e', '\030', '\003', ' ', '\001', '(', '\016', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c',
+'t', 'i', 'o', 'n', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e',
+'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\014', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', '\022',
+'\037', '\n', '\013', 's', 't', 'r', 'i', 'p', '_', 'q', 'u', 'e', 'r', 'y', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\n', 's', 't', 'r',
+'i', 'p', 'Q', 'u', 'e', 'r', 'y', '\"', 'w', '\n', '\024', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n',
+'s', 'e', 'C', 'o', 'd', 'e', '\022', '\025', '\n', '\021', 'M', 'O', 'V', 'E', 'D', '_', 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N', 'T',
+'L', 'Y', '\020', '\000', '\022', '\t', '\n', '\005', 'F', 'O', 'U', 'N', 'D', '\020', '\001', '\022', '\r', '\n', '\t', 'S', 'E', 'E', '_', 'O', 'T',
+'H', 'E', 'R', '\020', '\002', '\022', '\026', '\n', '\022', 'T', 'E', 'M', 'P', 'O', 'R', 'A', 'R', 'Y', '_', 'R', 'E', 'D', 'I', 'R', 'E',
+'C', 'T', '\020', '\003', '\022', '\026', '\n', '\022', 'P', 'E', 'R', 'M', 'A', 'N', 'E', 'N', 'T', '_', 'R', 'E', 'D', 'I', 'R', 'E', 'C',
+'T', '\020', '\004', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.',
+'r', 'o', 'u', 't', 'e', '.', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'A', 'c', 't', 'i', 'o', 'n', 'B', '\032', '\n', '\030', 's',
+'c', 'h', 'e', 'm', 'e', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'B', '\030',
+'\n', '\026', 'p', 'a', 't', 'h', '_', 'r', 'e', 'w', 'r', 'i', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\"',
+'\240', '\001', '\n', '\024', 'D', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'A', 'c', 't', 'i', 'o', 'n', '\022',
+'\"', '\n', '\006', 's', 't', 'a', 't', 'u', 's', '\030', '\001', ' ', '\001', '(', '\r', 'B', '\n', '\372', 'B', '\007', '*', '\005', '\020', '\330', '\004',
+'(', 'd', 'R', '\006', 's', 't', 'a', 't', 'u', 's', '\022', '4', '\n', '\004', 'b', 'o', 'd', 'y', '\030', '\002', ' ', '\001', '(', '\013', '2',
+' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a',
+'t', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\004', 'b', 'o', 'd', 'y', ':', '.', '\232', '\305', '\210', '\036', ')', '\n', '\'', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'D', 'i', 'r', 'e', 'c', 't', 'R', 'e',
+'s', 'p', 'o', 'n', 's', 'e', 'A', 'c', 't', 'i', 'o', 'n', '\"', '\221', '\001', '\n', '\t', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o',
+'r', '\022', '%', '\n', '\t', 'o', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
+'r', '\002', '\020', '\001', 'R', '\t', 'o', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '\022', '8', '\n', '\t', 'p', 'r', 'o', 'p', 'a', 'g',
+'a', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\t', 'p', 'r', 'o', 'p', 'a', 'g', 'a', 't', 'e', ':', '#',
+'\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'D', 'e', 'c', 'o', 'r', 'a', 't', 'o', 'r', '\"', '\322', '\002', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022', 'I', '\n',
+'\017', 'c', 'l', 'i', 'e', 'n', 't', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.',
+'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P',
+'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'c', 'l', 'i', 'e', 'n', 't', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'I', '\n',
+'\017', 'r', 'a', 'n', 'd', 'o', 'm', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.',
+'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l', 'P',
+'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'a', 'n', 'd', 'o', 'm', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'K', '\n',
+'\020', 'o', 'v', 'e', 'r', 'a', 'l', 'l', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', ' ',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'F', 'r', 'a', 'c', 't', 'i', 'o', 'n', 'a', 'l',
+'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'o', 'v', 'e', 'r', 'a', 'l', 'l', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022',
+'A', '\n', '\013', 'c', 'u', 's', 't', 'o', 'm', '_', 't', 'a', 'g', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n',
+'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 't', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'v', '3', '.', 'C', 'u', 's', 't', 'o',
+'m', 'T', 'a', 'g', 'R', '\n', 'c', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 's', ':', '!', '\232', '\305', '\210', '\036', '\034', '\n', '\032',
+'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'T', 'r', 'a', 'c', 'i', 'n',
+'g', '\"', '\264', '\001', '\n', '\016', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', '>', '\n', '\007', 'h',
+'e', 'a', 'd', 'e', 'r', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r',
+'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007',
+'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'C', 'l',
+'u', 's', 't', 'e', 'r', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\003', '\020', '\004', 'R', '\007', 'p', 'a', 't', 't', 'e', 'r',
+'n', 'R', '\006', 'm', 'e', 't', 'h', 'o', 'd', '\"', '\241', '\026', '\n', '\t', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '\022', ';',
+'\n', '\005', 's', 't', 'a', 'g', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\372', 'B', '\004', '*', '\002',
+'\030', '\n', 'R', '\005', 's', 't', 'a', 'g', 'e', '\022', '\037', '\n', '\013', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 'k', 'e', 'y', '\030',
+'\002', ' ', '\001', '(', '\t', 'R', '\n', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'K', 'e', 'y', '\022', 'K', '\n', '\007', 'a', 'c', 't', 'i',
+'o', 'n', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n',
+'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\007', 'a', 'c', 't', 'i', 'o', 'n', 's', '\022', '?', '\n', '\005', 'l', 'i',
+'m', 'i', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'O', 'v', 'e', 'r', 'r', 'i',
+'d', 'e', 'R', '\005', 'l', 'i', 'm', 'i', 't', '\032', '\215', '\022', '\n', '\006', 'A', 'c', 't', 'i', 'o', 'n', '\022', '^', '\n', '\016', 's',
+'o', 'u', 'r', 'c', 'e', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '5', '.', 'e', 'n', 'v',
'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i',
-'m', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', 'H', '\000', 'R', '\n',
-'g', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', '\022', 'h', '\n', '\022', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'v', 'a', 'l', 'u',
-'e', '_', 'm', 'a', 't', 'c', 'h', '\030', '\006', ' ', '\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c',
-'t', 'i', 'o', 'n', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', 'H', '\000', 'R', '\020',
-'h', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\022', 'd', '\n', '\020', 'd', 'y', 'n', 'a', 'm',
-'i', 'c', '_', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\007', ' ', '\001', '(', '\013', '2', '7', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i',
-'t', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', 'H',
-'\000', 'R', '\017', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\032', 'I', '\n', '\r', 'S', 'o', 'u',
-'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.',
-'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c',
-'t', 'i', 'o', 'n', '.', 'S', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', '\032', 'S', '\n', '\022', 'D', 'e', 's',
-'t', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's', 't', 'e', 'r', ':', '=', '\232', '\305', '\210', '\036', '8', '\n', '6', 'e',
-'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm',
-'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's',
-'t', 'e', 'r', '\032', '\321', '\001', '\n', '\016', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '.', '\n',
-'\013', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010',
-'\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\n', 'h', 'e', 'a', 'd', 'e', 'r', 'N', 'a', 'm', 'e', '\022', '.', '\n', '\016', 'd',
-'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r',
-'\002', '\020', '\001', 'R', '\r', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', '\022', '$', '\n', '\016', 's', 'k', 'i',
-'p', '_', 'i', 'f', '_', 'a', 'b', 's', 'e', 'n', 't', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\014', 's', 'k', 'i', 'p', 'I', 'f',
-'A', 'b', 's', 'e', 'n', 't', ':', '9', '\232', '\305', '\210', '\036', '4', '\n', '2', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.',
-'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n',
-'.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\032', 'I', '\n', '\r', 'R', 'e', 'm', 'o', 't', 'e',
-'A', 'd', 'd', 'r', 'e', 's', 's', ':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
-'.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o',
-'n', '.', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', '\032', '\236', '\001', '\n', '\n', 'G', 'e', 'n', 'e', 'r',
-'i', 'c', 'K', 'e', 'y', '\022', '2', '\n', '\020', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'v', 'a', 'l', 'u', 'e',
-'\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\017', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't',
-'o', 'r', 'V', 'a', 'l', 'u', 'e', '\022', '%', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'k', 'e', 'y',
-'\030', '\002', ' ', '\001', '(', '\t', 'R', '\r', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', ':', '5', '\232', '\305',
-'\210', '\036', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R',
-'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e',
-'y', '\032', '\214', '\002', '\n', '\020', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\022', '2', '\n',
-'\020', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
-'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\017', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'V', 'a', 'l', 'u', 'e', '\022',
-'=', '\n', '\014', 'e', 'x', 'p', 'e', 'c', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R',
-'\013', 'e', 'x', 'p', 'e', 'c', 't', 'M', 'a', 't', 'c', 'h', '\022', 'H', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003',
-' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
-'.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002',
-'\010', '\001', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y',
+'m', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'S', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', 'H',
+'\000', 'R', '\r', 's', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r', '\022', 'm', '\n', '\023', 'd', 'e', 's', 't', 'i',
+'n', 'a', 't', 'i', 'o', 'n', '_', 'c', 'l', 'u', 's', 't', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L',
+'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l',
+'u', 's', 't', 'e', 'r', 'H', '\000', 'R', '\022', 'd', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's', 't',
+'e', 'r', '\022', 'a', '\n', '\017', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\001',
+'(', '\013', '2', '6', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
+'3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's',
+'t', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'H', '\000', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r',
+'s', '\022', '^', '\n', '\016', 'r', 'e', 'm', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\004', ' ', '\001', '(', '\013',
+'2', '5', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
+'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd',
+'d', 'r', 'e', 's', 's', 'H', '\000', 'R', '\r', 'r', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', '\022', 'U', '\n',
+'\013', 'g', 'e', 'n', 'e', 'r', 'i', 'c', '_', 'k', 'e', 'y', '\030', '\005', ' ', '\001', '(', '\013', '2', '2', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm',
+'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', 'H', '\000', 'R', '\n', 'g',
+'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', '\022', 'h', '\n', '\022', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'v', 'a', 'l', 'u', 'e',
+'_', 'm', 'a', 't', 'c', 'h', '\030', '\006', ' ', '\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't',
+'i', 'o', 'n', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', 'H', '\000', 'R', '\020', 'h',
+'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\022', 'n', '\n', '\020', 'd', 'y', 'n', 'a', 'm', 'i',
+'c', '_', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\007', ' ', '\001', '(', '\013', '2', '7', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't',
+'.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', 'B', '\010',
+'\030', '\001', '\270', '\356', '\362', '\322', '\005', '\001', 'H', '\000', 'R', '\017', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a',
+'t', 'a', '\022', 'N', '\n', '\010', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\010', ' ', '\001', '(', '\013', '2', '0', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L',
+'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', 'H', '\000', 'R', '\010', 'm',
+'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'J', '\n', '\t', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\030', '\t', ' ', '\001', '(',
+'\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
+'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\t', 'e',
+'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\032', 'I', '\n', '\r', 'S', 'o', 'u', 'r', 'c', 'e', 'C', 'l', 'u', 's', 't', 'e', 'r',
+':', '8', '\232', '\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u',
+'t', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'S', 'o', 'u', 'r', 'c',
+'e', 'C', 'l', 'u', 's', 't', 'e', 'r', '\032', 'S', '\n', '\022', 'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l',
+'u', 's', 't', 'e', 'r', ':', '=', '\232', '\305', '\210', '\036', '8', '\n', '6', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
+'2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.',
+'D', 'e', 's', 't', 'i', 'n', 'a', 't', 'i', 'o', 'n', 'C', 'l', 'u', 's', 't', 'e', 'r', '\032', '\321', '\001', '\n', '\016', 'R', 'e',
+'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', '\022', '.', '\n', '\013', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'n', 'a',
+'m', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\n',
+'h', 'e', 'a', 'd', 'e', 'r', 'N', 'a', 'm', 'e', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_',
+'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\r', 'd', 'e', 's', 'c', 'r',
+'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', '\022', '$', '\n', '\016', 's', 'k', 'i', 'p', '_', 'i', 'f', '_', 'a', 'b', 's', 'e', 'n',
+'t', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\014', 's', 'k', 'i', 'p', 'I', 'f', 'A', 'b', 's', 'e', 'n', 't', ':', '9', '\232', '\305',
+'\210', '\036', '4', '\n', '2', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R',
+'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H', 'e',
+'a', 'd', 'e', 'r', 's', '\032', 'I', '\n', '\r', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', ':', '8', '\232',
+'\305', '\210', '\036', '3', '\n', '1', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.',
+'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd',
+'d', 'r', 'e', 's', 's', '\032', '\236', '\001', '\n', '\n', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', '\022', '2', '\n', '\020', 'd',
+'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
+'\004', 'r', '\002', '\020', '\001', 'R', '\017', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'V', 'a', 'l', 'u', 'e', '\022', '%', '\n',
+'\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\r', 'd', 'e',
+'s', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', ':', '5', '\232', '\305', '\210', '\036', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y',
'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A',
-'c', 't', 'i', 'o', 'n', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\032', '\270', '\001',
-'\n', '\017', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c',
-'r', 'i', 'p', 't', 'o', 'r', '_', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001',
-'R', '\r', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a',
-'t', 'a', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e',
+'c', 't', 'i', 'o', 'n', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'K', 'e', 'y', '\032', '\214', '\002', '\n', '\020', 'H', 'e', 'a', 'd',
+'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\022', '2', '\n', '\020', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o',
+'r', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\017', 'd',
+'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', 'V', 'a', 'l', 'u', 'e', '\022', '=', '\n', '\014', 'e', 'x', 'p', 'e', 'c', 't', '_',
+'m', 'a', 't', 'c', 'h', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\013', 'e', 'x', 'p', 'e', 'c', 't', 'M', 'a', 't',
+'c', 'h', '\022', 'H', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r',
+'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\007', 'h', 'e', 'a', 'd', 'e', 'r',
+'s', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o',
+'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'H', 'e', 'a', 'd',
+'e', 'r', 'V', 'a', 'l', 'u', 'e', 'M', 'a', 't', 'c', 'h', '\032', '\270', '\001', '\n', '\017', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M',
+'e', 't', 'a', 'D', 'a', 't', 'a', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '_', 'k', 'e', 'y',
+'\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\r', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't',
+'o', 'r', 'K', 'e', 'y', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001',
+'(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '.',
+'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R',
+'\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v',
+'a', 'l', 'u', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', '\032',
+'\264', '\002', '\n', '\010', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', '\022', '.', '\n', '\016', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o',
+'r', '_', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\r', 'd', 'e', 's',
+'c', 'r', 'i', 'p', 't', 'o', 'r', 'K', 'e', 'y', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '_', 'k', 'e',
+'y', '\030', '\002', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'e', 't', 'a',
+'d', 'a', 't', 'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\010', '\372', 'B', '\005', '\212',
+'\001', '\002', '\020', '\001', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', '\022', '#', '\n', '\r', 'd', 'e', 'f', 'a',
+'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\014', 'd', 'e', 'f', 'a', 'u', 'l', 't', 'V',
+'a', 'l', 'u', 'e', '\022', 'Y', '\n', '\006', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\004', ' ', '\001', '(', '\016', '2', '7', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L',
+'i', 'm', 'i', 't', '.', 'A', 'c', 't', 'i', 'o', 'n', '.', 'M', 'e', 't', 'a', 'D', 'a', 't', 'a', '.', 'S', 'o', 'u', 'r',
+'c', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\006', 's', 'o', 'u', 'r', 'c', 'e', '\"', '&', '\n', '\006', 'S',
+'o', 'u', 'r', 'c', 'e', '\022', '\013', '\n', '\007', 'D', 'Y', 'N', 'A', 'M', 'I', 'C', '\020', '\000', '\022', '\017', '\n', '\013', 'R', 'O', 'U',
+'T', 'E', '_', 'E', 'N', 'T', 'R', 'Y', '\020', '\001', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.',
+'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c',
+'t', 'i', 'o', 'n', 'B', '\027', '\n', '\020', 'a', 'c', 't', 'i', 'o', 'n', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022',
+'\003', '\370', 'B', '\001', '\032', '\362', '\001', '\n', '\010', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'f', '\n', '\020', 'd', 'y', 'n', 'a',
+'m', 'i', 'c', '_', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\001', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n', 'v', 'o',
+'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm',
+'i', 't', '.', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a',
+'t', 'a', 'H', '\000', 'R', '\017', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\032', 'c', '\n', '\017',
+'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a',
+'t', 'a', '_', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e',
'.', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B',
-'\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', '\022', '#', '\n',
-'\r', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\014', 'd', 'e', 'f',
-'a', 'u', 'l', 't', 'V', 'a', 'l', 'u', 'e', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a',
-'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '.', 'A', 'c', 't',
-'i', 'o', 'n', 'B', '\027', '\n', '\020', 'a', 'c', 't', 'i', 'o', 'n', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003',
-'\370', 'B', '\001', '\032', '\362', '\001', '\n', '\010', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'f', '\n', '\020', 'd', 'y', 'n', 'a', 'm',
-'i', 'c', '_', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', '\030', '\001', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i',
-'t', '.', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '.', 'D', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't',
-'a', 'H', '\000', 'R', '\017', 'd', 'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\032', 'c', '\n', '\017', 'D',
-'y', 'n', 'a', 'm', 'i', 'c', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', '\022', 'P', '\n', '\014', 'm', 'e', 't', 'a', 'd', 'a', 't',
-'a', '_', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.',
-'m', 'e', 't', 'a', 'd', 'a', 't', 'a', '.', 'v', '3', '.', 'M', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\010',
-'\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\031', '\n', '\022',
-'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', ':', '#',
-'\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e',
-'.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '\"', '\236', '\004', '\n', '\r', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c',
-'h', 'e', 'r', '\022', '!', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010', '\020',
-'\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '!', '\n', '\013', 'e', 'x', 'a', 'c', 't', '_', 'm', 'a',
-'t', 'c', 'h', '\030', '\004', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\n', 'e', 'x', 'a', 'c', 't', 'M', 'a', 't', 'c', 'h', '\022', 'O',
-'\n', '\020', 's', 'a', 'f', 'e', '_', 'r', 'e', 'g', 'e', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\013', ' ', '\001', '(', '\013', '2',
-'#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R',
-'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\016', 's', 'a', 'f', 'e', 'R', 'e', 'g', 'e', 'x', 'M',
-'a', 't', 'c', 'h', '\022', '<', '\n', '\013', 'r', 'a', 'n', 'g', 'e', '_', 'm', 'a', 't', 'c', 'h', '\030', '\006', ' ', '\001', '(', '\013',
-'2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'I', 'n', 't', '6', '4', 'R', 'a', 'n',
-'g', 'e', 'H', '\000', 'R', '\n', 'r', 'a', 'n', 'g', 'e', 'M', 'a', 't', 'c', 'h', '\022', '%', '\n', '\r', 'p', 'r', 'e', 's', 'e',
-'n', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\007', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\014', 'p', 'r', 'e', 's', 'e', 'n', 't',
-'M', 'a', 't', 'c', 'h', '\022', ',', '\n', '\014', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\t', ' ', '\001',
-'(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 'p', 'r', 'e', 'f', 'i', 'x', 'M', 'a', 't', 'c',
-'h', '\022', ',', '\n', '\014', 's', 'u', 'f', 'f', 'i', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\n', ' ', '\001', '(', '\t', 'B', '\007',
-'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 's', 'u', 'f', 'f', 'i', 'x', 'M', 'a', 't', 'c', 'h', '\022', '0', '\n',
-'\016', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '_', 'm', 'a', 't', 'c', 'h', '\030', '\014', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
-'\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\r', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', 'M', 'a', 't', 'c', 'h', '\022', '!', '\n',
-'\014', 'i', 'n', 'v', 'e', 'r', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'n', 'v', 'e',
-'r', 't', 'M', 'a', 't', 'c', 'h', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
-'.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\030',
-'\n', '\026', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'm', 'a', 't', 'c', 'h', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J',
-'\004', '\010', '\002', '\020', '\003', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\013', 'r', 'e', 'g', 'e', 'x', '_',
-'m', 'a', 't', 'c', 'h', '\"', '\241', '\002', '\n', '\025', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 'M',
-'a', 't', 'c', 'h', 'e', 'r', '\022', '\036', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\n', '\372', 'B', '\007',
-'r', '\005', '\020', '\001', '(', '\200', '\010', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'S', '\n', '\014', 's', 't', 'r', 'i', 'n', 'g', '_', 'm',
-'a', 't', 'c', 'h', '\030', '\005', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm',
-'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010',
-'\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 's', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', '\022', '%',
-'\n', '\r', 'p', 'r', 'e', 's', 'e', 'n', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\006', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\014',
-'p', 'r', 'e', 's', 'e', 'n', 't', 'M', 'a', 't', 'c', 'h', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v', 'o',
-'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm',
-'e', 't', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '!', '\n', '\037', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r', 'a',
-'m', 'e', 't', 'e', 'r', '_', 'm', 'a', 't', 'c', 'h', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010', '\003',
-'\020', '\004', 'J', '\004', '\010', '\004', '\020', '\005', 'R', '\005', 'v', 'a', 'l', 'u', 'e', 'R', '\005', 'r', 'e', 'g', 'e', 'x', '\"', '\271', '\002',
-'\n', '\026', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y', '\022',
-'R', '\n', '\026', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's',
-'\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\024', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R',
-'e', 'd', 'i', 'r', 'e', 'c', 't', 's', '\022', '@', '\n', '\027', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 's', 'p',
-'o', 'n', 's', 'e', '_', 'c', 'o', 'd', 'e', 's', '\030', '\002', ' ', '\003', '(', '\r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\020',
-'\005', 'R', '\025', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', 's', '\022',
-'J', '\n', '\n', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x',
-'t', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\n', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 's',
-'\022', '=', '\n', '\033', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'r', 'o', 's', 's', '_', 's', 'c', 'h', 'e', 'm', 'e', '_', 'r', 'e',
-'d', 'i', 'r', 'e', 'c', 't', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\030', 'a', 'l', 'l', 'o', 'w', 'C', 'r', 'o', 's', 's', 'S',
-'c', 'h', 'e', 'm', 'e', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'B', 'E', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y',
-'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.',
-'v', '3', 'B', '\024', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', 'P', 'r', 'o', 't', 'o', 'P',
-'\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\013', 'm', 'e', 't', 'a', 'd', 'a', 't', 'a', 'K', 'e', 'y', 'B', '\031', '\n',
+'\022', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', ':',
+'#', '\232', '\305', '\210', '\036', '\036', '\n', '\034', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't',
+'e', '.', 'R', 'a', 't', 'e', 'L', 'i', 'm', 'i', 't', '\"', '\236', '\004', '\n', '\r', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't',
+'c', 'h', 'e', 'r', '\022', '!', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\r', '\372', 'B', '\n', 'r', '\010',
+'\020', '\001', '\300', '\001', '\001', '\310', '\001', '\000', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '!', '\n', '\013', 'e', 'x', 'a', 'c', 't', '_', 'm',
+'a', 't', 'c', 'h', '\030', '\004', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\n', 'e', 'x', 'a', 'c', 't', 'M', 'a', 't', 'c', 'h', '\022',
+'O', '\n', '\020', 's', 'a', 'f', 'e', '_', 'r', 'e', 'g', 'e', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\013', ' ', '\001', '(', '\013',
+'2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.',
+'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'H', '\000', 'R', '\016', 's', 'a', 'f', 'e', 'R', 'e', 'g', 'e', 'x',
+'M', 'a', 't', 'c', 'h', '\022', '<', '\n', '\013', 'r', 'a', 'n', 'g', 'e', '_', 'm', 'a', 't', 'c', 'h', '\030', '\006', ' ', '\001', '(',
+'\013', '2', '\031', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'I', 'n', 't', '6', '4', 'R', 'a',
+'n', 'g', 'e', 'H', '\000', 'R', '\n', 'r', 'a', 'n', 'g', 'e', 'M', 'a', 't', 'c', 'h', '\022', '%', '\n', '\r', 'p', 'r', 'e', 's',
+'e', 'n', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\007', ' ', '\001', '(', '\010', 'H', '\000', 'R', '\014', 'p', 'r', 'e', 's', 'e', 'n',
+'t', 'M', 'a', 't', 'c', 'h', '\022', ',', '\n', '\014', 'p', 'r', 'e', 'f', 'i', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\t', ' ',
+'\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 'p', 'r', 'e', 'f', 'i', 'x', 'M', 'a', 't',
+'c', 'h', '\022', ',', '\n', '\014', 's', 'u', 'f', 'f', 'i', 'x', '_', 'm', 'a', 't', 'c', 'h', '\030', '\n', ' ', '\001', '(', '\t', 'B',
+'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 's', 'u', 'f', 'f', 'i', 'x', 'M', 'a', 't', 'c', 'h', '\022', '0',
+'\n', '\016', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '_', 'm', 'a', 't', 'c', 'h', '\030', '\014', ' ', '\001', '(', '\t', 'B', '\007', '\372',
+'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\r', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', 'M', 'a', 't', 'c', 'h', '\022', '!',
+'\n', '\014', 'i', 'n', 'v', 'e', 'r', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\013', 'i', 'n', 'v',
+'e', 'r', 't', 'M', 'a', 't', 'c', 'h', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B',
+'\030', '\n', '\026', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'm', 'a', 't', 'c', 'h', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r',
+'J', '\004', '\010', '\002', '\020', '\003', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\013', 'r', 'e', 'g', 'e', 'x',
+'_', 'm', 'a', 't', 'c', 'h', '\"', '\241', '\002', '\n', '\025', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r',
+'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', '\036', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\n', '\372', 'B',
+'\007', 'r', '\005', '\020', '\001', '(', '\200', '\010', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'S', '\n', '\014', 's', 't', 'r', 'i', 'n', 'g', '_',
+'m', 'a', 't', 'c', 'h', '\030', '\005', ' ', '\001', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.',
+'m', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B',
+'\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\013', 's', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', '\022',
+'%', '\n', '\r', 'p', 'r', 'e', 's', 'e', 'n', 't', '_', 'm', 'a', 't', 'c', 'h', '\030', '\006', ' ', '\001', '(', '\010', 'H', '\000', 'R',
+'\014', 'p', 'r', 'e', 's', 'e', 'n', 't', 'M', 'a', 't', 'c', 'h', ':', '/', '\232', '\305', '\210', '\036', '*', '\n', '(', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'r', 'o', 'u', 't', 'e', '.', 'Q', 'u', 'e', 'r', 'y', 'P', 'a', 'r', 'a',
+'m', 'e', 't', 'e', 'r', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '!', '\n', '\037', 'q', 'u', 'e', 'r', 'y', '_', 'p', 'a', 'r',
+'a', 'm', 'e', 't', 'e', 'r', '_', 'm', 'a', 't', 'c', 'h', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'J', '\004', '\010',
+'\003', '\020', '\004', 'J', '\004', '\010', '\004', '\020', '\005', 'R', '\005', 'v', 'a', 'l', 'u', 'e', 'R', '\005', 'r', 'e', 'g', 'e', 'x', '\"', '\271',
+'\002', '\n', '\026', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'P', 'o', 'l', 'i', 'c', 'y',
+'\022', 'R', '\n', '\026', 'm', 'a', 'x', '_', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't',
+'s', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\024', 'm', 'a', 'x', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l',
+'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 's', '\022', '@', '\n', '\027', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', '_', 'r', 'e', 's',
+'p', 'o', 'n', 's', 'e', '_', 'c', 'o', 'd', 'e', 's', '\030', '\002', ' ', '\003', '(', '\r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002',
+'\020', '\005', 'R', '\025', 'r', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'C', 'o', 'd', 'e', 's',
+'\022', 'J', '\n', '\n', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '*', '.', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E',
+'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\n', 'p', 'r', 'e', 'd', 'i', 'c', 'a', 't', 'e',
+'s', '\022', '=', '\n', '\033', 'a', 'l', 'l', 'o', 'w', '_', 'c', 'r', 'o', 's', 's', '_', 's', 'c', 'h', 'e', 'm', 'e', '_', 'r',
+'e', 'd', 'i', 'r', 'e', 'c', 't', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\030', 'a', 'l', 'l', 'o', 'w', 'C', 'r', 'o', 's', 's',
+'S', 'c', 'h', 'e', 'm', 'e', 'R', 'e', 'd', 'i', 'r', 'e', 'c', 't', 'B', 'E', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v', 'o',
+'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e',
+'.', 'v', '3', 'B', '\024', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'm', 'p', 'o', 'n', 'e', 'n', 't', 's', 'P', 'r', 'o', 't', 'o',
+'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[19] = {
+static upb_def_init *deps[18] = {
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_core_v3_extension_proto_upbdefinit,
&envoy_config_core_v3_proxy_protocol_proto_upbdefinit,
&envoy_type_v3_range_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
- &google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_migrate_proto_upbdefinit,
deps,
layouts,
"envoy/config/route/v3/route_components.proto",
- UPB_STRVIEW_INIT(descriptor, 18792)
+ UPB_STRVIEW_INIT(descriptor, 19368)
};
return upb_symtab_lookupmsg(s, "envoy.config.route.v3.RateLimit.Action.DynamicMetaData");
}
+UPB_INLINE const upb_msgdef *envoy_config_route_v3_RateLimit_Action_MetaData_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_config_route_v3_route_components_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.config.route.v3.RateLimit.Action.MetaData");
+}
+
UPB_INLINE const upb_msgdef *envoy_config_route_v3_RateLimit_Override_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &envoy_config_route_v3_route_components_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "envoy.config.route.v3.RateLimit.Override");
#include "envoy/config/trace/v3/http_tracer.upbdefs.h"
extern upb_def_init google_protobuf_any_proto_upbdefinit;
-extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern upb_def_init validate_validate_proto_upbdefinit;
&envoy_config_trace_v3_Tracing_Http_msginit,
};
-static const char descriptor[562] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 't', 'r', 'a', 'c', 'e', '/', 'v', '3', '/', 'h',
+static const char descriptor[532] = {'\n', '\'', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 't', 'r', 'a', 'c', 'e', '/', 'v', '3', '/', 'h',
't', 't', 'p', '_', 't', 'r', 'a', 'c', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'c',
'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '3', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd',
-'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's',
-'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a',
-'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\221', '\002', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022',
-'7', '\n', '\004', 'h', 't', 't', 'p', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'H', 't', 't', 'p',
-'R', '\004', 'h', 't', 't', 'p', '\032', '\246', '\001', '\n', '\004', 'H', 't', 't', 'p', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001',
-' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y',
-'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n',
-'f', 'i', 'g', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'t', 'r', 'a', 'c', 'e', '.', 'v', '2', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'H', 't', 't', 'p', 'B', '\r', '\n', '\013',
-'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g',
-':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a',
-'c', 'e', '.', 'v', '2', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'B', '@', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y',
-'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.',
-'v', '3', 'B', '\017', 'H', 't', 't', 'p', 'T', 'r', 'a', 'c', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321',
-'\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u',
+'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n',
+'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't',
+'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\221', '\002', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022', '7', '\n', '\004', 'h', 't',
+'t', 'p', '\030', '\001', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't',
+'r', 'a', 'c', 'e', '.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'H', 't', 't', 'p', 'R', '\004', 'h', 't', 't',
+'p', '\032', '\246', '\001', '\n', '\004', 'H', 't', 't', 'p', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B',
+'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c',
+'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', ')',
+'\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e',
+'.', 'v', '2', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'H', 't', 't', 'p', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i',
+'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', ':', '$', '\232', '\305', '\210',
+'\036', '\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '2',
+'.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'B', '@', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '3', 'B', '\017', 'H',
+'t', 't', 'p', 'T', 'r', 'a', 'c', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b',
+'\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[6] = {
+static upb_def_init *deps[5] = {
&google_protobuf_any_proto_upbdefinit,
- &google_protobuf_struct_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
&validate_validate_proto_upbdefinit,
deps,
layouts,
"envoy/config/trace/v3/http_tracer.proto",
- UPB_STRVIEW_INIT(descriptor, 562)
+ UPB_STRVIEW_INIT(descriptor, 532)
};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/clusters/aggregate/v3/cluster.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h"
+
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
+extern const upb_msglayout envoy_extensions_clusters_aggregate_v3_ClusterConfig_msginit;
+
+static const upb_msglayout *layouts[1] = {
+ &envoy_extensions_clusters_aggregate_v3_ClusterConfig_msginit,
+};
+
+static const char descriptor[389] = {'\n', '4', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'c', 'l', 'u', 's', 't', 'e',
+'r', 's', '/', 'a', 'g', 'g', 'r', 'e', 'g', 'a', 't', 'e', '/', 'v', '3', '/', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'p',
+'r', 'o', 't', 'o', '\022', '&', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'c', 'l',
+'u', 's', 't', 'e', 'r', 's', '.', 'a', 'g', 'g', 'r', 'e', 'g', 'a', 't', 'e', '.', 'v', '3', '\032', '\035', 'u', 'd', 'p', 'a',
+'/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o',
+'\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o',
+'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i',
+'d', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', 'r', '\n', '\r', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f',
+'i', 'g', '\022', '$', '\n', '\010', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\t', 'B', '\010', '\372', 'B', '\005',
+'\222', '\001', '\002', '\010', '\001', 'R', '\010', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', ':', ';', '\232', '\305', '\210', '\036', '6', '\n', '4', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', '.', 'a', 'g', 'g', 'r', 'e',
+'g', 'a', 't', 'e', '.', 'v', '2', 'a', 'l', 'p', 'h', 'a', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'C', 'o', 'n', 'f', 'i',
+'g', 'B', 'N', '\n', '4', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'c', 'l', 'u', 's', 't', 'e', 'r', 's', '.', 'a', 'g', 'g', 'r', 'e',
+'g', 'a', 't', 'e', '.', 'v', '3', 'B', '\014', 'C', 'l', 'u', 's', 't', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200',
+'\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[4] = {
+ &udpa_annotations_status_proto_upbdefinit,
+ &udpa_annotations_versioning_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init envoy_extensions_clusters_aggregate_v3_cluster_proto_upbdefinit = {
+ deps,
+ layouts,
+ "envoy/extensions/clusters/aggregate/v3/cluster.proto",
+ UPB_STRVIEW_INIT(descriptor, 389)
+};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * envoy/extensions/clusters/aggregate/v3/cluster.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef ENVOY_EXTENSIONS_CLUSTERS_AGGREGATE_V3_CLUSTER_PROTO_UPBDEFS_H_
+#define ENVOY_EXTENSIONS_CLUSTERS_AGGREGATE_V3_CLUSTER_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init envoy_extensions_clusters_aggregate_v3_cluster_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *envoy_extensions_clusters_aggregate_v3_ClusterConfig_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_extensions_clusters_aggregate_v3_cluster_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.extensions.clusters.aggregate.v3.ClusterConfig");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* ENVOY_EXTENSIONS_CLUSTERS_AGGREGATE_V3_CLUSTER_PROTO_UPBDEFS_H_ */
extern upb_def_init envoy_type_v3_percent_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
-extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_resource_locator_proto_upbdefinit;
-extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern upb_def_init udpa_annotations_security_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
&envoy_extensions_filters_network_http_connection_manager_v3_RequestIDExtension_msginit,
};
-static const char descriptor[10148] = {'\n', 'Y', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r',
+static const char descriptor[10108] = {'\n', 'Y', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 'f', 'i', 'l', 't', 'e', 'r',
's', '/', 'n', 'e', 't', 'w', 'o', 'r', 'k', '/', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
'_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '/', 'v', '3', '/', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', ';', 'e', 'n', 'v', 'o', 'y', '.', 'e',
'a', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\033', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'v', '3', '/', 'p',
'e', 'r', 'c', 'e', 'n', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't',
'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o',
-'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't',
-'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e',
-'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r', 'e',
-'s', 'o', 'u', 'r', 'c', 'e', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v',
-'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o',
-'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's',
-'/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o',
-'t', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u',
-'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r',
-'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r',
-'s', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v',
-'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\321', ')', '\n', '\025', 'H', 't', 't', 'p', 'C', 'o', 'n',
-'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '\022', '\205', '\001', '\n', '\n', 'c', 'o', 'd', 'e', 'c', '_',
-'t', 'y', 'p', 'e', '\030', '\001', ' ', '\001', '(', '\016', '2', '\\', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's',
-'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p',
-'_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't',
-'t', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'C', 'o', 'd', 'e', 'c',
-'T', 'y', 'p', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\t', 'c', 'o', 'd', 'e', 'c', 'T', 'y', 'p', 'e',
-'\022', '(', '\n', '\013', 's', 't', 'a', 't', '_', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B',
-'\004', 'r', '\002', '\020', '\001', 'R', '\n', 's', 't', 'a', 't', 'P', 'r', 'e', 'f', 'i', 'x', '\022', 'T', '\n', '\003', 'r', 'd', 's', '\030',
-'\003', ' ', '\001', '(', '\013', '2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
-'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n',
-'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'R', 'd', 's', 'H', '\000', 'R', '\003',
-'r', 'd', 's', '\022', 'N', '\n', '\014', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013',
-'2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.',
-'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\013', 'r', 'o', 'u',
-'t', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'p', '\n', '\r', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'o', 'u', 't', 'e', 's',
-'\030', '\037', ' ', '\001', '(', '\013', '2', 'I', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
+'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o',
+'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r',
+'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g',
+'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\037', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i',
+'o', 'n', 's', '/', 's', 'e', 'c', 'u', 'r', 'i', 't', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/',
+'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n',
+'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd',
+'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\222', '+', '\n', '\025', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't',
+'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '\022', '\205', '\001', '\n', '\n', 'c', 'o', 'd', 'e', 'c', '_', 't', 'y', 'p', 'e',
+'\030', '\001', ' ', '\001', '(', '\016', '2', '\\', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
'.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
-'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd',
-'R', 'o', 'u', 't', 'e', 's', 'H', '\000', 'R', '\014', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '\022', 'j', '\n',
-'\014', 'h', 't', 't', 'p', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', 'G', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't',
-'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a',
-'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\013', 'h', 't', 't', 'p', 'F', 'i',
-'l', 't', 'e', 'r', 's', '\022', '@', '\n', '\016', 'a', 'd', 'd', '_', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '\030', '\006',
-' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o',
-'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\014', 'a', 'd', 'd', 'U', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', '\022', 't', '\n', '\007',
-'t', 'r', 'a', 'c', 'i', 'n', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'Z', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't',
-'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h',
-'t', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3',
-'.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'T', 'r',
-'a', 'c', 'i', 'n', 'g', 'R', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\022', 's', '\n', '\034', 'c', 'o', 'm', 'm', 'o', 'n', '_',
-'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '#', ' ', '\001',
-'(', '\013', '2', ')', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
-'.', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\007', '\212', '\223', '\267',
-'*', '\002', '\010', '\001', 'R', '\031', 'c', 'o', 'm', 'm', 'o', 'n', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O',
-'p', 't', 'i', 'o', 'n', 's', '\022', '^', '\n', '\025', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o',
-'p', 't', 'i', 'o', 'n', 's', '\030', '\010', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O',
-'p', 't', 'i', 'o', 'n', 's', 'R', '\023', 'h', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o',
-'n', 's', '\022', 'i', '\n', '\026', 'h', 't', 't', 'p', '2', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i',
-'o', 'n', 's', '\030', '\t', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i',
-'o', 'n', 's', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\024', 'h', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c',
-'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', ',', '\n', '\013', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030',
-'\n', ' ', '\001', '(', '\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\n', 's', 'e', 'r', 'v', 'e',
-'r', 'N', 'a', 'm', 'e', '\022', '\271', '\001', '\n', '\034', 's', 'e', 'r', 'v', 'e', 'r', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 't',
-'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\030', '\"', ' ', '\001', '(', '\016', '2', 'm', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't',
-'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a',
-'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a',
-'g', 'e', 'r', '.', 'S', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm',
-'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\032', 's', 'e', 'r', 'v', 'e', 'r', 'H', 'e',
-'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\022', '\\', '\n', '\026', 'm', 'a', 'x',
-'_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 'k', 'b', '\030', '\035', ' ', '\001', '(', '\013',
-'2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2',
-'V', 'a', 'l', 'u', 'e', 'B', '\t', '\372', 'B', '\006', '*', '\004', '\030', '`', ' ', '\000', 'R', '\023', 'm', 'a', 'x', 'R', 'e', 'q', 'u',
-'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'K', 'b', '\022', 'R', '\n', '\023', 's', 't', 'r', 'e', 'a', 'm', '_', 'i', 'd',
-'l', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\030', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e',
-'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\007', '\212', '\223', '\267', '*', '\002',
-'\010', '\001', 'R', '\021', 's', 't', 'r', 'e', 'a', 'm', 'I', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'K', '\n', '\017',
-'r', 'e', 'q', 'u', 'e', 's', 't', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\034', ' ', '\001', '(', '\013', '2', '\031', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\007',
-'\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '>',
-'\n', '\r', 'd', 'r', 'a', 'i', 'n', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\014', ' ', '\001', '(', '\013', '2', '\031', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\014',
-'d', 'r', 'a', 'i', 'n', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'M', '\n', '\025', 'd', 'e', 'l', 'a', 'y', 'e', 'd', '_', 'c',
-'l', 'o', 's', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\032', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\023', 'd', 'e', 'l',
-'a', 'y', 'e', 'd', 'C', 'l', 'o', 's', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'C', '\n', '\n', 'a', 'c', 'c', 'e', 's',
-'s', '_', 'l', 'o', 'g', '\030', '\r', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'R',
-'\t', 'a', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', '\022', 'Q', '\n', '\022', 'u', 's', 'e', '_', 'r', 'e', 'm', 'o', 't', 'e', '_',
-'a', 'd', 'd', 'r', 'e', 's', 's', '\030', '\016', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
-'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001',
-'R', '\020', 'u', 's', 'e', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', '\022', '/', '\n', '\024', 'x', 'f', 'f',
-'_', 'n', 'u', 'm', '_', 't', 'r', 'u', 's', 't', 'e', 'd', '_', 'h', 'o', 'p', 's', '\030', '\023', ' ', '\001', '(', '\r', 'R', '\021',
-'x', 'f', 'f', 'N', 'u', 'm', 'T', 'r', 'u', 's', 't', 'e', 'd', 'H', 'o', 'p', 's', '\022', '\240', '\001', '\n', '\027', 'i', 'n', 't',
-'e', 'r', 'n', 'a', 'l', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\031', ' ', '\001', '(',
-'\013', '2', 'h', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
+'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o',
+'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'C', 'o', 'd', 'e', 'c', 'T', 'y', 'p', 'e',
+'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\t', 'c', 'o', 'd', 'e', 'c', 'T', 'y', 'p', 'e', '\022', '(', '\n', '\013',
+'s', 't', 'a', 't', '_', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020',
+'\001', 'R', '\n', 's', 't', 'a', 't', 'P', 'r', 'e', 'f', 'i', 'x', '\022', 'T', '\n', '\003', 'r', 'd', 's', '\030', '\003', ' ', '\001', '(',
+'\013', '2', '@', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
-'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't',
-'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's',
-'s', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\025', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C',
-'o', 'n', 'f', 'i', 'g', '\022', '&', '\n', '\017', 's', 'k', 'i', 'p', '_', 'x', 'f', 'f', '_', 'a', 'p', 'p', 'e', 'n', 'd', '\030',
-'\025', ' ', '\001', '(', '\010', 'R', '\r', 's', 'k', 'i', 'p', 'X', 'f', 'f', 'A', 'p', 'p', 'e', 'n', 'd', '\022', '\020', '\n', '\003', 'v',
-'i', 'a', '\030', '\026', ' ', '\001', '(', '\t', 'R', '\003', 'v', 'i', 'a', '\022', 'J', '\n', '\023', 'g', 'e', 'n', 'e', 'r', 'a', 't', 'e',
-'_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd', '\030', '\017', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\021', 'g', 'e', 'n',
-'e', 'r', 'a', 't', 'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd', '\022', '?', '\n', '\034', 'p', 'r', 'e', 's', 'e', 'r', 'v',
-'e', '_', 'e', 'x', 't', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd', '\030', ' ', ' ', '\001',
-'(', '\010', 'R', '\031', 'p', 'r', 'e', 's', 'e', 'r', 'v', 'e', 'E', 'x', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'q', 'u', 'e',
-'s', 't', 'I', 'd', '\022', 'G', '\n', '!', 'a', 'l', 'w', 'a', 'y', 's', '_', 's', 'e', 't', '_', 'r', 'e', 'q', 'u', 'e', 's',
-'t', '_', 'i', 'd', '_', 'i', 'n', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '\030', '%', ' ', '\001', '(', '\010', 'R', '\034', 'a',
-'l', 'w', 'a', 'y', 's', 'S', 'e', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd', 'I', 'n', 'R', 'e', 's', 'p', 'o', 'n',
-'s', 'e', '\022', '\264', '\001', '\n', '\033', 'f', 'o', 'r', 'w', 'a', 'r', 'd', '_', 'c', 'l', 'i', 'e', 'n', 't', '_', 'c', 'e', 'r',
-'t', '_', 'd', 'e', 't', 'a', 'i', 'l', 's', '\030', '\020', ' ', '\001', '(', '\016', '2', 'k', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e',
+'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'R', 'd', 's', 'H', '\000', 'R', '\003', 'r', 'd', 's', '\022',
+'N', '\n', '\014', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', ')', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't',
+'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'H', '\000', 'R', '\013', 'r', 'o', 'u', 't', 'e', 'C', 'o',
+'n', 'f', 'i', 'g', '\022', 'p', '\n', '\r', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'o', 'u', 't', 'e', 's', '\030', '\037', ' ', '\001',
+'(', '\013', '2', 'I', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l',
+'t', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't',
+'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't',
+'e', 's', 'H', '\000', 'R', '\014', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '\022', 'j', '\n', '\014', 'h', 't', 't',
+'p', '_', 'f', 'i', 'l', 't', 'e', 'r', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e',
+'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
+'.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.',
+'v', '3', '.', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\013', 'h', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r',
+'s', '\022', '@', '\n', '\016', 'a', 'd', 'd', '_', 'u', 's', 'e', 'r', '_', 'a', 'g', 'e', 'n', 't', '\030', '\006', ' ', '\001', '(', '\013',
+'2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a',
+'l', 'u', 'e', 'R', '\014', 'a', 'd', 'd', 'U', 's', 'e', 'r', 'A', 'g', 'e', 'n', 't', '\022', 't', '\n', '\007', 't', 'r', 'a', 'c',
+'i', 'n', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', 'Z', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i',
+'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_',
+'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't',
+'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'T', 'r', 'a', 'c', 'i', 'n',
+'g', 'R', '\007', 't', 'r', 'a', 'c', 'i', 'n', 'g', '\022', 's', '\n', '\034', 'c', 'o', 'm', 'm', 'o', 'n', '_', 'h', 't', 't', 'p',
+'_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030', '#', ' ', '\001', '(', '\013', '2', ')',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't',
+'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001',
+'R', '\031', 'c', 'o', 'm', 'm', 'o', 'n', 'H', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o',
+'n', 's', '\022', '^', '\n', '\025', 'h', 't', 't', 'p', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o',
+'n', 's', '\030', '\010', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
+'o', 'r', 'e', '.', 'v', '3', '.', 'H', 't', 't', 'p', '1', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o',
+'n', 's', 'R', '\023', 'h', 't', 't', 'p', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', '\022', 'i',
+'\n', '\026', 'h', 't', 't', 'p', '2', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'o', 'p', 't', 'i', 'o', 'n', 's', '\030',
+'\t', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e',
+'.', 'v', '3', '.', 'H', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p', 't', 'i', 'o', 'n', 's', 'B',
+'\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\024', 'h', 't', 't', 'p', '2', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'O', 'p',
+'t', 'i', 'o', 'n', 's', '\022', ',', '\n', '\013', 's', 'e', 'r', 'v', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\n', ' ', '\001', '(',
+'\t', 'B', '\013', '\372', 'B', '\010', 'r', '\006', '\300', '\001', '\002', '\310', '\001', '\000', 'R', '\n', 's', 'e', 'r', 'v', 'e', 'r', 'N', 'a', 'm',
+'e', '\022', '\271', '\001', '\n', '\034', 's', 'e', 'r', 'v', 'e', 'r', '_', 'h', 'e', 'a', 'd', 'e', 'r', '_', 't', 'r', 'a', 'n', 's',
+'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\030', '\"', ' ', '\001', '(', '\016', '2', 'm', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e',
'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
'.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.',
'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.',
-'F', 'o', 'r', 'w', 'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', 'B',
-'\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\030', 'f', 'o', 'r', 'w', 'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C',
-'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '\264', '\001', '\n', '\037', 's', 'e', 't', '_', 'c', 'u', 'r', 'r', 'e', 'n',
-'t', '_', 'c', 'l', 'i', 'e', 'n', 't', '_', 'c', 'e', 'r', 't', '_', 'd', 'e', 't', 'a', 'i', 'l', 's', '\030', '\021', ' ', '\001',
-'(', '\013', '2', 'n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l',
-'t', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't',
-'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c',
-'t', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i',
-'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', 'R', '\033', 's', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n',
-'t', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', ',', '\n', '\022', 'p', 'r', 'o',
-'x', 'y', '_', '1', '0', '0', '_', 'c', 'o', 'n', 't', 'i', 'n', 'u', 'e', '\030', '\022', ' ', '\001', '(', '\010', 'R', '\020', 'p', 'r',
-'o', 'x', 'y', '1', '0', '0', 'C', 'o', 'n', 't', 'i', 'n', 'u', 'e', '\022', 'e', '\n', '1', 'r', 'e', 'p', 'r', 'e', 's', 'e',
-'n', 't', '_', 'i', 'p', 'v', '4', '_', 'r', 'e', 'm', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'a', 's',
-'_', 'i', 'p', 'v', '4', '_', 'm', 'a', 'p', 'p', 'e', 'd', '_', 'i', 'p', 'v', '6', '\030', '\024', ' ', '\001', '(', '\010', 'R', '*',
-'r', 'e', 'p', 'r', 'e', 's', 'e', 'n', 't', 'I', 'p', 'v', '4', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's',
-'s', 'A', 's', 'I', 'p', 'v', '4', 'M', 'a', 'p', 'p', 'e', 'd', 'I', 'p', 'v', '6', '\022', '\211', '\001', '\n', '\017', 'u', 'p', 'g',
-'r', 'a', 'd', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\027', ' ', '\003', '(', '\013', '2', '`', '.', 'e', 'n', 'v', 'o',
-'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w',
-'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g',
-'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g',
-'e', 'r', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u', 'p', 'g', 'r', 'a', 'd', 'e',
-'C', 'o', 'n', 'f', 'i', 'g', 's', '\022', 'A', '\n', '\016', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', '_', 'p', 'a', 't', 'h',
-'\030', '\036', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
-'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\r', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', 'P', 'a', 't', 'h', '\022',
-'#', '\n', '\r', 'm', 'e', 'r', 'g', 'e', '_', 's', 'l', 'a', 's', 'h', 'e', 's', '\030', '!', ' ', '\001', '(', '\010', 'R', '\014', 'm',
-'e', 'r', 'g', 'e', 'S', 'l', 'a', 's', 'h', 'e', 's', '\022', '\201', '\001', '\n', '\024', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i',
-'d', '_', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\030', '$', ' ', '\001', '(', '\013', '2', 'O', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o',
-'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e',
-'r', '.', 'v', '3', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'R', '\022',
-'r', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022', '{', '\n', '\022', 'l', 'o', 'c',
-'a', 'l', '_', 'r', 'e', 'p', 'l', 'y', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '&', ' ', '\001', '(', '\013', '2', 'M', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n',
-'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a',
-'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'L', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o', 'n', 'f', 'i', 'g',
-'R', '\020', 'l', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '7', '\n', '\030', 's', 't', 'r',
-'i', 'p', '_', 'm', 'a', 't', 'c', 'h', 'i', 'n', 'g', '_', 'h', 'o', 's', 't', '_', 'p', 'o', 'r', 't', '\030', '\'', ' ', '\001',
-'(', '\010', 'R', '\025', 's', 't', 'r', 'i', 'p', 'M', 'a', 't', 'c', 'h', 'i', 'n', 'g', 'H', 'o', 's', 't', 'P', 'o', 'r', 't',
-'\022', 'i', '\n', '$', 's', 't', 'r', 'e', 'a', 'm', '_', 'e', 'r', 'r', 'o', 'r', '_', 'o', 'n', '_', 'i', 'n', 'v', 'a', 'l',
-'i', 'd', '_', 'h', 't', 't', 'p', '_', 'm', 'e', 's', 's', 'a', 'g', 'e', '\030', '(', ' ', '\001', '(', '\013', '2', '\032', '.', 'g',
-'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R',
-'\037', 's', 't', 'r', 'e', 'a', 'm', 'E', 'r', 'r', 'o', 'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p',
-'M', 'e', 's', 's', 'a', 'g', 'e', '\032', '\366', '\004', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022', '?', '\n', '\017', 'c', 'l',
-'i', 'e', 'n', 't', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v',
-'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'c', 'l', 'i', 'e', 'n',
-'t', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', '?', '\n', '\017', 'r', 'a', 'n', 'd', 'o', 'm', '_', 's', 'a', 'm', 'p', 'l',
-'i', 'n', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3',
-'.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'r', 'a', 'n', 'd', 'o', 'm', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022',
-'A', '\n', '\020', 'o', 'v', 'e', 'r', 'a', 'l', 'l', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\005', ' ', '\001', '(', '\013',
-'2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R',
-'\017', 'o', 'v', 'e', 'r', 'a', 'l', 'l', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', '\030', '\n', '\007', 'v', 'e', 'r', 'b', 'o',
-'s', 'e', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\007', 'v', 'e', 'r', 'b', 'o', 's', 'e', '\022', 'K', '\n', '\023', 'm', 'a', 'x', '_',
-'p', 'a', 't', 'h', '_', 't', 'a', 'g', '_', 'l', 'e', 'n', 'g', 't', 'h', '\030', '\007', ' ', '\001', '(', '\013', '2', '\034', '.', 'g',
+'S', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o',
+'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\032', 's', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r',
+'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', 'n', '\022', '\\', '\n', '\026', 'm', 'a', 'x', '_', 'r', 'e', 'q',
+'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 'k', 'b', '\030', '\035', ' ', '\001', '(', '\013', '2', '\034', '.', 'g',
'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u',
-'e', 'R', '\020', 'm', 'a', 'x', 'P', 'a', 't', 'h', 'T', 'a', 'g', 'L', 'e', 'n', 'g', 't', 'h', '\022', 'A', '\n', '\013', 'c', 'u',
-'s', 't', 'o', 'm', '_', 't', 'a', 'g', 's', '\030', '\010', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't',
-'y', 'p', 'e', '.', 't', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'v', '3', '.', 'C', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 'R',
-'\n', 'c', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 's', '\022', '?', '\n', '\010', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\t',
-' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e',
-'.', 'v', '3', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '.', 'H', 't', 't', 'p', 'R', '\010', 'p', 'r', 'o', 'v', 'i', 'd', 'e',
-'r', '\"', '(', '\n', '\r', 'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', 'N', 'a', 'm', 'e', '\022', '\013', '\n', '\007', 'I', 'N', 'G',
-'R', 'E', 'S', 'S', '\020', '\000', '\022', '\n', '\n', '\006', 'E', 'G', 'R', 'E', 'S', 'S', '\020', '\001', ':', '[', '\232', '\305', '\210', '\036', 'V',
-'\n', 'T', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't',
-'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a',
-'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a',
-'g', 'e', 'r', '.', 'T', 'r', 'a', 'c', 'i', 'n', 'g', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\016',
-'o', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', '_', 'n', 'a', 'm', 'e', 'R', '\030', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h',
-'e', 'a', 'd', 'e', 'r', 's', '_', 'f', 'o', 'r', '_', 't', 'a', 'g', 's', '\032', '\245', '\001', '\n', '\025', 'I', 'n', 't', 'e', 'r',
-'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 'u', 'n', 'i', 'x', '_',
-'s', 'o', 'c', 'k', 'e', 't', 's', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\013', 'u', 'n', 'i', 'x', 'S', 'o', 'c', 'k', 'e', 't',
-'s', ':', 'i', '\232', '\305', '\210', '\036', 'd', '\n', 'b', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i',
-'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't',
-'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c',
-'t', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e',
-'s', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\032', '\230', '\002', '\n', '\033', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l',
-'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '4', '\n', '\007', 's', 'u', 'b', 'j', 'e', 'c',
-'t', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
-'.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 's', 'u', 'b', 'j', 'e', 'c', 't', '\022', '\022', '\n', '\004', 'c', 'e',
-'r', 't', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\004', 'c', 'e', 'r', 't', '\022', '\024', '\n', '\005', 'c', 'h', 'a', 'i', 'n', '\030', '\006',
-' ', '\001', '(', '\010', 'R', '\005', 'c', 'h', 'a', 'i', 'n', '\022', '\020', '\n', '\003', 'd', 'n', 's', '\030', '\004', ' ', '\001', '(', '\010', 'R',
-'\003', 'd', 'n', 's', '\022', '\020', '\n', '\003', 'u', 'r', 'i', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\003', 'u', 'r', 'i', ':', 'o', '\232',
-'\305', '\210', '\036', 'j', '\n', 'h', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r',
-'.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_',
-'m', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
-'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C',
-'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', 'J', '\004', '\010', '\002', '\020', '\003', '\032', '\256', '\002', '\n', '\r', 'U', 'p', 'g', 'r',
-'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '_', 't', 'y', 'p', 'e',
-'\030', '\001', ' ', '\001', '(', '\t', 'R', '\013', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'T', 'y', 'p', 'e', '\022', 'a', '\n', '\007', 'f', 'i',
-'l', 't', 'e', 'r', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n',
+'e', 'B', '\t', '\372', 'B', '\006', '*', '\004', '\030', '`', ' ', '\000', 'R', '\023', 'm', 'a', 'x', 'R', 'e', 'q', 'u', 'e', 's', 't', 'H',
+'e', 'a', 'd', 'e', 'r', 's', 'K', 'b', '\022', 'R', '\n', '\023', 's', 't', 'r', 'e', 'a', 'm', '_', 'i', 'd', 'l', 'e', '_', 't',
+'i', 'm', 'e', 'o', 'u', 't', '\030', '\030', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\021',
+'s', 't', 'r', 'e', 'a', 'm', 'I', 'd', 'l', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'K', '\n', '\017', 'r', 'e', 'q', 'u',
+'e', 's', 't', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\034', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\007', '\212', '\223', '\267', '*',
+'\002', '\010', '\001', 'R', '\016', 'r', 'e', 'q', 'u', 'e', 's', 't', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'b', '\n', '\027', 'r', 'e',
+'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', ')', ' ', '\001',
+'(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a',
+'t', 'i', 'o', 'n', 'B', '\017', '\372', 'B', '\005', '\252', '\001', '\002', '2', '\000', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\025', 'r', 'e',
+'q', 'u', 'e', 's', 't', 'H', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '>', '\n', '\r', 'd', 'r',
+'a', 'i', 'n', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\014', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\014', 'd', 'r', 'a', 'i',
+'n', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'M', '\n', '\025', 'd', 'e', 'l', 'a', 'y', 'e', 'd', '_', 'c', 'l', 'o', 's', 'e',
+'_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\030', '\032', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
+'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'R', '\023', 'd', 'e', 'l', 'a', 'y', 'e', 'd',
+'C', 'l', 'o', 's', 'e', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', 'C', '\n', '\n', 'a', 'c', 'c', 'e', 's', 's', '_', 'l', 'o',
+'g', '\030', '\r', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c',
+'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'R', '\t', 'a', 'c', 'c',
+'e', 's', 's', 'L', 'o', 'g', '\022', 'Q', '\n', '\022', 'u', 's', 'e', '_', 'r', 'e', 'm', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r',
+'e', 's', 's', '\030', '\016', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
+'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'B', '\007', '\212', '\223', '\267', '*', '\002', '\010', '\001', 'R', '\020', 'u', 's',
+'e', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', '\022', '/', '\n', '\024', 'x', 'f', 'f', '_', 'n', 'u', 'm',
+'_', 't', 'r', 'u', 's', 't', 'e', 'd', '_', 'h', 'o', 'p', 's', '\030', '\023', ' ', '\001', '(', '\r', 'R', '\021', 'x', 'f', 'f', 'N',
+'u', 'm', 'T', 'r', 'u', 's', 't', 'e', 'd', 'H', 'o', 'p', 's', '\022', '\240', '\001', '\n', '\027', 'i', 'n', 't', 'e', 'r', 'n', 'a',
+'l', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\031', ' ', '\001', '(', '\013', '2', 'h', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.',
+'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C', 'o', 'n',
+'f', 'i', 'g', 'R', '\025', 'i', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C', 'o', 'n', 'f', 'i',
+'g', '\022', '&', '\n', '\017', 's', 'k', 'i', 'p', '_', 'x', 'f', 'f', '_', 'a', 'p', 'p', 'e', 'n', 'd', '\030', '\025', ' ', '\001', '(',
+'\010', 'R', '\r', 's', 'k', 'i', 'p', 'X', 'f', 'f', 'A', 'p', 'p', 'e', 'n', 'd', '\022', '\020', '\n', '\003', 'v', 'i', 'a', '\030', '\026',
+' ', '\001', '(', '\t', 'R', '\003', 'v', 'i', 'a', '\022', 'J', '\n', '\023', 'g', 'e', 'n', 'e', 'r', 'a', 't', 'e', '_', 'r', 'e', 'q',
+'u', 'e', 's', 't', '_', 'i', 'd', '\030', '\017', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r',
+'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\021', 'g', 'e', 'n', 'e', 'r', 'a', 't',
+'e', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd', '\022', '?', '\n', '\034', 'p', 'r', 'e', 's', 'e', 'r', 'v', 'e', '_', 'e', 'x',
+'t', 'e', 'r', 'n', 'a', 'l', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd', '\030', ' ', ' ', '\001', '(', '\010', 'R', '\031',
+'p', 'r', 'e', 's', 'e', 'r', 'v', 'e', 'E', 'x', 't', 'e', 'r', 'n', 'a', 'l', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd',
+'\022', 'G', '\n', '!', 'a', 'l', 'w', 'a', 'y', 's', '_', 's', 'e', 't', '_', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd',
+'_', 'i', 'n', '_', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '\030', '%', ' ', '\001', '(', '\010', 'R', '\034', 'a', 'l', 'w', 'a', 'y',
+'s', 'S', 'e', 't', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'd', 'I', 'n', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\022', '\264',
+'\001', '\n', '\033', 'f', 'o', 'r', 'w', 'a', 'r', 'd', '_', 'c', 'l', 'i', 'e', 'n', 't', '_', 'c', 'e', 'r', 't', '_', 'd', 'e',
+'t', 'a', 'i', 'l', 's', '\030', '\020', ' ', '\001', '(', '\016', '2', 'k', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n',
's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't',
'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H',
-'t', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\022', '4', '\n', '\007', 'e', 'n', 'a',
-'b', 'l', 'e', 'd', '\030', '\003', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', ':', 'a', '\232',
-'\305', '\210', '\036', '\\', '\n', 'Z', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r',
+'t', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'F', 'o', 'r', 'w',
+'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', 'B', '\010', '\372', 'B', '\005',
+'\202', '\001', '\002', '\020', '\001', 'R', '\030', 'f', 'o', 'r', 'w', 'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D',
+'e', 't', 'a', 'i', 'l', 's', '\022', '\264', '\001', '\n', '\037', 's', 'e', 't', '_', 'c', 'u', 'r', 'r', 'e', 'n', 't', '_', 'c', 'l',
+'i', 'e', 'n', 't', '_', 'c', 'e', 'r', 't', '_', 'd', 'e', 't', 'a', 'i', 'l', 's', '\030', '\021', ' ', '\001', '(', '\013', '2', 'n',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's',
'.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_',
-'m', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
-'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\"', '6', '\n', '\t',
-'C', 'o', 'd', 'e', 'c', 'T', 'y', 'p', 'e', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\022', '\t', '\n', '\005', 'H', 'T',
-'T', 'P', '1', '\020', '\001', '\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '2', '\020', '\002', '\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '3',
-'\020', '\003', '\"', 'S', '\n', '\032', 'S', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o',
-'r', 'm', 'a', 't', 'i', 'o', 'n', '\022', '\r', '\n', '\t', 'O', 'V', 'E', 'R', 'W', 'R', 'I', 'T', 'E', '\020', '\000', '\022', '\024', '\n',
-'\020', 'A', 'P', 'P', 'E', 'N', 'D', '_', 'I', 'F', '_', 'A', 'B', 'S', 'E', 'N', 'T', '\020', '\001', '\022', '\020', '\n', '\014', 'P', 'A',
-'S', 'S', '_', 'T', 'H', 'R', 'O', 'U', 'G', 'H', '\020', '\002', '\"', 'y', '\n', '\030', 'F', 'o', 'r', 'w', 'a', 'r', 'd', 'C', 'l',
-'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '\014', '\n', '\010', 'S', 'A', 'N', 'I', 'T', 'I',
-'Z', 'E', '\020', '\000', '\022', '\020', '\n', '\014', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '_', 'O', 'N', 'L', 'Y', '\020', '\001', '\022', '\022', '\n',
-'\016', 'A', 'P', 'P', 'E', 'N', 'D', '_', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '\020', '\002', '\022', '\020', '\n', '\014', 'S', 'A', 'N', 'I',
-'T', 'I', 'Z', 'E', '_', 'S', 'E', 'T', '\020', '\003', '\022', '\027', '\n', '\023', 'A', 'L', 'W', 'A', 'Y', 'S', '_', 'F', 'O', 'R', 'W',
-'A', 'R', 'D', '_', 'O', 'N', 'L', 'Y', '\020', '\004', ':', 'S', '\232', '\305', '\210', '\036', 'N', '\n', 'L', 'e', 'n', 'v', 'o', 'y', '.',
-'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't',
-'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H',
-'t', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'B', '\026', '\n', '\017', 'r',
-'o', 'u', 't', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\033', '\020', '\034',
-'J', '\004', '\010', '\013', '\020', '\014', 'R', '\014', 'i', 'd', 'l', 'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\"', '\312', '\001', '\n', '\020',
-'L', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'e', '\n', '\007', 'm', 'a', 'p', 'p', 'e',
-'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', 'K', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o',
-'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c',
-'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 's', 'p',
-'o', 'n', 's', 'e', 'M', 'a', 'p', 'p', 'e', 'r', 'R', '\007', 'm', 'a', 'p', 'p', 'e', 'r', 's', '\022', 'O', '\n', '\013', 'b', 'o',
-'d', 'y', '_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\002', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o',
-'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', 'R', '\n', 'b', 'o', 'd', 'y', 'F', 'o', 'r', 'm', 'a', 't',
-'\"', '\234', '\003', '\n', '\016', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'M', 'a', 'p', 'p', 'e', 'r', '\022', 'L', '\n', '\006', 'f', 'i',
-'l', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.', 'v', '3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'F', 'i',
-'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\022', 'J', '\n',
-'\013', 's', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013',
-'\372', 'B', '\010', '*', '\006', '\020', '\330', '\004', '(', '\310', '\001', 'R', '\n', 's', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', '\022', '4',
-'\n', '\004', 'b', 'o', 'd', 'y', '\030', '\003', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\004', 'b', 'o',
-'d', 'y', '\022', '`', '\n', '\024', 'b', 'o', 'd', 'y', '_', 'f', 'o', 'r', 'm', 'a', 't', '_', 'o', 'v', 'e', 'r', 'r', 'i', 'd',
-'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S',
-'t', 'r', 'i', 'n', 'g', 'R', '\022', 'b', 'o', 'd', 'y', 'F', 'o', 'r', 'm', 'a', 't', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e',
-'\022', 'X', '\n', '\016', 'h', 'e', 'a', 'd', 'e', 'r', 's', '_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\005', ' ', '\003', '(', '\013', '2',
-'\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e',
-'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p', 't', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350',
-'\007', 'R', '\014', 'h', 'e', 'a', 'd', 'e', 'r', 's', 'T', 'o', 'A', 'd', 'd', '\"', '\310', '\002', '\n', '\003', 'R', 'd', 's', '\022', 'Q',
-'\n', '\r', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i',
-'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\014', 'c', 'o', 'n', 'f', 'i', 'g',
-'S', 'o', 'u', 'r', 'c', 'e', '\022', 'B', '\n', '\021', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 'n', 'a',
-'m', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\026', '\362', '\230', '\376', '\217', '\005', '\020', '\022', '\016', 'n', 'a', 'm', 'e', '_', 's', 'p',
-'e', 'c', 'i', 'f', 'i', 'e', 'r', 'R', '\017', 'r', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'N', 'a', 'm', 'e', '\022',
-'g', '\n', '\024', 'r', 'd', 's', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '\030', '\003',
-' ', '\001', '(', '\013', '2', '\035', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u',
-'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'B', '\026', '\362', '\230', '\376', '\217', '\005', '\020', '\022', '\016', 'n', 'a', 'm', 'e', '_',
-'s', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'R', '\022', 'r', 'd', 's', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c',
-'a', 't', 'o', 'r', ':', 'A', '\232', '\305', '\210', '\036', '<', '\n', ':', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n',
-'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'R', 'd', 's', '\"', '\367', '\001', '\n',
-'\035', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n',
-'s', 'L', 'i', 's', 't', '\022', 'y', '\n', '\033', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n',
-'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o',
-'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010',
-'\001', 'R', '\031', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i',
-'o', 'n', 's', ':', '[', '\232', '\305', '\210', '\036', 'V', '\n', 'T', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e',
-'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o',
-'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', 'L', 'i', 's', 't', '\"', '\351', '\016', '\n',
-'\014', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001',
-'(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\217', '\001', '\n', '\021', 's', 'c', 'o',
-'p', 'e', '_', 'k', 'e', 'y', '_', 'b', 'u', 'i', 'l', 'd', 'e', 'r', '\030', '\002', ' ', '\001', '(', '\013', '2', 'Y', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e',
-'t', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n',
-'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p',
-'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\017', 's', 'c',
-'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '\022', 'X', '\n', '\021', 'r', 'd', 's', '_', 'c', 'o', 'n', 'f',
-'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\003', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c',
-'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\017', 'r', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u',
-'r', 'c', 'e', '\022', '\245', '\001', '\n', ' ', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f',
-'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', '_', 'l', 'i', 's', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', 'Z', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n',
-'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a',
-'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i',
-'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', 'L', 'i', 's', 't', 'H', '\000', 'R', '\035', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o',
-'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', 'L', 'i', 's', 't', '\022', 'g', '\n', '\n',
-'s', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'd', 's', '\030', '\005', ' ', '\001', '(', '\013', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r',
-'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r',
-'.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', 'H', '\000', 'R', '\t', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'd',
-'s', '\032', '\331', '\t', '\n', '\017', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '\022', '\221', '\001', '\n',
-'\t', 'f', 'r', 'a', 'g', 'm', 'e', 'n', 't', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', 'i', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r',
-'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r',
-'.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y',
-'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B', '\010',
-'\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\t', 'f', 'r', 'a', 'g', 'm', 'e', 'n', 't', 's', '\032', '\325', '\007', '\n', '\017', 'F',
-'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '\022', '\266', '\001', '\n', '\026', 'h', 'e', 'a', 'd', 'e', 'r',
-'_', 'v', 'a', 'l', 'u', 'e', '_', 'e', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '~', '.',
+'m', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C',
+'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', 'R', '\033', 's', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i',
+'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', ',', '\n', '\022', 'p', 'r', 'o', 'x', 'y', '_', '1',
+'0', '0', '_', 'c', 'o', 'n', 't', 'i', 'n', 'u', 'e', '\030', '\022', ' ', '\001', '(', '\010', 'R', '\020', 'p', 'r', 'o', 'x', 'y', '1',
+'0', '0', 'C', 'o', 'n', 't', 'i', 'n', 'u', 'e', '\022', 'e', '\n', '1', 'r', 'e', 'p', 'r', 'e', 's', 'e', 'n', 't', '_', 'i',
+'p', 'v', '4', '_', 'r', 'e', 'm', 'o', 't', 'e', '_', 'a', 'd', 'd', 'r', 'e', 's', 's', '_', 'a', 's', '_', 'i', 'p', 'v',
+'4', '_', 'm', 'a', 'p', 'p', 'e', 'd', '_', 'i', 'p', 'v', '6', '\030', '\024', ' ', '\001', '(', '\010', 'R', '*', 'r', 'e', 'p', 'r',
+'e', 's', 'e', 'n', 't', 'I', 'p', 'v', '4', 'R', 'e', 'm', 'o', 't', 'e', 'A', 'd', 'd', 'r', 'e', 's', 's', 'A', 's', 'I',
+'p', 'v', '4', 'M', 'a', 'p', 'p', 'e', 'd', 'I', 'p', 'v', '6', '\022', '\211', '\001', '\n', '\017', 'u', 'p', 'g', 'r', 'a', 'd', 'e',
+'_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\027', ' ', '\003', '(', '\013', '2', '`', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
+'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v',
+'3', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'U',
+'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\016', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f',
+'i', 'g', 's', '\022', 'A', '\n', '\016', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', '_', 'p', 'a', 't', 'h', '\030', '\036', ' ', '\001',
+'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
+'V', 'a', 'l', 'u', 'e', 'R', '\r', 'n', 'o', 'r', 'm', 'a', 'l', 'i', 'z', 'e', 'P', 'a', 't', 'h', '\022', '#', '\n', '\r', 'm',
+'e', 'r', 'g', 'e', '_', 's', 'l', 'a', 's', 'h', 'e', 's', '\030', '!', ' ', '\001', '(', '\010', 'R', '\014', 'm', 'e', 'r', 'g', 'e',
+'S', 'l', 'a', 's', 'h', 'e', 's', '\022', '\201', '\001', '\n', '\024', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'i', 'd', '_', 'e', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', '\030', '$', ' ', '\001', '(', '\013', '2', 'O', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't',
+'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h',
+'t', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3',
+'.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'R', '\022', 'r', 'e', 'q', 'u',
+'e', 's', 't', 'I', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022', '{', '\n', '\022', 'l', 'o', 'c', 'a', 'l', '_', 'r',
+'e', 'p', 'l', 'y', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '&', ' ', '\001', '(', '\013', '2', 'M', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o',
+'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e',
+'r', '.', 'v', '3', '.', 'L', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o', 'n', 'f', 'i', 'g', 'R', '\020', 'l', 'o',
+'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'P', '\n', '\030', 's', 't', 'r', 'i', 'p', '_', 'm',
+'a', 't', 'c', 'h', 'i', 'n', 'g', '_', 'h', 'o', 's', 't', '_', 'p', 'o', 'r', 't', '\030', '\'', ' ', '\001', '(', '\010', 'B', '\027',
+'\362', '\230', '\376', '\217', '\005', '\021', '\022', '\017', 's', 't', 'r', 'i', 'p', '_', 'p', 'o', 'r', 't', '_', 'm', 'o', 'd', 'e', 'R', '\025',
+'s', 't', 'r', 'i', 'p', 'M', 'a', 't', 'c', 'h', 'i', 'n', 'g', 'H', 'o', 's', 't', 'P', 'o', 'r', 't', '\022', '/', '\n', '\023',
+'s', 't', 'r', 'i', 'p', '_', 'a', 'n', 'y', '_', 'h', 'o', 's', 't', '_', 'p', 'o', 'r', 't', '\030', '*', ' ', '\001', '(', '\010',
+'H', '\001', 'R', '\020', 's', 't', 'r', 'i', 'p', 'A', 'n', 'y', 'H', 'o', 's', 't', 'P', 'o', 'r', 't', '\022', 'i', '\n', '$', 's',
+'t', 'r', 'e', 'a', 'm', '_', 'e', 'r', 'r', 'o', 'r', '_', 'o', 'n', '_', 'i', 'n', 'v', 'a', 'l', 'i', 'd', '_', 'h', 't',
+'t', 'p', '_', 'm', 'e', 's', 's', 'a', 'g', 'e', '\030', '(', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\037', 's', 't', 'r', 'e',
+'a', 'm', 'E', 'r', 'r', 'o', 'r', 'O', 'n', 'I', 'n', 'v', 'a', 'l', 'i', 'd', 'H', 't', 't', 'p', 'M', 'e', 's', 's', 'a',
+'g', 'e', '\032', '\366', '\004', '\n', '\007', 'T', 'r', 'a', 'c', 'i', 'n', 'g', '\022', '?', '\n', '\017', 'c', 'l', 'i', 'e', 'n', 't', '_',
+'s', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
+'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\016', 'c', 'l', 'i', 'e', 'n', 't', 'S', 'a', 'm', 'p',
+'l', 'i', 'n', 'g', '\022', '?', '\n', '\017', 'r', 'a', 'n', 'd', 'o', 'm', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\004',
+' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c',
+'e', 'n', 't', 'R', '\016', 'r', 'a', 'n', 'd', 'o', 'm', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', 'A', '\n', '\020', 'o', 'v',
+'e', 'r', 'a', 'l', 'l', '_', 's', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\030', '\005', ' ', '\001', '(', '\013', '2', '\026', '.', 'e', 'n',
+'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'v', '3', '.', 'P', 'e', 'r', 'c', 'e', 'n', 't', 'R', '\017', 'o', 'v', 'e', 'r',
+'a', 'l', 'l', 'S', 'a', 'm', 'p', 'l', 'i', 'n', 'g', '\022', '\030', '\n', '\007', 'v', 'e', 'r', 'b', 'o', 's', 'e', '\030', '\006', ' ',
+'\001', '(', '\010', 'R', '\007', 'v', 'e', 'r', 'b', 'o', 's', 'e', '\022', 'K', '\n', '\023', 'm', 'a', 'x', '_', 'p', 'a', 't', 'h', '_',
+'t', 'a', 'g', '_', 'l', 'e', 'n', 'g', 't', 'h', '\030', '\007', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\020', 'm', 'a',
+'x', 'P', 'a', 't', 'h', 'T', 'a', 'g', 'L', 'e', 'n', 'g', 't', 'h', '\022', 'A', '\n', '\013', 'c', 'u', 's', 't', 'o', 'm', '_',
+'t', 'a', 'g', 's', '\030', '\010', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 't',
+'r', 'a', 'c', 'i', 'n', 'g', '.', 'v', '3', '.', 'C', 'u', 's', 't', 'o', 'm', 'T', 'a', 'g', 'R', '\n', 'c', 'u', 's', 't',
+'o', 'm', 'T', 'a', 'g', 's', '\022', '?', '\n', '\010', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\t', ' ', '\001', '(', '\013', '2',
+'#', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 't', 'r', 'a', 'c', 'e', '.', 'v', '3', '.', 'T',
+'r', 'a', 'c', 'i', 'n', 'g', '.', 'H', 't', 't', 'p', 'R', '\010', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\"', '(', '\n', '\r',
+'O', 'p', 'e', 'r', 'a', 't', 'i', 'o', 'n', 'N', 'a', 'm', 'e', '\022', '\013', '\n', '\007', 'I', 'N', 'G', 'R', 'E', 'S', 'S', '\020',
+'\000', '\022', '\n', '\n', '\006', 'E', 'G', 'R', 'E', 'S', 'S', '\020', '\001', ':', '[', '\232', '\305', '\210', '\036', 'V', '\n', 'T', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
+'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v',
+'2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'T',
+'r', 'a', 'c', 'i', 'n', 'g', 'J', '\004', '\010', '\001', '\020', '\002', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\016', 'o', 'p', 'e', 'r', 'a',
+'t', 'i', 'o', 'n', '_', 'n', 'a', 'm', 'e', 'R', '\030', 'r', 'e', 'q', 'u', 'e', 's', 't', '_', 'h', 'e', 'a', 'd', 'e', 'r',
+'s', '_', 'f', 'o', 'r', '_', 't', 'a', 'g', 's', '\032', '\245', '\001', '\n', '\025', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd',
+'d', 'r', 'e', 's', 's', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 'u', 'n', 'i', 'x', '_', 's', 'o', 'c', 'k', 'e',
+'t', 's', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\013', 'u', 'n', 'i', 'x', 'S', 'o', 'c', 'k', 'e', 't', 's', ':', 'i', '\232', '\305',
+'\210', '\036', 'd', '\n', 'b', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.',
+'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', 'A', 'd', 'd', 'r', 'e', 's', 's', 'C', 'o', 'n',
+'f', 'i', 'g', '\032', '\230', '\002', '\n', '\033', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C',
+'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '4', '\n', '\007', 's', 'u', 'b', 'j', 'e', 'c', 't', '\030', '\001', ' ', '\001',
+'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
+'V', 'a', 'l', 'u', 'e', 'R', '\007', 's', 'u', 'b', 'j', 'e', 'c', 't', '\022', '\022', '\n', '\004', 'c', 'e', 'r', 't', '\030', '\003', ' ',
+'\001', '(', '\010', 'R', '\004', 'c', 'e', 'r', 't', '\022', '\024', '\n', '\005', 'c', 'h', 'a', 'i', 'n', '\030', '\006', ' ', '\001', '(', '\010', 'R',
+'\005', 'c', 'h', 'a', 'i', 'n', '\022', '\020', '\n', '\003', 'd', 'n', 's', '\030', '\004', ' ', '\001', '(', '\010', 'R', '\003', 'd', 'n', 's', '\022',
+'\020', '\n', '\003', 'u', 'r', 'i', '\030', '\005', ' ', '\001', '(', '\010', 'R', '\003', 'u', 'r', 'i', ':', 'o', '\232', '\305', '\210', '\036', 'j', '\n',
+'h', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w',
+'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g',
+'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g',
+'e', 'r', '.', 'S', 'e', 't', 'C', 'u', 'r', 'r', 'e', 'n', 't', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'D', 'e',
+'t', 'a', 'i', 'l', 's', 'J', '\004', '\010', '\002', '\020', '\003', '\032', '\256', '\002', '\n', '\r', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o',
+'n', 'f', 'i', 'g', '\022', '!', '\n', '\014', 'u', 'p', 'g', 'r', 'a', 'd', 'e', '_', 't', 'y', 'p', 'e', '\030', '\001', ' ', '\001', '(',
+'\t', 'R', '\013', 'u', 'p', 'g', 'r', 'a', 'd', 'e', 'T', 'y', 'p', 'e', '\022', 'a', '\n', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's',
+'\030', '\002', ' ', '\003', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
+'.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'H', 't', 't', 'p', 'F', 'i',
+'l', 't', 'e', 'r', 'R', '\007', 'f', 'i', 'l', 't', 'e', 'r', 's', '\022', '4', '\n', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', '\030',
+'\003', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B',
+'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '\007', 'e', 'n', 'a', 'b', 'l', 'e', 'd', ':', 'a', '\232', '\305', '\210', '\036', '\\', '\n',
+'Z', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w',
+'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g',
+'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g',
+'e', 'r', '.', 'U', 'p', 'g', 'r', 'a', 'd', 'e', 'C', 'o', 'n', 'f', 'i', 'g', '\"', '6', '\n', '\t', 'C', 'o', 'd', 'e', 'c',
+'T', 'y', 'p', 'e', '\022', '\010', '\n', '\004', 'A', 'U', 'T', 'O', '\020', '\000', '\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '1', '\020', '\001',
+'\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '2', '\020', '\002', '\022', '\t', '\n', '\005', 'H', 'T', 'T', 'P', '3', '\020', '\003', '\"', 'S', '\n',
+'\032', 'S', 'e', 'r', 'v', 'e', 'r', 'H', 'e', 'a', 'd', 'e', 'r', 'T', 'r', 'a', 'n', 's', 'f', 'o', 'r', 'm', 'a', 't', 'i',
+'o', 'n', '\022', '\r', '\n', '\t', 'O', 'V', 'E', 'R', 'W', 'R', 'I', 'T', 'E', '\020', '\000', '\022', '\024', '\n', '\020', 'A', 'P', 'P', 'E',
+'N', 'D', '_', 'I', 'F', '_', 'A', 'B', 'S', 'E', 'N', 'T', '\020', '\001', '\022', '\020', '\n', '\014', 'P', 'A', 'S', 'S', '_', 'T', 'H',
+'R', 'O', 'U', 'G', 'H', '\020', '\002', '\"', 'y', '\n', '\030', 'F', 'o', 'r', 'w', 'a', 'r', 'd', 'C', 'l', 'i', 'e', 'n', 't', 'C',
+'e', 'r', 't', 'D', 'e', 't', 'a', 'i', 'l', 's', '\022', '\014', '\n', '\010', 'S', 'A', 'N', 'I', 'T', 'I', 'Z', 'E', '\020', '\000', '\022',
+'\020', '\n', '\014', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '_', 'O', 'N', 'L', 'Y', '\020', '\001', '\022', '\022', '\n', '\016', 'A', 'P', 'P', 'E',
+'N', 'D', '_', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '\020', '\002', '\022', '\020', '\n', '\014', 'S', 'A', 'N', 'I', 'T', 'I', 'Z', 'E', '_',
+'S', 'E', 'T', '\020', '\003', '\022', '\027', '\n', '\023', 'A', 'L', 'W', 'A', 'Y', 'S', '_', 'F', 'O', 'R', 'W', 'A', 'R', 'D', '_', 'O',
+'N', 'L', 'Y', '\020', '\004', ':', 'S', '\232', '\305', '\210', '\036', 'N', '\n', 'L', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'C', 'o',
+'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'B', '\026', '\n', '\017', 'r', 'o', 'u', 't', 'e', '_',
+'s', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '\021', '\n', '\017', 's', 't', 'r', 'i', 'p', '_', 'p',
+'o', 'r', 't', '_', 'm', 'o', 'd', 'e', 'J', '\004', '\010', '\033', '\020', '\034', 'J', '\004', '\010', '\013', '\020', '\014', 'R', '\014', 'i', 'd', 'l',
+'e', '_', 't', 'i', 'm', 'e', 'o', 'u', 't', '\"', '\312', '\001', '\n', '\020', 'L', 'o', 'c', 'a', 'l', 'R', 'e', 'p', 'l', 'y', 'C',
+'o', 'n', 'f', 'i', 'g', '\022', 'e', '\n', '\007', 'm', 'a', 'p', 'p', 'e', 'r', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', 'K', '.',
'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.',
'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm',
-'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c',
-'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i',
-'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r',
-'H', '\000', 'R', '\024', 'h', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '\032',
-'\217', '\005', '\n', '\024', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '\022',
-'\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n',
-'a', 'm', 'e', '\022', '+', '\n', '\021', 'e', 'l', 'e', 'm', 'e', 'n', 't', '_', 's', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r', '\030',
-'\002', ' ', '\001', '(', '\t', 'R', '\020', 'e', 'l', 'e', 'm', 'e', 'n', 't', 'S', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r', '\022', '\026',
-'\n', '\005', 'i', 'n', 'd', 'e', 'x', '\030', '\003', ' ', '\001', '(', '\r', 'H', '\000', 'R', '\005', 'i', 'n', 'd', 'e', 'x', '\022', '\245', '\001',
-'\n', '\007', 'e', 'l', 'e', 'm', 'e', 'n', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\210', '\001', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r',
-'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r',
-'.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y',
-'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H',
-'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '.', 'K', 'v', 'E', 'l', 'e',
-'m', 'e', 'n', 't', 'H', '\000', 'R', '\007', 'e', 'l', 'e', 'm', 'e', 'n', 't', '\032', '\333', '\001', '\n', '\t', 'K', 'v', 'E', 'l', 'e',
-'m', 'e', 'n', 't', '\022', '%', '\n', '\t', 's', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
-'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\t', 's', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r', '\022', '\031', '\n', '\003', 'k', 'e', 'y',
-'\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\003', 'k', 'e', 'y', ':', '\213', '\001', '\232', '\305',
-'\210', '\036', '\205', '\001', '\n', '\202', '\001', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e',
-'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
-'_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.',
-'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B',
-'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't',
-'o', 'r', '.', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', ':', '\177', '\232', '\305', '\210', '\036', 'z', '\n', 'x', 'e', 'n', 'v', 'o',
-'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h',
-'t', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2',
-'.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i',
-'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd',
-'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', 'B', '\016', '\n', '\014', 'e', 'x', 't', 'r', 'a',
-'c', 't', '_', 't', 'y', 'p', 'e', ':', 'j', '\232', '\305', '\210', '\036', 'e', '\n', 'c', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
-'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c',
-'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p',
-'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.',
-'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B', '\013', '\n', '\004', 't', 'y', 'p', 'e', '\022', '\003',
-'\370', 'B', '\001', ':', 'Z', '\232', '\305', '\210', '\036', 'U', '\n', 'S', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
-'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e',
-'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o',
-'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', ':', 'J', '\232', '\305', '\210',
-'\036', 'E', '\n', 'C', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n',
-'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a',
-'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', 'B', '\027', '\n', '\020',
-'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', '\"', '\273', '\001', '\n',
-'\t', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\022', 'e', '\n', '\030', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'd', 's', '_',
-'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S',
-'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\025', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'd',
-'s', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', ':', 'G', '\232', '\305', '\210', '\036', 'B', '\n', '@', 'e', 'n', 'v',
+'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', 'M', 'a', 'p', 'p', 'e', 'r', 'R',
+'\007', 'm', 'a', 'p', 'p', 'e', 'r', 's', '\022', 'O', '\n', '\013', 'b', 'o', 'd', 'y', '_', 'f', 'o', 'r', 'm', 'a', 't', '\030', '\002',
+' ', '\001', '(', '\013', '2', '.', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'S', 'u', 'b', 's', 't', 'i', 't', 'u', 't', 'i', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i',
+'n', 'g', 'R', '\n', 'b', 'o', 'd', 'y', 'F', 'o', 'r', 'm', 'a', 't', '\"', '\234', '\003', '\n', '\016', 'R', 'e', 's', 'p', 'o', 'n',
+'s', 'e', 'M', 'a', 'p', 'p', 'e', 'r', '\022', 'L', '\n', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2',
+'*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'a', 'c', 'c', 'e', 's', 's', 'l', 'o', 'g', '.',
+'v', '3', '.', 'A', 'c', 'c', 'e', 's', 's', 'L', 'o', 'g', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001',
+'\002', '\020', '\001', 'R', '\006', 'f', 'i', 'l', 't', 'e', 'r', '\022', 'J', '\n', '\013', 's', 't', 'a', 't', 'u', 's', '_', 'c', 'o', 'd',
+'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'B', '\013', '\372', 'B', '\010', '*', '\006', '\020', '\330', '\004', '(', '\310', '\001',
+'R', '\n', 's', 't', 'a', 't', 'u', 's', 'C', 'o', 'd', 'e', '\022', '4', '\n', '\004', 'b', 'o', 'd', 'y', '\030', '\003', ' ', '\001', '(',
+'\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
+'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\004', 'b', 'o', 'd', 'y', '\022', '`', '\n', '\024', 'b', 'o', 'd', 'y', '_',
+'f', 'o', 'r', 'm', 'a', 't', '_', 'o', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', '.', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'S', 'u', 'b', 's', 't',
+'i', 't', 'u', 't', 'i', 'o', 'n', 'F', 'o', 'r', 'm', 'a', 't', 'S', 't', 'r', 'i', 'n', 'g', 'R', '\022', 'b', 'o', 'd', 'y',
+'F', 'o', 'r', 'm', 'a', 't', 'O', 'v', 'e', 'r', 'r', 'i', 'd', 'e', '\022', 'X', '\n', '\016', 'h', 'e', 'a', 'd', 'e', 'r', 's',
+'_', 't', 'o', '_', 'a', 'd', 'd', '\030', '\005', ' ', '\003', '(', '\013', '2', '\'', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'O', 'p',
+'t', 'i', 'o', 'n', 'B', '\t', '\372', 'B', '\006', '\222', '\001', '\003', '\020', '\350', '\007', 'R', '\014', 'h', 'e', 'a', 'd', 'e', 'r', 's', 'T',
+'o', 'A', 'd', 'd', '\"', '\307', '\001', '\n', '\003', 'R', 'd', 's', '\022', 'Q', '\n', '\r', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o',
+'u', 'r', 'c', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B',
+'\005', '\212', '\001', '\002', '\020', '\001', 'R', '\014', 'c', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '*', '\n', '\021', 'r',
+'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\017', 'r',
+'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'N', 'a', 'm', 'e', ':', 'A', '\232', '\305', '\210', '\036', '<', '\n', ':', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
+'.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.',
+'v', '2', '.', 'R', 'd', 's', '\"', '\367', '\001', '\n', '\035', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n',
+'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', 'L', 'i', 's', 't', '\022', 'y', '\n', '\033', 's', 'c', 'o', 'p', 'e', 'd',
+'_', 'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', '\030', '\001', ' ', '\003',
+'(', '\013', '2', '/', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v',
+'3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o',
+'n', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\031', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C',
+'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', ':', '[', '\232', '\305', '\210', '\036', 'V', '\n', 'T', 'e', 'n', 'v',
'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v',
-'2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\"', '\253', '\002', '\n', '\n', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e',
-'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R',
-'\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001',
-'(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H',
-'\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022', 'X', '\n', '\020', 'c', 'o', 'n', 'f', 'i', 'g', '_',
-'d', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '\030', '\005', ' ', '\001', '(', '\013', '2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
-'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o',
-'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\017', 'c', 'o', 'n', 'f', 'i', 'g', 'D', 'i', 's', 'c', 'o',
-'v', 'e', 'r', 'y', ':', 'H', '\232', '\305', '\210', '\036', 'C', '\n', 'A', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
-'.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n',
-'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'H', 't', 't', 'p', 'F', 'i', 'l',
-'t', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\003', '\020', '\004', 'J',
-'\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\237', '\001', '\n', '\022', 'R', 'e', 'q', 'u', 'e', 's', 't',
-'I', 'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022', '7', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f',
-'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
-'f', '.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', 'P', '\232', '\305', '\210', '\036', 'K',
-'\n', 'I', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't',
-'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a',
-'g', 'e', 'r', '.', 'v', '2', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n',
-'B', 'q', '\n', 'I', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e',
-'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
+'2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o',
+'n', 's', 'L', 'i', 's', 't', '\"', '\351', '\016', '\n', '\014', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '\022', '\033',
+'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a',
+'m', 'e', '\022', '\217', '\001', '\n', '\021', 's', 'c', 'o', 'p', 'e', '_', 'k', 'e', 'y', '_', 'b', 'u', 'i', 'l', 'd', 'e', 'r', '\030',
+'\002', ' ', '\001', '(', '\013', '2', 'Y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
+'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n',
+'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R',
+'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B', '\010', '\372', 'B',
+'\005', '\212', '\001', '\002', '\020', '\001', 'R', '\017', 's', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '\022', 'X',
+'\n', '\021', 'r', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\003', ' ', '\001', '(', '\013',
+'2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C',
+'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\017', 'r', 'd',
+'s', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', '\022', '\245', '\001', '\n', ' ', 's', 'c', 'o', 'p', 'e', 'd', '_',
+'r', 'o', 'u', 't', 'e', '_', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', '_', 'l', 'i', 's', 't',
+'\030', '\004', ' ', '\001', '(', '\013', '2', 'Z', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
+'.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd',
+'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 's', 'L', 'i', 's', 't', 'H', '\000',
+'R', '\035', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o',
+'n', 's', 'L', 'i', 's', 't', '\022', 'g', '\n', '\n', 's', 'c', 'o', 'p', 'e', 'd', '_', 'r', 'd', 's', '\030', '\005', ' ', '\001', '(',
+'\013', '2', 'F', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
+'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', 'H', '\000',
+'R', '\t', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\032', '\331', '\t', '\n', '\017', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B',
+'u', 'i', 'l', 'd', 'e', 'r', '\022', '\221', '\001', '\n', '\t', 'f', 'r', 'a', 'g', 'm', 'e', 'n', 't', 's', '\030', '\001', ' ', '\003', '(',
+'\013', '2', 'i', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
+'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e',
+'s', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n',
+'t', 'B', 'u', 'i', 'l', 'd', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\t', 'f', 'r', 'a', 'g', 'm',
+'e', 'n', 't', 's', '\032', '\325', '\007', '\n', '\017', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '\022',
+'\266', '\001', '\n', '\026', 'h', 'e', 'a', 'd', 'e', 'r', '_', 'v', 'a', 'l', 'u', 'e', '_', 'e', 'x', 't', 'r', 'a', 'c', 't', 'o',
+'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '~', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n',
+'s', '.', 'f', 'i', 'l', 't', 'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o',
+'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e',
+'d', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F',
+'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u',
+'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', 'H', '\000', 'R', '\024', 'h', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e',
+'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '\032', '\217', '\005', '\n', '\024', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e',
+'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007',
+'\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '+', '\n', '\021', 'e', 'l', 'e', 'm', 'e', 'n', 't', '_',
+'s', 'e', 'p', 'a', 'r', 'a', 't', 'o', 'r', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\020', 'e', 'l', 'e', 'm', 'e', 'n', 't', 'S',
+'e', 'p', 'a', 'r', 'a', 't', 'o', 'r', '\022', '\026', '\n', '\005', 'i', 'n', 'd', 'e', 'x', '\030', '\003', ' ', '\001', '(', '\r', 'H', '\000',
+'R', '\005', 'i', 'n', 'd', 'e', 'x', '\022', '\245', '\001', '\n', '\007', 'e', 'l', 'e', 'm', 'e', 'n', 't', '\030', '\004', ' ', '\001', '(', '\013',
+'2', '\210', '\001', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't',
+'e', 'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i',
+'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e',
+'s', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n',
+'t', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a',
+'c', 't', 'o', 'r', '.', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', 'H', '\000', 'R', '\007', 'e', 'l', 'e', 'm', 'e', 'n', 't',
+'\032', '\333', '\001', '\n', '\t', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', '\022', '%', '\n', '\t', 's', 'e', 'p', 'a', 'r', 'a', 't',
+'o', 'r', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\t', 's', 'e', 'p', 'a', 'r', 'a',
+'t', 'o', 'r', '\022', '\031', '\n', '\003', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001',
+'R', '\003', 'k', 'e', 'y', ':', '\213', '\001', '\232', '\305', '\210', '\036', '\205', '\001', '\n', '\202', '\001', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
+'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_',
+'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o',
+'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r',
+'.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a',
+'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o', 'r', '.', 'K', 'v', 'E', 'l', 'e', 'm', 'e', 'n', 't', ':', '\177', '\232',
+'\305', '\210', '\036', 'z', '\n', 'x', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r',
+'.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_',
+'m', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S',
+'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u',
+'i', 'l', 'd', 'e', 'r', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'V', 'a', 'l', 'u', 'e', 'E', 'x', 't', 'r', 'a', 'c', 't', 'o',
+'r', 'B', '\016', '\n', '\014', 'e', 'x', 't', 'r', 'a', 'c', 't', '_', 't', 'y', 'p', 'e', ':', 'j', '\232', '\305', '\210', '\036', 'e', '\n',
+'c', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w',
+'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g',
+'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K',
+'e', 'y', 'B', 'u', 'i', 'l', 'd', 'e', 'r', '.', 'F', 'r', 'a', 'g', 'm', 'e', 'n', 't', 'B', 'u', 'i', 'l', 'd', 'e', 'r',
+'B', '\013', '\n', '\004', 't', 'y', 'p', 'e', '\022', '\003', '\370', 'B', '\001', ':', 'Z', '\232', '\305', '\210', '\036', 'U', '\n', 'S', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.',
+'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v',
+'2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'o', 'u', 't', 'e', 's', '.', 'S', 'c', 'o', 'p', 'e', 'K', 'e', 'y', 'B', 'u',
+'i', 'l', 'd', 'e', 'r', ':', 'J', '\232', '\305', '\210', '\036', 'E', '\n', 'C', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n',
+'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd',
+'R', 'o', 'u', 't', 'e', 's', 'B', '\027', '\n', '\020', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e',
+'r', '\022', '\003', '\370', 'B', '\001', '\"', '\273', '\001', '\n', '\t', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\022', 'e', '\n', '\030', 's',
+'c', 'o', 'p', 'e', 'd', '_', 'r', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\001',
+' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001',
+'R', '\025', 's', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', ':', 'G',
+'\232', '\305', '\210', '\036', 'B', '\n', '@', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e',
+'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n',
+'_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'S', 'c', 'o', 'p', 'e', 'd', 'R', 'd', 's', '\"', '\253', '\002', '\n',
+'\n', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
+'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '9', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_',
+'c', 'o', 'n', 'f', 'i', 'g', '\030', '\004', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o',
+'t', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', '\022',
+'X', '\n', '\020', 'c', 'o', 'n', 'f', 'i', 'g', '_', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '\030', '\005', ' ', '\001', '(', '\013',
+'2', '+', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'E',
+'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'H', '\000', 'R', '\017', 'c',
+'o', 'n', 'f', 'i', 'g', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', ':', 'H', '\232', '\305', '\210', '\036', 'C', '\n', 'A', 'e', 'n',
+'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k',
'.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.',
-'v', '3', 'B', '\032', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r',
-'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'v', '2', '.', 'H', 't', 't', 'p', 'F', 'i', 'l', 't', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't',
+'y', 'p', 'e', 'J', '\004', '\010', '\003', '\020', '\004', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\237',
+'\001', '\n', '\022', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I', 'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', '\022', '7', '\n', '\014',
+'t', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\001', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g',
+'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n',
+'f', 'i', 'g', ':', 'P', '\232', '\305', '\210', '\036', 'K', '\n', 'I', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'f', 'i', 'l', 't', 'e', 'r', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e',
+'c', 't', 'i', 'o', 'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '2', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'I',
+'D', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'B', 'q', '\n', 'I', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o',
+'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 'f', 'i', 'l', 't', 'e',
+'r', 's', '.', 'n', 'e', 't', 'w', 'o', 'r', 'k', '.', 'h', 't', 't', 'p', '_', 'c', 'o', 'n', 'n', 'e', 'c', 't', 'i', 'o',
+'n', '_', 'm', 'a', 'n', 'a', 'g', 'e', 'r', '.', 'v', '3', 'B', '\032', 'H', 't', 't', 'p', 'C', 'o', 'n', 'n', 'e', 'c', 't',
+'i', 'o', 'n', 'M', 'a', 'n', 'a', 'g', 'e', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002',
+'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[23] = {
+static upb_def_init *deps[20] = {
&envoy_config_accesslog_v3_accesslog_proto_upbdefinit,
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_core_v3_config_source_proto_upbdefinit,
&envoy_type_v3_percent_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
- &google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
- &udpa_core_v1_resource_locator_proto_upbdefinit,
- &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_migrate_proto_upbdefinit,
&udpa_annotations_security_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
deps,
layouts,
"envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto",
- UPB_STRVIEW_INIT(descriptor, 10148)
+ UPB_STRVIEW_INIT(descriptor, 10108)
};
#include "upb/def.h"
#include "envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h"
-extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init envoy_extensions_transport_sockets_tls_v3_common_proto_upbdefinit;
extern upb_def_init envoy_extensions_transport_sockets_tls_v3_secret_proto_upbdefinit;
extern upb_def_init envoy_extensions_transport_sockets_tls_v3_tls_proto_upbdefinit;
-static const char descriptor[379] = {'\n', '4', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
+static const char descriptor[348] = {'\n', '4', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/', 'v', '3', '/', 'c', 'e', 'r', 't', '.', 'p',
'r', 'o', 't', 'o', '\022', ')', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r',
-'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '\032', '\035', 'u',
-'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r',
+'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '\032', '6', 'e',
+'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't',
+'_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/', 'v', '3', '/', 'c', 'o', 'm', 'm', 'o', 'n', '.', 'p', 'r',
'o', 't', 'o', '\032', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a',
-'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/', 'v', '3', '/', 'c', 'o', 'm',
-'m', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o',
+'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/', 'v', '3', '/', 's', 'e', 'c',
+'r', 'e', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '3', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o',
'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/',
-'v', '3', '/', 's', 'e', 'c', 'r', 'e', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '3', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x',
-'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't',
-'s', '/', 't', 'l', 's', '/', 'v', '3', '/', 't', 'l', 's', '.', 'p', 'r', 'o', 't', 'o', 'B', 'F', '\n', '7', 'i', 'o', '.',
-'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o',
-'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.',
-'v', '3', 'B', '\t', 'C', 'e', 'r', 't', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'P', '\001', 'P', '\002', 'P', '\003', 'b', '\006', 'p', 'r',
-'o', 't', 'o', '3',
+'v', '3', '/', 't', 'l', 's', '.', 'p', 'r', 'o', 't', 'o', 'B', 'F', '\n', '7', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p',
+'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a',
+'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', 'B', '\t', 'C', 'e',
+'r', 't', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'P', '\000', 'P', '\001', 'P', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[5] = {
- &udpa_annotations_status_proto_upbdefinit,
+static upb_def_init *deps[4] = {
&envoy_extensions_transport_sockets_tls_v3_common_proto_upbdefinit,
&envoy_extensions_transport_sockets_tls_v3_secret_proto_upbdefinit,
&envoy_extensions_transport_sockets_tls_v3_tls_proto_upbdefinit,
deps,
NULL,
"envoy/extensions/transport_sockets/tls/v3/cert.proto",
- UPB_STRVIEW_INIT(descriptor, 379)
+ UPB_STRVIEW_INIT(descriptor, 348)
};
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
extern upb_def_init envoy_type_matcher_v3_string_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
-extern upb_def_init google_protobuf_struct_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init udpa_annotations_sensitive_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
&envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_msginit,
};
-static const char descriptor[2774] = {'\n', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
+static const char descriptor[2914] = {'\n', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/', 'v', '3', '/', 'c', 'o', 'm', 'm', 'o', 'n',
'.', 'p', 'r', 'o', 't', 'o', '\022', ')', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '\032',
'\037', 'e', 'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's',
'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't', 'c', 'h',
'e', 'r', '/', 'v', '3', '/', 's', 't', 'r', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l',
-'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o',
-'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 's', 't', 'r', 'u', 'c', 't', '.', 'p', 'r', 'o', 't', 'o',
-'\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r',
-'s', '.', 'p', 'r', 'o', 't', 'o', '\032', ' ', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's',
-'/', 's', 'e', 'n', 's', 'i', 't', 'i', 'v', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n',
-'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u',
-'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n',
-'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't',
-'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\362', '\003', '\n', '\r', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's',
-'\022', '\217', '\001', '\n', '\034', 't', 'l', 's', '_', 'm', 'i', 'n', 'i', 'm', 'u', 'm', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l',
-'_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\016', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
-'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't',
-'s', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '.', 'T', 'l',
-'s', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\031', 't', 'l', 's', 'M',
-'i', 'n', 'i', 'm', 'u', 'm', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\217', '\001', '\n',
-'\034', 't', 'l', 's', '_', 'm', 'a', 'x', 'i', 'm', 'u', 'm', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'v', 'e', 'r',
-'s', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\016', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's',
-'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l',
-'s', '.', 'v', '3', '.', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '.', 'T', 'l', 's', 'P', 'r', 'o',
-'t', 'o', 'c', 'o', 'l', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\031', 't', 'l', 's', 'M', 'a', 'x', 'i', 'm',
-'u', 'm', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '#', '\n', '\r', 'c', 'i', 'p', 'h',
-'e', 'r', '_', 's', 'u', 'i', 't', 'e', 's', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\014', 'c', 'i', 'p', 'h', 'e', 'r', 'S', 'u',
-'i', 't', 'e', 's', '\022', '\037', '\n', '\013', 'e', 'c', 'd', 'h', '_', 'c', 'u', 'r', 'v', 'e', 's', '\030', '\004', ' ', '\003', '(', '\t',
-'R', '\n', 'e', 'c', 'd', 'h', 'C', 'u', 'r', 'v', 'e', 's', '\"', 'O', '\n', '\013', 'T', 'l', 's', 'P', 'r', 'o', 't', 'o', 'c',
-'o', 'l', '\022', '\014', '\n', '\010', 'T', 'L', 'S', '_', 'A', 'U', 'T', 'O', '\020', '\000', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1',
-'_', '0', '\020', '\001', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '1', '\020', '\002', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v',
-'1', '_', '2', '\020', '\003', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '3', '\020', '\004', ':', '&', '\232', '\305', '\210', '\036', '!',
-'\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l', 's', 'P', 'a',
-'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\"', '\317', '\001', '\n', '\022', 'P', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', 'P', 'r',
-'o', 'v', 'i', 'd', 'e', 'r', '\022', ',', '\n', '\r', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001',
-' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\014', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'N', 'a',
-'m', 'e', '\022', 'A', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2',
-'\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'B', '\006', '\270', '\267',
-'\213', '\244', '\002', '\001', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '+', '\232', '\305', '\210', '\036',
-'&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'P', 'r', 'i', 'v',
-'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_',
-'t', 'y', 'p', 'e', 'J', '\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\261', '\004', '\n', '\016', 'T', 'l',
-'s', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\022', 'M', '\n', '\021', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a',
-'t', 'e', '_', 'c', 'h', 'a', 'i', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\020',
-'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'C', 'h', 'a', 'i', 'n', '\022', 'I', '\n', '\013', 'p', 'r', 'i', 'v', 'a',
-'t', 'e', '_', 'k', 'e', 'y', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\006', '\270', '\267',
-'\213', '\244', '\002', '\001', 'R', '\n', 'p', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', '\022', 'o', '\n', '\024', 'p', 'r', 'i', 'v', 'a',
-'t', 'e', '_', 'k', 'e', 'y', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\006', ' ', '\001', '(', '\013', '2', '=', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't',
-'_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'P', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e',
-'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'R', '\022', 'p', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v',
-'i', 'd', 'e', 'r', '\022', 'D', '\n', '\010', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '\030', '\003', ' ', '\001', '(', '\013', '2', ' ', '.',
-'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a',
-'S', 'o', 'u', 'r', 'c', 'e', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'R', '\010', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '\022',
-'A', '\n', '\013', 'o', 'c', 's', 'p', '_', 's', 't', 'a', 'p', 'l', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o',
-'u', 'r', 'c', 'e', 'R', '\n', 'o', 'c', 's', 'p', 'S', 't', 'a', 'p', 'l', 'e', '\022', 'b', '\n', '\034', 's', 'i', 'g', 'n', 'e',
-'d', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '\030', '\005',
-' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
-'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\032', 's', 'i', 'g', 'n', 'e', 'd', 'C', 'e', 'r', 't',
-'i', 'f', 'i', 'c', 'a', 't', 'e', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l', 's', 'C', 'e', 'r', 't',
-'i', 'f', 'i', 'c', 'a', 't', 'e', '\"', '\213', '\001', '\n', '\024', 'T', 'l', 's', 'S', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c',
-'k', 'e', 't', 'K', 'e', 'y', 's', '\022', 'D', '\n', '\004', 'k', 'e', 'y', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', ' ', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S',
-'o', 'u', 'r', 'c', 'e', 'B', '\016', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', '\270', '\267', '\213', '\244', '\002', '\001', 'R', '\004', 'k', 'e',
-'y', 's', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a',
-'u', 't', 'h', '.', 'T', 'l', 's', 'S', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', '\"',
-'\362', '\006', '\n', '\034', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n',
-'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '?', '\n', '\n', 't', 'r', 'u', 's', 't', 'e', 'd', '_', 'c', 'a', '\030', '\001', ' ', '\001',
+'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o',
+'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o',
+'t', 'o', '\032', ' ', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'n', 's',
+'i', 't', 'i', 'v', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
+'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a',
+'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o',
+'t', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o',
+'t', 'o', '\"', '\362', '\003', '\n', '\r', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '\022', '\217', '\001', '\n', '\034',
+'t', 'l', 's', '_', 'm', 'i', 'n', 'i', 'm', 'u', 'm', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'v', 'e', 'r', 's',
+'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\016', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i',
+'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's',
+'.', 'v', '3', '.', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '.', 'T', 'l', 's', 'P', 'r', 'o', 't',
+'o', 'c', 'o', 'l', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\031', 't', 'l', 's', 'M', 'i', 'n', 'i', 'm', 'u',
+'m', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\217', '\001', '\n', '\034', 't', 'l', 's', '_',
+'m', 'a', 'x', 'i', 'm', 'u', 'm', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030',
+'\002', ' ', '\001', '(', '\016', '2', 'D', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
+'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.',
+'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', '.', 'T', 'l', 's', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l',
+'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\031', 't', 'l', 's', 'M', 'a', 'x', 'i', 'm', 'u', 'm', 'P', 'r', 'o',
+'t', 'o', 'c', 'o', 'l', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '#', '\n', '\r', 'c', 'i', 'p', 'h', 'e', 'r', '_', 's', 'u',
+'i', 't', 'e', 's', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\014', 'c', 'i', 'p', 'h', 'e', 'r', 'S', 'u', 'i', 't', 'e', 's', '\022',
+'\037', '\n', '\013', 'e', 'c', 'd', 'h', '_', 'c', 'u', 'r', 'v', 'e', 's', '\030', '\004', ' ', '\003', '(', '\t', 'R', '\n', 'e', 'c', 'd',
+'h', 'C', 'u', 'r', 'v', 'e', 's', '\"', 'O', '\n', '\013', 'T', 'l', 's', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', '\022', '\014', '\n',
+'\010', 'T', 'L', 'S', '_', 'A', 'U', 'T', 'O', '\020', '\000', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '0', '\020', '\001', '\022',
+'\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '1', '\020', '\002', '\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '2', '\020', '\003',
+'\022', '\013', '\n', '\007', 'T', 'L', 'S', 'v', '1', '_', '3', '\020', '\004', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't',
+'e', 'r', 's', '\"', '\317', '\001', '\n', '\022', 'P', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e',
+'r', '\022', ',', '\n', '\r', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B',
+'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\014', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'N', 'a', 'm', 'e', '\022', 'A', '\n',
+'\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'H',
+'\000', 'R', '\013', 't', 'y', 'p', 'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'P', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e',
+'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'B', '\r', '\n', '\013', 'c', 'o', 'n', 'f', 'i', 'g', '_', 't', 'y', 'p', 'e', 'J',
+'\004', '\010', '\002', '\020', '\003', 'R', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\"', '\206', '\005', '\n', '\016', 'T', 'l', 's', 'C', 'e', 'r', 't',
+'i', 'f', 'i', 'c', 'a', 't', 'e', '\022', 'M', '\n', '\021', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'c', 'h',
+'a', 'i', 'n', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\020', 'c', 'e', 'r', 't', 'i',
+'f', 'i', 'c', 'a', 't', 'e', 'C', 'h', 'a', 'i', 'n', '\022', 'I', '\n', '\013', 'p', 'r', 'i', 'v', 'a', 't', 'e', '_', 'k', 'e',
+'y', '\030', '\002', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'R',
+'\n', 'p', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e', 'y', '\022', 'S', '\n', '\021', 'w', 'a', 't', 'c', 'h', 'e', 'd', '_', 'd', 'i',
+'r', 'e', 'c', 't', 'o', 'r', 'y', '\030', '\007', ' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't',
+'o', 'r', 'y', 'R', '\020', 'w', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', 'o', '\n', '\024',
+'p', 'r', 'i', 'v', 'a', 't', 'e', '_', 'k', 'e', 'y', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\006', ' ', '\001', '(',
+'\013', '2', '=', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n',
+'s', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'P', 'r', 'i', 'v',
+'a', 't', 'e', 'K', 'e', 'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'R', '\022', 'p', 'r', 'i', 'v', 'a', 't', 'e', 'K', 'e',
+'y', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', 'D', '\n', '\010', 'p', 'a', 's', 's', 'w', 'o', 'r', 'd', '\030', '\003', ' ', '\001',
'(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
-'.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 't', 'r', 'u', 's', 't', 'e', 'd', 'C', 'a', '\022', 'F', '\n',
-'\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 's', 'p', 'k', 'i', '\030',
-'\003', ' ', '\003', '(', '\t', 'B', '\016', '\372', 'B', '\013', '\222', '\001', '\010', '\"', '\006', 'r', '\004', '\020', ',', '(', ',', 'R', '\025', 'v', 'e',
-'r', 'i', 'f', 'y', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'S', 'p', 'k', 'i', '\022', 'F', '\n', '\027', 'v', 'e',
-'r', 'i', 'f', 'y', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'h', 'a', 's', 'h', '\030', '\002', ' ', '\003',
-'(', '\t', 'B', '\016', '\372', 'B', '\013', '\222', '\001', '\010', '\"', '\006', 'r', '\004', '\020', '@', '(', '_', 'R', '\025', 'v', 'e', 'r', 'i', 'f',
-'y', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'H', 'a', 's', 'h', '\022', '[', '\n', '\027', 'm', 'a', 't', 'c', 'h',
-'_', 's', 'u', 'b', 'j', 'e', 'c', 't', '_', 'a', 'l', 't', '_', 'n', 'a', 'm', 'e', 's', '\030', '\t', ' ', '\003', '(', '\013', '2',
-'$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S',
-'t', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'R', '\024', 'm', 'a', 't', 'c', 'h', 'S', 'u', 'b', 'j', 'e', 'c',
-'t', 'A', 'l', 't', 'N', 'a', 'm', 'e', 's', '\022', 'k', '\n', '$', 'r', 'e', 'q', 'u', 'i', 'r', 'e', '_', 's', 'i', 'g', 'n',
-'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '\030',
-'\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B',
-'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '!', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'S', 'i', 'g', 'n', 'e', 'd', 'C', 'e',
-'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '\022', '2', '\n', '\003', 'c', 'r', 'l',
-'\030', '\007', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r',
-'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\003', 'c', 'r', 'l', '\022', ':', '\n', '\031', 'a',
-'l', 'l', 'o', 'w', '_', 'e', 'x', 'p', 'i', 'r', 'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\030',
-'\010', ' ', '\001', '(', '\010', 'R', '\027', 'a', 'l', 'l', 'o', 'w', 'E', 'x', 'p', 'i', 'r', 'e', 'd', 'C', 'e', 'r', 't', 'i', 'f',
-'i', 'c', 'a', 't', 'e', '\022', '\242', '\001', '\n', '\030', 't', 'r', 'u', 's', 't', '_', 'c', 'h', 'a', 'i', 'n', '_', 'v', 'e', 'r',
-'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\030', '\n', ' ', '\001', '(', '\016', '2', '^', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e',
-'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e',
-'t', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i',
-'d', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'T', 'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V',
-'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\026', 't', 'r',
-'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\"', 'F', '\n', '\026', 'T',
-'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\022', '\026', '\n', '\022',
-'V', 'E', 'R', 'I', 'F', 'Y', '_', 'T', 'R', 'U', 'S', 'T', '_', 'C', 'H', 'A', 'I', 'N', '\020', '\000', '\022', '\024', '\n', '\020', 'A',
-'C', 'C', 'E', 'P', 'T', '_', 'U', 'N', 'T', 'R', 'U', 'S', 'T', 'E', 'D', '\020', '\001', ':', '5', '\232', '\305', '\210', '\036', '0', '\n',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'C', 'e', 'r', 't', 'i', 'f',
-'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'J', '\004', '\010',
-'\004', '\020', '\005', 'J', '\004', '\010', '\005', '\020', '\006', 'R', '\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 's', 'u', 'b', 'j', 'e', 'c', 't',
-'_', 'a', 'l', 't', '_', 'n', 'a', 'm', 'e', 'B', 'P', '\n', '7', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x',
-'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p',
-'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', 'B', '\013', 'C', 'o', 'm', 'm', 'o',
-'n', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'R', '\010', 'p', 'a', 's', 's',
+'w', 'o', 'r', 'd', '\022', 'A', '\n', '\013', 'o', 'c', 's', 'p', '_', 's', 't', 'a', 'p', 'l', 'e', '\030', '\004', ' ', '\001', '(', '\013',
+'2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D',
+'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\n', 'o', 'c', 's', 'p', 'S', 't', 'a', 'p', 'l', 'e', '\022', 'b', '\n', '\034',
+'s', 'i', 'g', 'n', 'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 't', 'i', 'm', 'e', 's', 't',
+'a', 'm', 'p', '\030', '\005', ' ', '\003', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\032', 's', 'i', 'g', 'n', 'e',
+'d', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', ':', '\'', '\232', '\305',
+'\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l',
+'s', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\"', '\213', '\001', '\n', '\024', 'T', 'l', 's', 'S', 'e', 's', 's', 'i',
+'o', 'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', '\022', 'D', '\n', '\004', 'k', 'e', 'y', 's', '\030', '\001', ' ', '\003', '(',
+'\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.',
+'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\016', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', '\270', '\267', '\213', '\244', '\002',
+'\001', 'R', '\004', 'k', 'e', 'y', 's', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'T', 'l', 's', 'S', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c', 'k', 'e', 't',
+'K', 'e', 'y', 's', '\"', '\307', '\007', '\n', '\034', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd',
+'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '?', '\n', '\n', 't', 'r', 'u', 's', 't', 'e', 'd', '_', 'c',
+'a', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 't', 'r', 'u', 's', 't', 'e', 'd',
+'C', 'a', '\022', 'S', '\n', '\021', 'w', 'a', 't', 'c', 'h', 'e', 'd', '_', 'd', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\030', '\013',
+' ', '\001', '(', '\013', '2', '&', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'W', 'a', 't', 'c', 'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', 'R', '\020', 'w', 'a', 't', 'c',
+'h', 'e', 'd', 'D', 'i', 'r', 'e', 'c', 't', 'o', 'r', 'y', '\022', 'F', '\n', '\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 'c', 'e',
+'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 's', 'p', 'k', 'i', '\030', '\003', ' ', '\003', '(', '\t', 'B', '\016', '\372', 'B', '\013',
+'\222', '\001', '\010', '\"', '\006', 'r', '\004', '\020', ',', '(', ',', 'R', '\025', 'v', 'e', 'r', 'i', 'f', 'y', 'C', 'e', 'r', 't', 'i', 'f',
+'i', 'c', 'a', 't', 'e', 'S', 'p', 'k', 'i', '\022', 'F', '\n', '\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 'c', 'e', 'r', 't', 'i',
+'f', 'i', 'c', 'a', 't', 'e', '_', 'h', 'a', 's', 'h', '\030', '\002', ' ', '\003', '(', '\t', 'B', '\016', '\372', 'B', '\013', '\222', '\001', '\010',
+'\"', '\006', 'r', '\004', '\020', '@', '(', '_', 'R', '\025', 'v', 'e', 'r', 'i', 'f', 'y', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a',
+'t', 'e', 'H', 'a', 's', 'h', '\022', '[', '\n', '\027', 'm', 'a', 't', 'c', 'h', '_', 's', 'u', 'b', 'j', 'e', 'c', 't', '_', 'a',
+'l', 't', '_', 'n', 'a', 'm', 'e', 's', '\030', '\t', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y',
+'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h',
+'e', 'r', 'R', '\024', 'm', 'a', 't', 'c', 'h', 'S', 'u', 'b', 'j', 'e', 'c', 't', 'A', 'l', 't', 'N', 'a', 'm', 'e', 's', '\022',
+'k', '\n', '$', 'r', 'e', 'q', 'u', 'i', 'r', 'e', '_', 's', 'i', 'g', 'n', 'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i',
+'c', 'a', 't', 'e', '_', 't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '\030', '\006', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o',
+'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a', 'l', 'u', 'e', 'R', '!',
+'r', 'e', 'q', 'u', 'i', 'r', 'e', 'S', 'i', 'g', 'n', 'e', 'd', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'T',
+'i', 'm', 'e', 's', 't', 'a', 'm', 'p', '\022', '2', '\n', '\003', 'c', 'r', 'l', '\030', '\007', ' ', '\001', '(', '\013', '2', ' ', '.', 'e',
+'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S',
+'o', 'u', 'r', 'c', 'e', 'R', '\003', 'c', 'r', 'l', '\022', ':', '\n', '\031', 'a', 'l', 'l', 'o', 'w', '_', 'e', 'x', 'p', 'i', 'r',
+'e', 'd', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\030', '\010', ' ', '\001', '(', '\010', 'R', '\027', 'a', 'l', 'l',
+'o', 'w', 'E', 'x', 'p', 'i', 'r', 'e', 'd', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\022', '\242', '\001', '\n', '\030',
+'t', 'r', 'u', 's', 't', '_', 'c', 'h', 'a', 'i', 'n', '_', 'v', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\030',
+'\n', ' ', '\001', '(', '\016', '2', '^', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
+'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.',
+'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't',
+'e', 'x', 't', '.', 'T', 'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V', 'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o',
+'n', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\026', 't', 'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V', 'e',
+'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\"', 'F', '\n', '\026', 'T', 'r', 'u', 's', 't', 'C', 'h', 'a', 'i', 'n', 'V',
+'e', 'r', 'i', 'f', 'i', 'c', 'a', 't', 'i', 'o', 'n', '\022', '\026', '\n', '\022', 'V', 'E', 'R', 'I', 'F', 'Y', '_', 'T', 'R', 'U',
+'S', 'T', '_', 'C', 'H', 'A', 'I', 'N', '\020', '\000', '\022', '\024', '\n', '\020', 'A', 'C', 'C', 'E', 'P', 'T', '_', 'U', 'N', 'T', 'R',
+'U', 'S', 'T', 'E', 'D', '\020', '\001', ':', '5', '\232', '\305', '\210', '\036', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
+'.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd',
+'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'J', '\004', '\010', '\004', '\020', '\005', 'J', '\004', '\010', '\005', '\020', '\006', 'R',
+'\027', 'v', 'e', 'r', 'i', 'f', 'y', '_', 's', 'u', 'b', 'j', 'e', 'c', 't', '_', 'a', 'l', 't', '_', 'n', 'a', 'm', 'e', 'B',
+'P', '\n', '7', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x',
+'t', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't',
+'s', '.', 't', 'l', 's', '.', 'v', '3', 'B', '\013', 'C', 'o', 'm', 'm', 'o', 'n', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200',
+'\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[10] = {
+static upb_def_init *deps[9] = {
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_type_matcher_v3_string_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
- &google_protobuf_struct_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&udpa_annotations_sensitive_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
deps,
layouts,
"envoy/extensions/transport_sockets/tls/v3/common.proto",
- UPB_STRVIEW_INIT(descriptor, 2774)
+ UPB_STRVIEW_INIT(descriptor, 2914)
};
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
extern upb_def_init envoy_config_core_v3_config_source_proto_upbdefinit;
extern upb_def_init envoy_extensions_transport_sockets_tls_v3_common_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_resource_locator_proto_upbdefinit;
-extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern upb_def_init udpa_annotations_sensitive_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_GenericSecret_msginit;
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_SdsSecretConfig_msginit;
extern const upb_msglayout envoy_extensions_transport_sockets_tls_v3_Secret_msginit;
&envoy_extensions_transport_sockets_tls_v3_Secret_msginit,
};
-static const char descriptor[1400] = {'\n', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
+static const char descriptor[1236] = {'\n', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/', 'v', '3', '/', 's', 'e', 'c', 'r', 'e', 't',
'.', 'p', 'r', 'o', 't', 'o', '\022', ')', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '\032',
'e', '/', 'v', '3', '/', 'c', 'o', 'n', 'f', 'i', 'g', '_', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032',
'6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p', 'o',
'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/', 'v', '3', '/', 'c', 'o', 'm', 'm', 'o', 'n', '.',
-'p', 'r', 'o', 't', 'o', '\032', '#', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r', 'e', 's', 'o', 'u',
-'r', 'c', 'e', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032',
-' ', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 'e', 'n', 's', 'i', 't', 'i',
-'v', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
-'s', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o',
-'t', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\"',
-'y', '\n', '\r', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'S', 'e', 'c', 'r', 'e', 't', '\022', '@', '\n', '\006', 's', 'e', 'c', 'r', 'e',
-'t', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o',
-'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\006', '\270', '\267', '\213', '\244', '\002', '\001', 'R',
-'\006', 's', 'e', 'c', 'r', 'e', 't', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i',
-'.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'S', 'e', 'c', 'r', 'e', 't', '\"', '\223', '\002',
-'\n', '\017', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '*', '\n', '\004', 'n', 'a', 'm', 'e',
-'\030', '\001', ' ', '\001', '(', '\t', 'B', '\026', '\362', '\230', '\376', '\217', '\005', '\020', '\022', '\016', 'n', 'a', 'm', 'e', '_', 's', 'p', 'e', 'c',
-'i', 'f', 'i', 'e', 'r', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'g', '\n', '\024', 's', 'd', 's', '_', 'r', 'e', 's', 'o', 'u', 'r',
-'c', 'e', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '\030', '\003', ' ', '\001', '(', '\013', '2', '\035', '.', 'u', 'd', 'p', 'a', '.', 'c',
-'o', 'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'B', '\026', '\362',
-'\230', '\376', '\217', '\005', '\020', '\022', '\016', 'n', 'a', 'm', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'R', '\022', 's', 'd',
-'s', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', '\022', 'A', '\n', '\n', 's', 'd', 's', '_', 'c',
-'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
-'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f', 'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 's',
-'d', 's', 'C', 'o', 'n', 'f', 'i', 'g', ':', '(', '\232', '\305', '\210', '\036', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g',
-'\"', '\373', '\003', '\n', '\006', 'S', 'e', 'c', 'r', 'e', 't', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
-'R', '\004', 'n', 'a', 'm', 'e', '\022', 'd', '\n', '\017', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e',
-'\030', '\002', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
-'.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3',
-'.', 'T', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'H', '\000', 'R', '\016', 't', 'l', 's', 'C', 'e', 'r',
-'t', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\022', 'q', '\n', '\023', 's', 'e', 's', 's', 'i', 'o', 'n', '_', 't', 'i', 'c', 'k', 'e',
-'t', '_', 'k', 'e', 'y', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '?', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e',
+'p', 'r', 'o', 't', 'o', '\032', ' ', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's',
+'e', 'n', 's', 'i', 't', 'i', 'v', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o',
+'t', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p',
+'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.',
+'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.',
+'p', 'r', 'o', 't', 'o', '\"', 'y', '\n', '\r', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'S', 'e', 'c', 'r', 'e', 't', '\022', '@', '\n',
+'\006', 's', 'e', 'c', 'r', 'e', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', ' ', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n',
+'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'D', 'a', 't', 'a', 'S', 'o', 'u', 'r', 'c', 'e', 'B', '\006', '\270',
+'\267', '\213', '\244', '\002', '\001', 'R', '\006', 's', 'e', 'c', 'r', 'e', 't', ':', '&', '\232', '\305', '\210', '\036', '!', '\n', '\037', 'e', 'n', 'v',
+'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'S', 'e', 'c',
+'r', 'e', 't', '\"', '\233', '\001', '\n', '\017', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\033',
+'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a',
+'m', 'e', '\022', 'A', '\n', '\n', 's', 'd', 's', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '\"', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 'f',
+'i', 'g', 'S', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 's', 'd', 's', 'C', 'o', 'n', 'f', 'i', 'g', ':', '(', '\232', '\305', '\210', '\036',
+'#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'S', 'd', 's', 'S',
+'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\"', '\373', '\003', '\n', '\006', 'S', 'e', 'c', 'r', 'e', 't', '\022', '\022', '\n',
+'\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', 'd', '\n', '\017', 't', 'l', 's', '_',
+'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '9', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c',
+'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't',
+'e', 'H', '\000', 'R', '\016', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\022', 'q', '\n', '\023', 's', 'e',
+'s', 's', 'i', 'o', 'n', '_', 't', 'i', 'c', 'k', 'e', 't', '_', 'k', 'e', 'y', 's', '\030', '\003', ' ', '\001', '(', '\013', '2', '?',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o',
+'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'S', 'e', 's', 's',
+'i', 'o', 'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', 'H', '\000', 'R', '\021', 's', 'e', 's', 's', 'i', 'o', 'n', 'T',
+'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', '\022', 'x', '\n', '\022', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c',
+'o', 'n', 't', 'e', 'x', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e',
'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.',
-'t', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'S', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e',
-'y', 's', 'H', '\000', 'R', '\021', 's', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', '\022', 'x',
-'\n', '\022', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\004', ' ', '\001', '(',
-'\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n',
-'s', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'e', 'r', 't',
-'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'H',
-'\000', 'R', '\021', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', 'a', '\n', '\016', 'g',
-'e', 'n', 'e', 'r', 'i', 'c', '_', 's', 'e', 'c', 'r', 'e', 't', '\030', '\005', ' ', '\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v',
-'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's',
-'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'G', 'e', 'n', 'e', 'r', 'i', 'c', 'S', 'e', 'c', 'r',
-'e', 't', 'H', '\000', 'R', '\r', 'g', 'e', 'n', 'e', 'r', 'i', 'c', 'S', 'e', 'c', 'r', 'e', 't', ':', '\037', '\232', '\305', '\210', '\036',
-'\032', '\n', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'S', 'e', 'c', 'r',
-'e', 't', 'B', '\006', '\n', '\004', 't', 'y', 'p', 'e', 'B', 'P', '\n', '7', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o',
-'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's',
-'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', 'B', '\013', 'S', 'e', 'c', 'r',
-'e', 't', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'t', 'l', 's', '.', 'v', '3', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't',
+'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'H', '\000', 'R', '\021', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C',
+'o', 'n', 't', 'e', 'x', 't', '\022', 'a', '\n', '\016', 'g', 'e', 'n', 'e', 'r', 'i', 'c', '_', 's', 'e', 'c', 'r', 'e', 't', '\030',
+'\005', ' ', '\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
+'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.',
+'G', 'e', 'n', 'e', 'r', 'i', 'c', 'S', 'e', 'c', 'r', 'e', 't', 'H', '\000', 'R', '\r', 'g', 'e', 'n', 'e', 'r', 'i', 'c', 'S',
+'e', 'c', 'r', 'e', 't', ':', '\037', '\232', '\305', '\210', '\036', '\032', '\n', '\030', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v',
+'2', '.', 'a', 'u', 't', 'h', '.', 'S', 'e', 'c', 'r', 'e', 't', 'B', '\006', '\n', '\004', 't', 'y', 'p', 'e', 'B', 'P', '\n', '7',
+'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n',
+'s', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't',
+'l', 's', '.', 'v', '3', 'B', '\013', 'S', 'e', 'c', 'r', 'e', 't', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006',
+'\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[9] = {
+static upb_def_init *deps[8] = {
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_core_v3_config_source_proto_upbdefinit,
&envoy_extensions_transport_sockets_tls_v3_common_proto_upbdefinit,
- &udpa_core_v1_resource_locator_proto_upbdefinit,
- &udpa_annotations_migrate_proto_upbdefinit,
&udpa_annotations_sensitive_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
NULL
};
deps,
layouts,
"envoy/extensions/transport_sockets/tls/v3/secret.proto",
- UPB_STRVIEW_INIT(descriptor, 1400)
+ UPB_STRVIEW_INIT(descriptor, 1236)
};
extern upb_def_init envoy_config_core_v3_extension_proto_upbdefinit;
extern upb_def_init envoy_extensions_transport_sockets_tls_v3_common_proto_upbdefinit;
extern upb_def_init envoy_extensions_transport_sockets_tls_v3_secret_proto_upbdefinit;
-extern upb_def_init google_protobuf_any_proto_upbdefinit;
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
&envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_msginit,
};
-static const char descriptor[4734] = {'\n', '3', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
+static const char descriptor[4707] = {'\n', '3', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p',
'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/', 'v', '3', '/', 't', 'l', 's', '.', 'p', 'r',
'o', 't', 'o', '\022', ')', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a',
'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '\032', '$', 'e', 'n',
'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '/', 't', 'l', 's', '/',
'v', '3', '/', 'c', 'o', 'm', 'm', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '6', 'e', 'n', 'v', 'o', 'y', '/', 'e', 'x',
't', 'e', 'n', 's', 'i', 'o', 'n', 's', '/', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't',
-'s', '/', 't', 'l', 's', '/', 'v', '3', '/', 's', 'e', 'c', 'r', 'e', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o',
-'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036',
-'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.',
-'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r',
-'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a',
-'t', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a',
-'/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o',
-'\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o',
-'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i',
-'d', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\301', '\002', '\n', '\022', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'T', 'l',
-'s', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', 'i', '\n', '\022', 'c', 'o', 'm', 'm', 'o', 'n', '_', 't', 'l', 's', '_', 'c', 'o',
-'n', 't', 'e', 'x', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n',
-'s', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't',
-'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'R', '\020', 'c',
-'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '\032', '\n', '\003', 's', 'n', 'i', '\030', '\002', ' ',
-'\001', '(', '\t', 'B', '\010', '\372', 'B', '\005', 'r', '\003', '(', '\377', '\001', 'R', '\003', 's', 'n', 'i', '\022', '/', '\n', '\023', 'a', 'l', 'l',
-'o', 'w', '_', 'r', 'e', 'n', 'e', 'g', 'o', 't', 'i', 'a', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\022', 'a',
-'l', 'l', 'o', 'w', 'R', 'e', 'n', 'e', 'g', 'o', 't', 'i', 'a', 't', 'i', 'o', 'n', '\022', 'F', '\n', '\020', 'm', 'a', 'x', '_',
-'s', 'e', 's', 's', 'i', 'o', 'n', '_', 'k', 'e', 'y', 's', '\030', '\004', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\016',
-'m', 'a', 'x', 'S', 'e', 's', 's', 'i', 'o', 'n', 'K', 'e', 'y', 's', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'T',
-'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\"', '\352', '\007', '\n', '\024', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', 'T',
-'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', 'i', '\n', '\022', 'c', 'o', 'm', 'm', 'o', 'n', '_', 't', 'l', 's', '_', 'c',
-'o', 'n', 't', 'e', 'x', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e',
-'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.',
-'t', 'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'R', '\020',
-'c', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', 'X', '\n', '\032', 'r', 'e', 'q', 'u', 'i',
-'r', 'e', '_', 'c', 'l', 'i', 'e', 'n', 't', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\030', '\002', ' ', '\001',
-'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
-'V', 'a', 'l', 'u', 'e', 'R', '\030', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'i',
-'f', 'i', 'c', 'a', 't', 'e', '\022', ';', '\n', '\013', 'r', 'e', 'q', 'u', 'i', 'r', 'e', '_', 's', 'n', 'i', '\030', '\003', ' ', '\001',
-'(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l',
-'V', 'a', 'l', 'u', 'e', 'R', '\n', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'S', 'n', 'i', '\022', 'q', '\n', '\023', 's', 'e', 's', 's',
-'i', 'o', 'n', '_', 't', 'i', 'c', 'k', 'e', 't', '_', 'k', 'e', 'y', 's', '\030', '\004', ' ', '\001', '(', '\013', '2', '?', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't',
-'_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'S', 'e', 's', 's', 'i', 'o',
-'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', 'H', '\000', 'R', '\021', 's', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c',
-'k', 'e', 't', 'K', 'e', 'y', 's', '\022', '\215', '\001', '\n', '%', 's', 'e', 's', 's', 'i', 'o', 'n', '_', 't', 'i', 'c', 'k', 'e',
-'t', '_', 'k', 'e', 'y', 's', '_', 's', 'd', 's', '_', 's', 'e', 'c', 'r', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030',
-'\005', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
-'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.',
-'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', ' ', 's', 'e', 's', 's', 'i', 'o',
-'n', 'T', 'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i',
-'g', '\022', 'Q', '\n', '$', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 's', 't', 'a', 't', 'e', 'l', 'e', 's', 's', '_', 's', 'e',
-'s', 's', 'i', 'o', 'n', '_', 'r', 'e', 's', 'u', 'm', 'p', 't', 'i', 'o', 'n', '\030', '\007', ' ', '\001', '(', '\010', 'H', '\000', 'R',
-'!', 'd', 'i', 's', 'a', 'b', 'l', 'e', 'S', 't', 'a', 't', 'e', 'l', 'e', 's', 's', 'S', 'e', 's', 's', 'i', 'o', 'n', 'R',
-'e', 's', 'u', 'm', 'p', 't', 'i', 'o', 'n', '\022', 'T', '\n', '\017', 's', 'e', 's', 's', 'i', 'o', 'n', '_', 't', 'i', 'm', 'e',
-'o', 'u', 't', '\030', '\006', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b',
-'u', 'f', '.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\020', '\372', 'B', '\r', '\252', '\001', '\n', '\032', '\006', '\010', '\200', '\200', '\200',
-'\200', '\020', '2', '\000', 'R', '\016', 's', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '\210', '\001', '\n', '\022',
-'o', 'c', 's', 'p', '_', 's', 't', 'a', 'p', 'l', 'e', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\010', ' ', '\001', '(', '\016', '2',
-'P', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p',
-'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'D', 'o', 'w', 'n', 's', 't',
-'r', 'e', 'a', 'm', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'O', 'c', 's', 'p', 'S', 't', 'a', 'p', 'l', 'e',
-'P', 'o', 'l', 'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\020', 'o', 'c', 's', 'p', 'S', 't', 'a',
-'p', 'l', 'e', 'P', 'o', 'l', 'i', 'c', 'y', '\"', 'N', '\n', '\020', 'O', 'c', 's', 'p', 'S', 't', 'a', 'p', 'l', 'e', 'P', 'o',
-'l', 'i', 'c', 'y', '\022', '\024', '\n', '\020', 'L', 'E', 'N', 'I', 'E', 'N', 'T', '_', 'S', 'T', 'A', 'P', 'L', 'I', 'N', 'G', '\020',
-'\000', '\022', '\023', '\n', '\017', 'S', 'T', 'R', 'I', 'C', 'T', '_', 'S', 'T', 'A', 'P', 'L', 'I', 'N', 'G', '\020', '\001', '\022', '\017', '\n',
-'\013', 'M', 'U', 'S', 'T', '_', 'S', 'T', 'A', 'P', 'L', 'E', '\020', '\002', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a',
-'m', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'B', '\032', '\n', '\030', 's', 'e', 's', 's', 'i', 'o', 'n', '_', 't', 'i',
-'c', 'k', 'e', 't', '_', 'k', 'e', 'y', 's', '_', 't', 'y', 'p', 'e', '\"', '\247', '\026', '\n', '\020', 'C', 'o', 'm', 'm', 'o', 'n',
-'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', 'W', '\n', '\n', 't', 'l', 's', '_', 'p', 'a', 'r', 'a', 'm', 's', '\030',
-'\001', ' ', '\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.',
-'t', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.',
-'T', 'l', 's', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', 'R', '\t', 't', 'l', 's', 'P', 'a', 'r', 'a', 'm', 's', '\022',
-'d', '\n', '\020', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 's', '\030', '\002', ' ', '\003', '(', '\013',
-'2', '9', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's',
-'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'C', 'e',
-'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'R', '\017', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e',
-'s', '\022', '\220', '\001', '\n', '\"', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 's', 'd', 's',
-'_', 's', 'e', 'c', 'r', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', ':', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't',
-'_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't',
-'C', 'o', 'n', 'f', 'i', 'g', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\020', '\001', 'R', '\036', 't', 'l', 's', 'C', 'e', 'r', 't',
-'i', 'f', 'i', 'c', 'a', 't', 'e', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', 's', '\022', '\240',
-'\001', '\n', '$', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'c', 'e', 'r', 't', 'i', 'f',
-'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\t', ' ', '\001', '(', '\013', '2', 'O', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_',
-'s', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C',
-'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e',
-'r', 'R', '!', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c',
-'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', '\271', '\001', '\n', '-', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i',
-'f', 'i', 'c', 'a', 't', 'e', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd',
-'e', 'r', '_', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', '\030', '\013', ' ', '\001', '(', '\013', '2', 'W', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c',
-'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't',
-'e', 'x', 't', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n',
-'s', 't', 'a', 'n', 'c', 'e', 'R', ')', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'C', 'e', 'r',
-'t', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', '\022',
-'x', '\n', '\022', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\003', ' ', '\001',
-'(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a',
-'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'e', 'r',
-'t', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't',
-'H', '\000', 'R', '\021', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '\214', '\001', '\n',
-'$', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 's', 'd', 's', '_', 's',
-'e', 'c', 'r', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o',
+'s', '/', 't', 'l', 's', '/', 'v', '3', '/', 's', 'e', 'c', 'r', 'e', 't', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o',
+'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r',
+'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p',
+'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i',
+'o', 'n', 's', '/', 'm', 'i', 'g', 'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a',
+'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!',
+'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i',
+'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a',
+'t', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\301', '\002', '\n', '\022', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'T', 'l', 's', 'C',
+'o', 'n', 't', 'e', 'x', 't', '\022', 'i', '\n', '\022', 'c', 'o', 'm', 'm', 'o', 'n', '_', 't', 'l', 's', '_', 'c', 'o', 'n', 't',
+'e', 'x', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i',
+'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's',
+'.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'R', '\020', 'c', 'o', 'm',
+'m', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '\032', '\n', '\003', 's', 'n', 'i', '\030', '\002', ' ', '\001', '(',
+'\t', 'B', '\010', '\372', 'B', '\005', 'r', '\003', '(', '\377', '\001', 'R', '\003', 's', 'n', 'i', '\022', '/', '\n', '\023', 'a', 'l', 'l', 'o', 'w',
+'_', 'r', 'e', 'n', 'e', 'g', 'o', 't', 'i', 'a', 't', 'i', 'o', 'n', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\022', 'a', 'l', 'l',
+'o', 'w', 'R', 'e', 'n', 'e', 'g', 'o', 't', 'i', 'a', 't', 'i', 'o', 'n', '\022', 'F', '\n', '\020', 'm', 'a', 'x', '_', 's', 'e',
+'s', 's', 'i', 'o', 'n', '_', 'k', 'e', 'y', 's', '\030', '\004', ' ', '\001', '(', '\013', '2', '\034', '.', 'g', 'o', 'o', 'g', 'l', 'e',
+'.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'U', 'I', 'n', 't', '3', '2', 'V', 'a', 'l', 'u', 'e', 'R', '\016', 'm', 'a',
+'x', 'S', 'e', 's', 's', 'i', 'o', 'n', 'K', 'e', 'y', 's', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'U', 'p', 's', 't', 'r', 'e', 'a', 'm', 'T', 'l', 's',
+'C', 'o', 'n', 't', 'e', 'x', 't', '\"', '\352', '\007', '\n', '\024', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', 'T', 'l', 's',
+'C', 'o', 'n', 't', 'e', 'x', 't', '\022', 'i', '\n', '\022', 'c', 'o', 'm', 'm', 'o', 'n', '_', 't', 'l', 's', '_', 'c', 'o', 'n',
+'t', 'e', 'x', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', ';', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's',
+'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l',
+'s', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'R', '\020', 'c', 'o',
+'m', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', 'X', '\n', '\032', 'r', 'e', 'q', 'u', 'i', 'r', 'e',
+'_', 'c', 'l', 'i', 'e', 'n', 't', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '\030', '\002', ' ', '\001', '(', '\013',
+'2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a',
+'l', 'u', 'e', 'R', '\030', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'C', 'l', 'i', 'e', 'n', 't', 'C', 'e', 'r', 't', 'i', 'f', 'i',
+'c', 'a', 't', 'e', '\022', ';', '\n', '\013', 'r', 'e', 'q', 'u', 'i', 'r', 'e', '_', 's', 'n', 'i', '\030', '\003', ' ', '\001', '(', '\013',
+'2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'B', 'o', 'o', 'l', 'V', 'a',
+'l', 'u', 'e', 'R', '\n', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'S', 'n', 'i', '\022', 'q', '\n', '\023', 's', 'e', 's', 's', 'i', 'o',
+'n', '_', 't', 'i', 'c', 'k', 'e', 't', '_', 'k', 'e', 'y', 's', '\030', '\004', ' ', '\001', '(', '\013', '2', '?', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's',
+'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'S', 'e', 's', 's', 'i', 'o', 'n', 'T',
+'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', 'H', '\000', 'R', '\021', 's', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'c', 'k', 'e',
+'t', 'K', 'e', 'y', 's', '\022', '\215', '\001', '\n', '%', 's', 'e', 's', 's', 'i', 'o', 'n', '_', 't', 'i', 'c', 'k', 'e', 't', '_',
+'k', 'e', 'y', 's', '_', 's', 'd', 's', '_', 's', 'e', 'c', 'r', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\005', ' ',
+'\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r',
+'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'd',
+'s', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', ' ', 's', 'e', 's', 's', 'i', 'o', 'n', 'T',
+'i', 'c', 'k', 'e', 't', 'K', 'e', 'y', 's', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022',
+'Q', '\n', '$', 'd', 'i', 's', 'a', 'b', 'l', 'e', '_', 's', 't', 'a', 't', 'e', 'l', 'e', 's', 's', '_', 's', 'e', 's', 's',
+'i', 'o', 'n', '_', 'r', 'e', 's', 'u', 'm', 'p', 't', 'i', 'o', 'n', '\030', '\007', ' ', '\001', '(', '\010', 'H', '\000', 'R', '!', 'd',
+'i', 's', 'a', 'b', 'l', 'e', 'S', 't', 'a', 't', 'e', 'l', 'e', 's', 's', 'S', 'e', 's', 's', 'i', 'o', 'n', 'R', 'e', 's',
+'u', 'm', 'p', 't', 'i', 'o', 'n', '\022', 'T', '\n', '\017', 's', 'e', 's', 's', 'i', 'o', 'n', '_', 't', 'i', 'm', 'e', 'o', 'u',
+'t', '\030', '\006', ' ', '\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f',
+'.', 'D', 'u', 'r', 'a', 't', 'i', 'o', 'n', 'B', '\020', '\372', 'B', '\r', '\252', '\001', '\n', '\032', '\006', '\010', '\200', '\200', '\200', '\200', '\020',
+'2', '\000', 'R', '\016', 's', 'e', 's', 's', 'i', 'o', 'n', 'T', 'i', 'm', 'e', 'o', 'u', 't', '\022', '\210', '\001', '\n', '\022', 'o', 'c',
+'s', 'p', '_', 's', 't', 'a', 'p', 'l', 'e', '_', 'p', 'o', 'l', 'i', 'c', 'y', '\030', '\010', ' ', '\001', '(', '\016', '2', 'P', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r',
+'t', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e',
+'a', 'm', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'O', 'c', 's', 'p', 'S', 't', 'a', 'p', 'l', 'e', 'P', 'o',
+'l', 'i', 'c', 'y', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\020', 'o', 'c', 's', 'p', 'S', 't', 'a', 'p', 'l',
+'e', 'P', 'o', 'l', 'i', 'c', 'y', '\"', 'N', '\n', '\020', 'O', 'c', 's', 'p', 'S', 't', 'a', 'p', 'l', 'e', 'P', 'o', 'l', 'i',
+'c', 'y', '\022', '\024', '\n', '\020', 'L', 'E', 'N', 'I', 'E', 'N', 'T', '_', 'S', 'T', 'A', 'P', 'L', 'I', 'N', 'G', '\020', '\000', '\022',
+'\023', '\n', '\017', 'S', 'T', 'R', 'I', 'C', 'T', '_', 'S', 'T', 'A', 'P', 'L', 'I', 'N', 'G', '\020', '\001', '\022', '\017', '\n', '\013', 'M',
+'U', 'S', 'T', '_', 'S', 'T', 'A', 'P', 'L', 'E', '\020', '\002', ':', '-', '\232', '\305', '\210', '\036', '(', '\n', '&', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'D', 'o', 'w', 'n', 's', 't', 'r', 'e', 'a', 'm', 'T',
+'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'B', '\032', '\n', '\030', 's', 'e', 's', 's', 'i', 'o', 'n', '_', 't', 'i', 'c', 'k',
+'e', 't', '_', 'k', 'e', 'y', 's', '_', 't', 'y', 'p', 'e', '\"', '\247', '\026', '\n', '\020', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l',
+'s', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', 'W', '\n', '\n', 't', 'l', 's', '_', 'p', 'a', 'r', 'a', 'm', 's', '\030', '\001', ' ',
+'\001', '(', '\013', '2', '8', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r',
+'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l',
+'s', 'P', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', 's', 'R', '\t', 't', 'l', 's', 'P', 'a', 'r', 'a', 'm', 's', '\022', 'd', '\n',
+'\020', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '9',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o',
+'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'T', 'l', 's', 'C', 'e', 'r', 't',
+'i', 'f', 'i', 'c', 'a', 't', 'e', 'R', '\017', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 's', '\022',
+'\220', '\001', '\n', '\"', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 's', 'd', 's', '_', 's',
+'e', 'c', 'r', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', ':', '.', 'e', 'n', 'v',
+'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's',
+'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o',
+'n', 'f', 'i', 'g', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\020', '\001', 'R', '\036', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f',
+'i', 'c', 'a', 't', 'e', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', 's', '\022', '\240', '\001', '\n',
+'$', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c',
+'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\t', ' ', '\001', '(', '\013', '2', 'O', '.', 'e', 'n', 'v', 'o',
'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o',
-'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n',
-'f', 'i', 'g', 'H', '\000', 'R', ' ', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'S',
-'d', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\242', '\001', '\n', '\033', 'c', 'o', 'm', 'b', 'i', 'n',
-'e', 'd', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\010', ' ', '\001',
-'(', '\013', '2', '`', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a',
+'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n',
+'t', 'e', 'x', 't', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'R',
+'!', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't',
+'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', '\271', '\001', '\n', '-', 't', 'l', 's', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i',
+'c', 'a', 't', 'e', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r',
+'_', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', '\030', '\013', ' ', '\001', '(', '\013', '2', 'W', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e',
+'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e',
+'t', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x',
+'t', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't',
+'a', 'n', 'c', 'e', 'R', ')', 't', 'l', 's', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'C', 'e', 'r', 't', 'i',
+'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', '\022', 'x', '\n',
+'\022', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\003', ' ', '\001', '(', '\013',
+'2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's',
+'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'e', 'r', 't', 'i',
+'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'H', '\000',
+'R', '\021', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '\214', '\001', '\n', '$', 'v',
+'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 's', 'd', 's', '_', 's', 'e', 'c',
+'r', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\007', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k',
+'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i',
+'g', 'H', '\000', 'R', ' ', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'S', 'd', 's',
+'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i', 'g', '\022', '\242', '\001', '\n', '\033', 'c', 'o', 'm', 'b', 'i', 'n', 'e', 'd',
+'_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\010', ' ', '\001', '(', '\013',
+'2', '`', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's',
+'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o',
+'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'o', 'm', 'b', 'i', 'n', 'e', 'd', 'C', 'e', 'r', 't', 'i',
+'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'H', '\000',
+'R', '\031', 'c', 'o', 'm', 'b', 'i', 'n', 'e', 'd', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e',
+'x', 't', '\022', '\250', '\001', '\n', '\'', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't',
+'_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\n', ' ', '\001',
+'(', '\013', '2', 'O', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a',
'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm',
-'m', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'o', 'm', 'b', 'i', 'n', 'e', 'd', 'C', 'e', 'r',
-'t', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't',
-'H', '\000', 'R', '\031', 'c', 'o', 'm', 'b', 'i', 'n', 'e', 'd', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n',
-'t', 'e', 'x', 't', '\022', '\250', '\001', '\n', '\'', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e',
-'x', 't', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\n',
+'m', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e',
+'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'H', '\000', 'R', '$', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n',
+'t', 'e', 'x', 't', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', '\301',
+'\001', '\n', '0', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'c', 'e', 'r',
+'t', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '_', 'i', 'n', 's', 't', 'a', 'n', 'c',
+'e', '\030', '\014', ' ', '\001', '(', '\013', '2', 'W', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n',
+'s', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v',
+'3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'e', 'r', 't', 'i', 'f',
+'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', 'H', '\000', 'R', ',',
+'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c',
+'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', '\022', '%', '\n', '\016', 'a', 'l',
+'p', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\030', '\004', ' ', '\003', '(', '\t', 'R', '\r', 'a', 'l', 'p', 'n', 'P',
+'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\022', 'W', '\n', '\021', 'c', 'u', 's', 't', 'o', 'm', '_', 'h', 'a', 'n', 'd', 's', 'h',
+'a', 'k', 'e', 'r', '\030', '\r', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g',
+'.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o',
+'n', 'f', 'i', 'g', 'R', '\020', 'c', 'u', 's', 't', 'o', 'm', 'H', 'a', 'n', 'd', 's', 'h', 'a', 'k', 'e', 'r', '\032', '\222', '\001',
+'\n', '\023', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', '\033', '\n', '\004',
+'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e',
+'\022', 'O', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', '*', '.',
+'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e',
+'d', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\013', 't', 'y', 'p', 'e', 'd',
+'C', 'o', 'n', 'f', 'i', 'g', 'B', '\r', '\n', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\022', '\003', '\370', 'B', '\001', '\032', 'm', '\n', '\033',
+'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n',
+'c', 'e', '\022', '#', '\n', '\r', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
+'R', '\014', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'N', 'a', 'm', 'e', '\022', ')', '\n', '\020', 'c', 'e', 'r', 't', 'i', 'f', 'i',
+'c', 'a', 't', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\017', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c',
+'a', 't', 'e', 'N', 'a', 'm', 'e', '\032', '\364', '\006', '\n', '$', 'C', 'o', 'm', 'b', 'i', 'n', 'e', 'd', 'C', 'e', 'r', 't', 'i',
+'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '\217',
+'\001', '\n', '\032', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n',
+'t', 'e', 'x', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's',
+'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l',
+'s', '.', 'v', '3', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o',
+'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\030', 'd', 'e', 'f', 'a', 'u',
+'l', 't', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '\266', '\001', '\n', '$', 'v',
+'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 's', 'd', 's', '_', 's', 'e', 'c',
+'r', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k',
+'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n', 'f', 'i',
+'g', 'B', '*', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', '\362', '\230', '\376', '\217', '\005', '\034', '\022', '\032', 'd', 'y', 'n', 'a', 'm', 'i',
+'c', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', 'R', ' ', 'v', 'a', 'l',
+'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o',
+'n', 'f', 'i', 'g', '\022', '\312', '\001', '\n', '\'', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e',
+'x', 't', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\030', '\003',
' ', '\001', '(', '\013', '2', 'O', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't',
'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C',
'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a',
-'t', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'H', '\000', 'R', '$', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C',
-'o', 'n', 't', 'e', 'x', 't', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r',
-'\022', '\301', '\001', '\n', '0', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'c',
-'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '_', 'i', 'n', 's', 't', 'a',
-'n', 'c', 'e', '\030', '\014', ' ', '\001', '(', '\013', '2', 'W', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i',
-'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's',
-'.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'e', 'r', 't',
-'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', 'H', '\000',
-'R', ',', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'C', 'e', 'r', 't', 'i', 'f',
-'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', '\022', '%', '\n', '\016',
-'a', 'l', 'p', 'n', '_', 'p', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\030', '\004', ' ', '\003', '(', '\t', 'R', '\r', 'a', 'l', 'p',
-'n', 'P', 'r', 'o', 't', 'o', 'c', 'o', 'l', 's', '\022', 'W', '\n', '\021', 'c', 'u', 's', 't', 'o', 'm', '_', 'h', 'a', 'n', 'd',
-'s', 'h', 'a', 'k', 'e', 'r', '\030', '\r', ' ', '\001', '(', '\013', '2', '*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y', 'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n',
-'C', 'o', 'n', 'f', 'i', 'g', 'R', '\020', 'c', 'u', 's', 't', 'o', 'm', 'H', 'a', 'n', 'd', 's', 'h', 'a', 'k', 'e', 'r', '\032',
-'\222', '\001', '\n', '\023', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', '\033',
-'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a',
-'m', 'e', '\022', 'O', '\n', '\014', 't', 'y', 'p', 'e', 'd', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2',
-'*', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'T', 'y',
-'p', 'e', 'd', 'E', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 'C', 'o', 'n', 'f', 'i', 'g', 'H', '\000', 'R', '\013', 't', 'y', 'p',
-'e', 'd', 'C', 'o', 'n', 'f', 'i', 'g', 'B', '\r', '\n', '\006', 'c', 'o', 'n', 'f', 'i', 'g', '\022', '\003', '\370', 'B', '\001', '\032', 'm',
-'\n', '\033', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't',
-'a', 'n', 'c', 'e', '\022', '#', '\n', '\r', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001',
-'(', '\t', 'R', '\014', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', 'N', 'a', 'm', 'e', '\022', ')', '\n', '\020', 'c', 'e', 'r', 't', 'i',
-'f', 'i', 'c', 'a', 't', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\017', 'c', 'e', 'r', 't', 'i', 'f',
-'i', 'c', 'a', 't', 'e', 'N', 'a', 'm', 'e', '\032', '\364', '\006', '\n', '$', 'C', 'o', 'm', 'b', 'i', 'n', 'e', 'd', 'C', 'e', 'r',
-'t', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't',
-'\022', '\217', '\001', '\n', '\032', 'd', 'e', 'f', 'a', 'u', 'l', 't', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c',
-'o', 'n', 't', 'e', 'x', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', 'G', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e',
-'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.',
-'t', 'l', 's', '.', 'v', '3', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't',
-'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'R', '\030', 'd', 'e', 'f',
-'a', 'u', 'l', 't', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', '\266', '\001', '\n',
-'$', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 's', 'd', 's', '_', 's',
-'e', 'c', 'r', 'e', 't', '_', 'c', 'o', 'n', 'f', 'i', 'g', '\030', '\002', ' ', '\001', '(', '\013', '2', ':', '.', 'e', 'n', 'v', 'o',
+'t', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'B', '\"', '\362', '\230', '\376', '\217', '\005', '\034', '\022', '\032', 'd', 'y', 'n', 'a', 'm',
+'i', 'c', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', 'R', '$', 'v', 'a',
+'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't',
+'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', '\343', '\001', '\n', '0', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_',
+'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i',
+'d', 'e', 'r', '_', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', 'W', '.', 'e', 'n', 'v', 'o',
'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o',
-'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't', 'C', 'o', 'n',
-'f', 'i', 'g', 'B', '*', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', '\362', '\230', '\376', '\217', '\005', '\034', '\022', '\032', 'd', 'y', 'n', 'a',
-'m', 'i', 'c', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', 'R', ' ', 'v',
-'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'S', 'd', 's', 'S', 'e', 'c', 'r', 'e', 't',
-'C', 'o', 'n', 'f', 'i', 'g', '\022', '\312', '\001', '\n', '\'', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n',
-'t', 'e', 'x', 't', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o', 'v', 'i', 'd', 'e', 'r',
-'\030', '\003', ' ', '\001', '(', '\013', '2', 'O', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's',
-'.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3',
-'.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i',
-'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'B', '\"', '\362', '\230', '\376', '\217', '\005', '\034', '\022', '\032', 'd', 'y', 'n',
-'a', 'm', 'i', 'c', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', 'R', '$',
-'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c',
-'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', '\022', '\343', '\001', '\n', '0', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o',
-'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'c', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', '_', 'p', 'r', 'o',
-'v', 'i', 'd', 'e', 'r', '_', 'i', 'n', 's', 't', 'a', 'n', 'c', 'e', '\030', '\004', ' ', '\001', '(', '\013', '2', 'W', '.', 'e', 'n',
-'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_',
-'s', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C',
-'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e',
-'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', 'B', '\"', '\362', '\230', '\376', '\217', '\005', '\034', '\022', '\032', 'd', 'y', 'n', 'a', 'm', 'i',
-'c', '_', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', 'R', ',', 'v', 'a', 'l',
-'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e',
-'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', ':', 'N', '\232', '\305', '\210', '\036', 'I', '\n', 'G',
-'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T',
-'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'o', 'm', 'b', 'i', 'n', 'e', 'd', 'C', 'e', 'r', 't', 'i', 'f', 'i',
-'c', 'a', 't', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', ':', ')', '\232', '\305',
-'\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'C', 'o',
-'m', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'B', '\031', '\n', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't',
-'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\005', '\020', '\006', 'B', 'M', '\n',
-'7', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e',
-'n', 's', 'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.',
-'t', 'l', 's', '.', 'v', '3', 'B', '\010', 'T', 'l', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020',
-'\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'c', 'k', 'e', 't', 's', '.', 't', 'l', 's', '.', 'v', '3', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's', 'C', 'o', 'n',
+'t', 'e', 'x', 't', '.', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r', 'o', 'v', 'i', 'd', 'e', 'r', 'I',
+'n', 's', 't', 'a', 'n', 'c', 'e', 'B', '\"', '\362', '\230', '\376', '\217', '\005', '\034', '\022', '\032', 'd', 'y', 'n', 'a', 'm', 'i', 'c', '_',
+'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', 'R', ',', 'v', 'a', 'l', 'i', 'd',
+'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a', 't', 'e', 'P', 'r',
+'o', 'v', 'i', 'd', 'e', 'r', 'I', 'n', 's', 't', 'a', 'n', 'c', 'e', ':', 'N', '\232', '\305', '\210', '\036', 'I', '\n', 'G', 'e', 'n',
+'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'C', 'o', 'm', 'm', 'o', 'n', 'T', 'l', 's',
+'C', 'o', 'n', 't', 'e', 'x', 't', '.', 'C', 'o', 'm', 'b', 'i', 'n', 'e', 'd', 'C', 'e', 'r', 't', 'i', 'f', 'i', 'c', 'a',
+'t', 'e', 'V', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o', 'n', 'C', 'o', 'n', 't', 'e', 'x', 't', ':', ')', '\232', '\305', '\210', '\036',
+'$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'a', 'u', 't', 'h', '.', 'C', 'o', 'm', 'm',
+'o', 'n', 'T', 'l', 's', 'C', 'o', 'n', 't', 'e', 'x', 't', 'B', '\031', '\n', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'i', 'o',
+'n', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 't', 'y', 'p', 'e', 'J', '\004', '\010', '\005', '\020', '\006', 'B', 'M', '\n', '7', 'i',
+'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 'e', 'x', 't', 'e', 'n', 's',
+'i', 'o', 'n', 's', '.', 't', 'r', 'a', 'n', 's', 'p', 'o', 'r', 't', '_', 's', 'o', 'c', 'k', 'e', 't', 's', '.', 't', 'l',
+'s', '.', 'v', '3', 'B', '\010', 'T', 'l', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b',
+'\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[11] = {
+static upb_def_init *deps[10] = {
&envoy_config_core_v3_extension_proto_upbdefinit,
&envoy_extensions_transport_sockets_tls_v3_common_proto_upbdefinit,
&envoy_extensions_transport_sockets_tls_v3_secret_proto_upbdefinit,
- &google_protobuf_any_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&google_protobuf_wrappers_proto_upbdefinit,
&udpa_annotations_migrate_proto_upbdefinit,
deps,
layouts,
"envoy/extensions/transport_sockets/tls/v3/tls.proto",
- UPB_STRVIEW_INIT(descriptor, 4734)
+ UPB_STRVIEW_INIT(descriptor, 4707)
};
extern upb_def_init envoy_config_core_v3_base_proto_upbdefinit;
extern upb_def_init google_protobuf_any_proto_upbdefinit;
+extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init google_rpc_status_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_resource_locator_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_resource_name_proto_upbdefinit;
-extern upb_def_init udpa_annotations_migrate_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern const upb_msglayout envoy_service_discovery_v3_DiscoveryRequest_msginit;
extern const upb_msglayout envoy_service_discovery_v3_DeltaDiscoveryRequest_InitialResourceVersionsEntry_msginit;
extern const upb_msglayout envoy_service_discovery_v3_DeltaDiscoveryResponse_msginit;
extern const upb_msglayout envoy_service_discovery_v3_Resource_msginit;
+extern const upb_msglayout envoy_service_discovery_v3_Resource_CacheControl_msginit;
-static const upb_msglayout *layouts[6] = {
+static const upb_msglayout *layouts[7] = {
&envoy_service_discovery_v3_DiscoveryRequest_msginit,
&envoy_service_discovery_v3_DiscoveryResponse_msginit,
&envoy_service_discovery_v3_DeltaDiscoveryRequest_msginit,
&envoy_service_discovery_v3_DeltaDiscoveryRequest_InitialResourceVersionsEntry_msginit,
&envoy_service_discovery_v3_DeltaDiscoveryResponse_msginit,
&envoy_service_discovery_v3_Resource_msginit,
+ &envoy_service_discovery_v3_Resource_CacheControl_msginit,
};
-static const char descriptor[2407] = {'\n', '*', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y',
+static const char descriptor[2206] = {'\n', '*', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y',
'/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\022', '\032', 'e', 'n', 'v', 'o',
'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '\032', '\037', 'e',
'n', 'v', 'o', 'y', '/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.',
'p', 'r', 'o', 't', 'o', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n',
-'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'r', 'p', 'c', '/', 's', 't', 'a', 't', 'u',
-'s', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r', 'e', 's',
-'o', 'u', 'r', 'c', 'e', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', ' ', 'u', 'd', 'p', 'a',
-'/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a', 'm', 'e', '.', 'p', 'r',
-'o', 't', 'o', '\032', '\036', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'm', 'i', 'g',
-'r', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i',
-'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n',
-'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't',
-'o', '\"', '\253', '\002', '\n', '\020', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\022', '!', '\n',
-'\014', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 'i', 'n', 'f', 'o', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\013', 'v', 'e', 'r', 's',
-'i', 'o', 'n', 'I', 'n', 'f', 'o', '\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\032', '.', 'e',
-'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N', 'o', 'd', 'e', 'R',
-'\004', 'n', 'o', 'd', 'e', '\022', '%', '\n', '\016', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a', 'm', 'e', 's', '\030', '\003',
-' ', '\003', '(', '\t', 'R', '\r', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', 's', '\022', '\031', '\n', '\010', 't', 'y',
-'p', 'e', '_', 'u', 'r', 'l', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\007', 't', 'y', 'p', 'e', 'U', 'r', 'l', '\022', '%', '\n', '\016',
-'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'n', 'o', 'n', 'c', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'R', '\r', 'r', 'e', 's',
-'p', 'o', 'n', 's', 'e', 'N', 'o', 'n', 'c', 'e', '\022', '5', '\n', '\014', 'e', 'r', 'r', 'o', 'r', '_', 'd', 'e', 't', 'a', 'i',
-'l', '\030', '\006', ' ', '\001', '(', '\013', '2', '\022', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'r', 'p', 'c', '.', 'S', 't', 'a', 't',
-'u', 's', 'R', '\013', 'e', 'r', 'r', 'o', 'r', 'D', 'e', 't', 'a', 'i', 'l', ':', '$', '\232', '\305', '\210', '\036', '\037', '\n', '\035', 'e',
-'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u',
-'e', 's', 't', '\"', '\243', '\002', '\n', '\021', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e',
-'\022', '!', '\n', '\014', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 'i', 'n', 'f', 'o', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\013', 'v',
-'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'f', 'o', '\022', '2', '\n', '\t', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030', '\002',
-' ', '\003', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n',
-'y', 'R', '\t', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', '\026', '\n', '\006', 'c', 'a', 'n', 'a', 'r', 'y', '\030', '\003', ' ',
-'\001', '(', '\010', 'R', '\006', 'c', 'a', 'n', 'a', 'r', 'y', '\022', '\031', '\n', '\010', 't', 'y', 'p', 'e', '_', 'u', 'r', 'l', '\030', '\004',
-' ', '\001', '(', '\t', 'R', '\007', 't', 'y', 'p', 'e', 'U', 'r', 'l', '\022', '\024', '\n', '\005', 'n', 'o', 'n', 'c', 'e', '\030', '\005', ' ',
-'\001', '(', '\t', 'R', '\005', 'n', 'o', 'n', 'c', 'e', '\022', 'G', '\n', '\r', 'c', 'o', 'n', 't', 'r', 'o', 'l', '_', 'p', 'l', 'a',
-'n', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c',
-'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', 'R', '\014', 'c', 'o', 'n', 't',
-'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
-'i', '.', 'v', '2', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\362', '\005',
-'\n', '\025', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\022', '.',
-'\n', '\004', 'n', 'o', 'd', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
-'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N', 'o', 'd', 'e', 'R', '\004', 'n', 'o', 'd', 'e', '\022', '\031', '\n', '\010',
-'t', 'y', 'p', 'e', '_', 'u', 'r', 'l', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 't', 'y', 'p', 'e', 'U', 'r', 'l', '\022', '8',
-'\n', '\030', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a', 'm', 'e', 's', '_', 's', 'u', 'b', 's', 'c', 'r', 'i', 'b',
-'e', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\026', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', 's', 'S', 'u', 'b',
-'s', 'c', 'r', 'i', 'b', 'e', '\022', 'W', '\n', '\030', 'u', 'd', 'p', 'a', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '_',
-'s', 'u', 'b', 's', 'c', 'r', 'i', 'b', 'e', '\030', '\010', ' ', '\003', '(', '\013', '2', '\035', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o',
-'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'R', '\026', 'u', 'd',
-'p', 'a', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'S', 'u', 'b', 's', 'c', 'r', 'i', 'b', 'e', '\022', '<', '\n', '\032', 'r',
-'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a', 'm', 'e', 's', '_', 'u', 'n', 's', 'u', 'b', 's', 'c', 'r', 'i', 'b', 'e',
-'\030', '\004', ' ', '\003', '(', '\t', 'R', '\030', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', 's', 'U', 'n', 's', 'u',
-'b', 's', 'c', 'r', 'i', 'b', 'e', '\022', '[', '\n', '\032', 'u', 'd', 'p', 'a', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's',
-'_', 'u', 'n', 's', 'u', 'b', 's', 'c', 'r', 'i', 'b', 'e', '\030', '\t', ' ', '\003', '(', '\013', '2', '\035', '.', 'u', 'd', 'p', 'a',
-'.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'R',
-'\030', 'u', 'd', 'p', 'a', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', 'U', 'n', 's', 'u', 'b', 's', 'c', 'r', 'i', 'b', 'e',
-'\022', '\212', '\001', '\n', '\031', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'v', 'e', 'r',
-'s', 'i', 'o', 'n', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', 'N', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i',
-'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c',
-'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '.', 'I', 'n', 'i', 't', 'i', 'a', 'l', 'R', 'e', 's', 'o', 'u',
-'r', 'c', 'e', 'V', 'e', 'r', 's', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', 'R', '\027', 'i', 'n', 'i', 't', 'i', 'a', 'l',
-'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'V', 'e', 'r', 's', 'i', 'o', 'n', 's', '\022', '%', '\n', '\016', 'r', 'e', 's', 'p', 'o',
-'n', 's', 'e', '_', 'n', 'o', 'n', 'c', 'e', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\r', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e',
-'N', 'o', 'n', 'c', 'e', '\022', '5', '\n', '\014', 'e', 'r', 'r', 'o', 'r', '_', 'd', 'e', 't', 'a', 'i', 'l', '\030', '\007', ' ', '\001',
-'(', '\013', '2', '\022', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'r', 'p', 'c', '.', 'S', 't', 'a', 't', 'u', 's', 'R', '\013', 'e',
-'r', 'r', 'o', 'r', 'D', 'e', 't', 'a', 'i', 'l', '\032', 'J', '\n', '\034', 'I', 'n', 'i', 't', 'i', 'a', 'l', 'R', 'e', 's', 'o',
-'u', 'r', 'c', 'e', 'V', 'e', 'r', 's', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030',
-'\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\t',
-'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y',
-'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q',
-'u', 'e', 's', 't', '\"', '\350', '\002', '\n', '\026', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e',
-'s', 'p', 'o', 'n', 's', 'e', '\022', '.', '\n', '\023', 's', 'y', 's', 't', 'e', 'm', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_',
-'i', 'n', 'f', 'o', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\021', 's', 'y', 's', 't', 'e', 'm', 'V', 'e', 'r', 's', 'i', 'o', 'n',
-'I', 'n', 'f', 'o', '\022', 'B', '\n', '\t', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '$',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.',
-'v', '3', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', '\031', '\n',
-'\010', 't', 'y', 'p', 'e', '_', 'u', 'r', 'l', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\007', 't', 'y', 'p', 'e', 'U', 'r', 'l', '\022',
-'+', '\n', '\021', 'r', 'e', 'm', 'o', 'v', 'e', 'd', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030', '\006', ' ', '\003', '(',
-'\t', 'R', '\020', 'r', 'e', 'm', 'o', 'v', 'e', 'd', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', 'P', '\n', '\026', 'u', 'd',
-'p', 'a', '_', 'r', 'e', 'm', 'o', 'v', 'e', 'd', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030', '\007', ' ', '\003', '(',
-'\013', '2', '\032', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e',
-'N', 'a', 'm', 'e', 'R', '\024', 'u', 'd', 'p', 'a', 'R', 'e', 'm', 'o', 'v', 'e', 'd', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e',
-'s', '\022', '\024', '\n', '\005', 'n', 'o', 'n', 'c', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'R', '\005', 'n', 'o', 'n', 'c', 'e', ':', '*',
-'\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'D', 'e', 'l', 't', 'a',
-'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\234', '\002', '\n', '\010', 'R', 'e', 's',
-'o', 'u', 'r', 'c', 'e', '\022', '*', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'B', '\026', '\362', '\230', '\376', '\217',
-'\005', '\020', '\022', '\016', 'n', 'a', 'm', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'R', '\004', 'n', 'a', 'm', 'e', '\022',
-'`', '\n', '\022', 'u', 'd', 'p', 'a', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a', 'm', 'e', '\030', '\005', ' ', '\001',
-'(', '\013', '2', '\032', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c',
-'e', 'N', 'a', 'm', 'e', 'B', '\026', '\362', '\230', '\376', '\217', '\005', '\020', '\022', '\016', 'n', 'a', 'm', 'e', '_', 's', 'p', 'e', 'c', 'i',
-'f', 'i', 'e', 'r', 'R', '\020', 'u', 'd', 'p', 'a', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', '\022', '\030', '\n',
-'\007', 'a', 'l', 'i', 'a', 's', 'e', 's', '\030', '\004', ' ', '\003', '(', '\t', 'R', '\007', 'a', 'l', 'i', 'a', 's', 'e', 's', '\022', '\030',
-'\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022',
-'0', '\n', '\010', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l',
-'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\010', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', ':',
-'\034', '\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'R', 'e', 's', 'o',
-'u', 'r', 'c', 'e', 'B', 'D', '\n', '(', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v',
-'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', 'B', '\016',
-'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b',
-'\006', 'p', 'r', 'o', 't', 'o', '3',
+'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/',
+'d', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'r', 'p',
+'c', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o',
+'t', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p',
+'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.',
+'p', 'r', 'o', 't', 'o', '\"', '\253', '\002', '\n', '\020', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's',
+'t', '\022', '!', '\n', '\014', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 'i', 'n', 'f', 'o', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\013',
+'v', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'f', 'o', '\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\002', ' ', '\001', '(', '\013',
+'2', '\032', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N',
+'o', 'd', 'e', 'R', '\004', 'n', 'o', 'd', 'e', '\022', '%', '\n', '\016', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a', 'm',
+'e', 's', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\r', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', 's', '\022', '\031',
+'\n', '\010', 't', 'y', 'p', 'e', '_', 'u', 'r', 'l', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\007', 't', 'y', 'p', 'e', 'U', 'r', 'l',
+'\022', '%', '\n', '\016', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', '_', 'n', 'o', 'n', 'c', 'e', '\030', '\005', ' ', '\001', '(', '\t', 'R',
+'\r', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'N', 'o', 'n', 'c', 'e', '\022', '5', '\n', '\014', 'e', 'r', 'r', 'o', 'r', '_', 'd',
+'e', 't', 'a', 'i', 'l', '\030', '\006', ' ', '\001', '(', '\013', '2', '\022', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'r', 'p', 'c', '.',
+'S', 't', 'a', 't', 'u', 's', 'R', '\013', 'e', 'r', 'r', 'o', 'r', 'D', 'e', 't', 'a', 'i', 'l', ':', '$', '\232', '\305', '\210', '\036',
+'\037', '\n', '\035', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y',
+'R', 'e', 'q', 'u', 'e', 's', 't', '\"', '\243', '\002', '\n', '\021', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p',
+'o', 'n', 's', 'e', '\022', '!', '\n', '\014', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 'i', 'n', 'f', 'o', '\030', '\001', ' ', '\001', '(',
+'\t', 'R', '\013', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'f', 'o', '\022', '2', '\n', '\t', 'r', 'e', 's', 'o', 'u', 'r', 'c',
+'e', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'A', 'n', 'y', 'R', '\t', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', '\026', '\n', '\006', 'c', 'a', 'n', 'a', 'r',
+'y', '\030', '\003', ' ', '\001', '(', '\010', 'R', '\006', 'c', 'a', 'n', 'a', 'r', 'y', '\022', '\031', '\n', '\010', 't', 'y', 'p', 'e', '_', 'u',
+'r', 'l', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\007', 't', 'y', 'p', 'e', 'U', 'r', 'l', '\022', '\024', '\n', '\005', 'n', 'o', 'n', 'c',
+'e', '\030', '\005', ' ', '\001', '(', '\t', 'R', '\005', 'n', 'o', 'n', 'c', 'e', '\022', 'G', '\n', '\r', 'c', 'o', 'n', 't', 'r', 'o', 'l',
+'_', 'p', 'l', 'a', 'n', 'e', '\030', '\006', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f',
+'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', 'R', '\014',
+'c', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', ':', '%', '\232', '\305', '\210', '\036', ' ', '\n', '\036', 'e', 'n', 'v', 'o',
+'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's',
+'e', '\"', '\274', '\004', '\n', '\025', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e',
+'s', 't', '\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'N', 'o', 'd', 'e', 'R', '\004', 'n', 'o', 'd', 'e',
+'\022', '\031', '\n', '\010', 't', 'y', 'p', 'e', '_', 'u', 'r', 'l', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 't', 'y', 'p', 'e', 'U',
+'r', 'l', '\022', '8', '\n', '\030', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a', 'm', 'e', 's', '_', 's', 'u', 'b', 's',
+'c', 'r', 'i', 'b', 'e', '\030', '\003', ' ', '\003', '(', '\t', 'R', '\026', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e',
+'s', 'S', 'u', 'b', 's', 'c', 'r', 'i', 'b', 'e', '\022', '<', '\n', '\032', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a',
+'m', 'e', 's', '_', 'u', 'n', 's', 'u', 'b', 's', 'c', 'r', 'i', 'b', 'e', '\030', '\004', ' ', '\003', '(', '\t', 'R', '\030', 'r', 'e',
+'s', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', 's', 'U', 'n', 's', 'u', 'b', 's', 'c', 'r', 'i', 'b', 'e', '\022', '\212', '\001',
+'\n', '\031', 'i', 'n', 'i', 't', 'i', 'a', 'l', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'v', 'e', 'r', 's', 'i', 'o',
+'n', 's', '\030', '\005', ' ', '\003', '(', '\013', '2', 'N', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.',
+'d', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e',
+'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '.', 'I', 'n', 'i', 't', 'i', 'a', 'l', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e',
+'V', 'e', 'r', 's', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', 'R', '\027', 'i', 'n', 'i', 't', 'i', 'a', 'l', 'R', 'e', 's',
+'o', 'u', 'r', 'c', 'e', 'V', 'e', 'r', 's', 'i', 'o', 'n', 's', '\022', '%', '\n', '\016', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e',
+'_', 'n', 'o', 'n', 'c', 'e', '\030', '\006', ' ', '\001', '(', '\t', 'R', '\r', 'r', 'e', 's', 'p', 'o', 'n', 's', 'e', 'N', 'o', 'n',
+'c', 'e', '\022', '5', '\n', '\014', 'e', 'r', 'r', 'o', 'r', '_', 'd', 'e', 't', 'a', 'i', 'l', '\030', '\007', ' ', '\001', '(', '\013', '2',
+'\022', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'r', 'p', 'c', '.', 'S', 't', 'a', 't', 'u', 's', 'R', '\013', 'e', 'r', 'r', 'o',
+'r', 'D', 'e', 't', 'a', 'i', 'l', '\032', 'J', '\n', '\034', 'I', 'n', 'i', 't', 'i', 'a', 'l', 'R', 'e', 's', 'o', 'u', 'r', 'c',
+'e', 'V', 'e', 'r', 's', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001',
+'(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\005', 'v',
+'a', 'l', 'u', 'e', ':', '\002', '8', '\001', ':', ')', '\232', '\305', '\210', '\036', '$', '\n', '\"', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p',
+'i', '.', 'v', '2', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's',
+'t', '\"', '\337', '\002', '\n', '\026', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o',
+'n', 's', 'e', '\022', '.', '\n', '\023', 's', 'y', 's', 't', 'e', 'm', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '_', 'i', 'n', 'f',
+'o', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\021', 's', 'y', 's', 't', 'e', 'm', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'f',
+'o', '\022', 'B', '\n', '\t', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n',
+'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.',
+'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'R', '\t', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', '\031', '\n', '\010', 't', 'y',
+'p', 'e', '_', 'u', 'r', 'l', '\030', '\004', ' ', '\001', '(', '\t', 'R', '\007', 't', 'y', 'p', 'e', 'U', 'r', 'l', '\022', '+', '\n', '\021',
+'r', 'e', 'm', 'o', 'v', 'e', 'd', '_', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\030', '\006', ' ', '\003', '(', '\t', 'R', '\020',
+'r', 'e', 'm', 'o', 'v', 'e', 'd', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 's', '\022', '\024', '\n', '\005', 'n', 'o', 'n', 'c', 'e',
+'\030', '\005', ' ', '\001', '(', '\t', 'R', '\005', 'n', 'o', 'n', 'c', 'e', '\022', 'G', '\n', '\r', 'c', 'o', 'n', 't', 'r', 'o', 'l', '_',
+'p', 'l', 'a', 'n', 'e', '\030', '\007', ' ', '\001', '(', '\013', '2', '\"', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i',
+'g', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', 'R', '\014', 'c',
+'o', 'n', 't', 'r', 'o', 'l', 'P', 'l', 'a', 'n', 'e', ':', '*', '\232', '\305', '\210', '\036', '%', '\n', '#', 'e', 'n', 'v', 'o', 'y',
+'.', 'a', 'p', 'i', '.', 'v', '2', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's',
+'p', 'o', 'n', 's', 'e', '\"', '\331', '\002', '\n', '\010', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', '\022', '\022', '\n', '\004', 'n', 'a', 'm',
+'e', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\030', '\n', '\007', 'a', 'l', 'i', 'a', 's', 'e', 's', '\030',
+'\004', ' ', '\003', '(', '\t', 'R', '\007', 'a', 'l', 'i', 'a', 's', 'e', 's', '\022', '\030', '\n', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n',
+'\030', '\001', ' ', '\001', '(', '\t', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '0', '\n', '\010', 'r', 'e', 's', 'o', 'u', 'r',
+'c', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u',
+'f', '.', 'A', 'n', 'y', 'R', '\010', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '\022', '+', '\n', '\003', 't', 't', 'l', '\030', '\006', ' ',
+'\001', '(', '\013', '2', '\031', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'D', 'u', 'r',
+'a', 't', 'i', 'o', 'n', 'R', '\003', 't', 't', 'l', '\022', 'V', '\n', '\r', 'c', 'a', 'c', 'h', 'e', '_', 'c', 'o', 'n', 't', 'r',
+'o', 'l', '\030', '\007', ' ', '\001', '(', '\013', '2', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.',
+'d', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', '.', 'C', 'a', 'c',
+'h', 'e', 'C', 'o', 'n', 't', 'r', 'o', 'l', 'R', '\014', 'c', 'a', 'c', 'h', 'e', 'C', 'o', 'n', 't', 'r', 'o', 'l', '\032', '0',
+'\n', '\014', 'C', 'a', 'c', 'h', 'e', 'C', 'o', 'n', 't', 'r', 'o', 'l', '\022', ' ', '\n', '\014', 'd', 'o', '_', 'n', 'o', 't', '_',
+'c', 'a', 'c', 'h', 'e', '\030', '\001', ' ', '\001', '(', '\010', 'R', '\n', 'd', 'o', 'N', 'o', 't', 'C', 'a', 'c', 'h', 'e', ':', '\034',
+'\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'R', 'e', 's', 'o', 'u',
+'r', 'c', 'e', 'B', 'D', '\n', '(', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o',
+'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', 'B', '\016', 'D',
+'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006',
+'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[9] = {
+static upb_def_init *deps[7] = {
&envoy_config_core_v3_base_proto_upbdefinit,
&google_protobuf_any_proto_upbdefinit,
+ &google_protobuf_duration_proto_upbdefinit,
&google_rpc_status_proto_upbdefinit,
- &udpa_core_v1_resource_locator_proto_upbdefinit,
- &udpa_core_v1_resource_name_proto_upbdefinit,
- &udpa_annotations_migrate_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
NULL
deps,
layouts,
"envoy/service/discovery/v3/discovery.proto",
- UPB_STRVIEW_INIT(descriptor, 2407)
+ UPB_STRVIEW_INIT(descriptor, 2206)
};
return upb_symtab_lookupmsg(s, "envoy.service.discovery.v3.Resource");
}
+UPB_INLINE const upb_msgdef *envoy_service_discovery_v3_Resource_CacheControl_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &envoy_service_discovery_v3_discovery_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "envoy.service.discovery.v3.Resource.CacheControl");
+}
+
#ifdef __cplusplus
} /* extern "C" */
#endif
extern upb_def_init envoy_service_discovery_v3_discovery_proto_upbdefinit;
extern upb_def_init google_api_annotations_proto_upbdefinit;
-extern upb_def_init google_protobuf_duration_proto_upbdefinit;
-extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init envoy_annotations_resource_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
-extern upb_def_init validate_validate_proto_upbdefinit;
extern const upb_msglayout envoy_service_endpoint_v3_EdsDummy_msginit;
static const upb_msglayout *layouts[1] = {
&envoy_service_endpoint_v3_EdsDummy_msginit,
};
-static const char descriptor[927] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/',
+static const char descriptor[838] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '/',
'v', '3', '/', 'e', 'd', 's', '.', 'p', 'r', 'o', 't', 'o', '\022', '\031', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i',
'c', 'e', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '\032', '*', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r',
'v', 'i', 'c', 'e', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e',
'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'a', 'p', 'i', '/', 'a', 'n', 'n', 'o',
-'t', 'a', 't', 'i', 'o', 'n', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o',
-'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o',
-'t', 'o', '\032', ' ', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'r', 'e', 's',
-'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
-'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o',
-'t', 'o', '\"', '(', '\n', '\010', 'E', 'd', 's', 'D', 'u', 'm', 'm', 'y', ':', '\034', '\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'E', 'd', 's', 'D', 'u', 'm', 'm', 'y', '2', '\341', '\003', '\n', '\030', 'E',
-'n', 'd', 'p', 'o', 'i', 'n', 't', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', 't',
-'\n', '\017', 'S', 't', 'r', 'e', 'a', 'm', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's',
-'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r',
-'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e',
-'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', '}', '\n', '\016', 'D', 'e', 'l', 't', 'a',
-'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\022', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e',
-'.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v',
-'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c',
-'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o',
-'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', '\227', '\001', '\n', '\016', 'F', 'e',
-'t', 'c', 'h', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v',
-'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r',
-'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.',
-'d', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's',
-'p', 'o', 'n', 's', 'e', '\"', '(', '\202', '\323', '\344', '\223', '\002', '\031', '\"', '\027', '/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v',
-'e', 'r', 'y', ':', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\202', '\323', '\344', '\223', '\002', '\003', ':', '\001', '*', '\032', '6', '\212',
-'\244', '\226', '\363', '\007', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o',
-'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r', 'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm',
-'e', 'n', 't', 'B', '@', '\n', '\'', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o',
-'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', 'B', '\010', 'E', 'd',
-'s', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\210', '\001', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't',
-'o', '3',
+'t', 'a', 't', 'i', 'o', 'n', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', ' ', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o',
+'t', 'a', 't', 'i', 'o', 'n', 's', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u',
+'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r',
+'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r',
+'s', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\"', '(', '\n', '\010', 'E', 'd', 's', 'D', 'u', 'm', 'm', 'y',
+':', '\034', '\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'E', 'd', 's',
+'D', 'u', 'm', 'm', 'y', '2', '\341', '\003', '\n', '\030', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 'D', 'i', 's', 'c', 'o', 'v', 'e',
+'r', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', 't', '\n', '\017', 'S', 't', 'r', 'e', 'a', 'm', 'E', 'n', 'd', 'p', 'o', 'i',
+'n', 't', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o',
+'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032',
+'-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y',
+'.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001',
+'0', '\001', '\022', '}', '\n', '\016', 'D', 'e', 'l', 't', 'a', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\022', '1', '.', 'e', 'n',
+'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.',
+'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '2', '.', 'e',
+'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3',
+'.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000',
+'(', '\001', '0', '\001', '\022', '\227', '\001', '\n', '\016', 'F', 'e', 't', 'c', 'h', 'E', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\022', ',',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.',
+'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v',
+'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D',
+'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '(', '\202', '\323', '\344', '\223', '\002', '\031', '\"',
+'\027', '/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', ':', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', 's', '\202',
+'\323', '\344', '\223', '\002', '\003', ':', '\001', '*', '\032', '6', '\212', '\244', '\226', '\363', '\007', '0', '\n', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'e', 'n', 'd', 'p', 'o', 'i', 'n', 't', '.', 'v', '3', '.', 'C', 'l', 'u', 's', 't', 'e', 'r',
+'L', 'o', 'a', 'd', 'A', 's', 's', 'i', 'g', 'n', 'm', 'e', 'n', 't', 'B', '@', '\n', '\'', 'i', 'o', '.', 'e', 'n', 'v', 'o',
+'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'e', 'n', 'd', 'p',
+'o', 'i', 'n', 't', '.', 'v', '3', 'B', '\010', 'E', 'd', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\210', '\001', '\001', '\272', '\200', '\310',
+'\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[9] = {
+static upb_def_init *deps[6] = {
&envoy_service_discovery_v3_discovery_proto_upbdefinit,
&google_api_annotations_proto_upbdefinit,
- &google_protobuf_duration_proto_upbdefinit,
- &google_protobuf_wrappers_proto_upbdefinit,
&envoy_annotations_resource_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
- &validate_validate_proto_upbdefinit,
NULL
};
deps,
layouts,
"envoy/service/endpoint/v3/eds.proto",
- UPB_STRVIEW_INIT(descriptor, 927)
+ UPB_STRVIEW_INIT(descriptor, 838)
};
extern upb_def_init envoy_service_discovery_v3_discovery_proto_upbdefinit;
extern upb_def_init google_api_annotations_proto_upbdefinit;
-extern upb_def_init google_protobuf_duration_proto_upbdefinit;
-extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init envoy_annotations_resource_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
-extern upb_def_init validate_validate_proto_upbdefinit;
extern const upb_msglayout envoy_service_listener_v3_LdsDummy_msginit;
static const upb_msglayout *layouts[1] = {
&envoy_service_listener_v3_LdsDummy_msginit,
};
-static const char descriptor[914] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/',
+static const char descriptor[825] = {'\n', '#', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '/',
'v', '3', '/', 'l', 'd', 's', '.', 'p', 'r', 'o', 't', 'o', '\022', '\031', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i',
'c', 'e', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '\032', '*', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r',
'v', 'i', 'c', 'e', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e',
'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'a', 'p', 'i', '/', 'a', 'n', 'n', 'o',
-'t', 'a', 't', 'i', 'o', 'n', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o',
-'t', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o',
-'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o',
-'t', 'o', '\032', ' ', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'r', 'e', 's',
-'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't',
-'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a',
-'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o',
-'t', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o',
-'t', 'o', '\"', '(', '\n', '\010', 'L', 'd', 's', 'D', 'u', 'm', 'm', 'y', ':', '\034', '\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n',
-'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'd', 's', 'D', 'u', 'm', 'm', 'y', '2', '\324', '\003', '\n', '\030', 'L',
-'i', 's', 't', 'e', 'n', 'e', 'r', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', '}',
-'\n', '\016', 'D', 'e', 'l', 't', 'a', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 's', '\022', '1', '.', 'e', 'n', 'v', 'o', 'y', '.',
-'s', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't',
-'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '2', '.', 'e', 'n', 'v', 'o', 'y',
-'.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l',
-'t', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001',
-'\022', 't', '\n', '\017', 'S', 't', 'r', 'e', 'a', 'm', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 's', '\022', ',', '.', 'e', 'n', 'v',
+'t', 'a', 't', 'i', 'o', 'n', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', ' ', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o',
+'t', 'a', 't', 'i', 'o', 'n', 's', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u',
+'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r',
+'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r',
+'s', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\"', '(', '\n', '\010', 'L', 'd', 's', 'D', 'u', 'm', 'm', 'y',
+':', '\034', '\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'L', 'd', 's',
+'D', 'u', 'm', 'm', 'y', '2', '\324', '\003', '\n', '\030', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'D', 'i', 's', 'c', 'o', 'v', 'e',
+'r', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', '}', '\n', '\016', 'D', 'e', 'l', 't', 'a', 'L', 'i', 's', 't', 'e', 'n', 'e',
+'r', 's', '\022', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v',
+'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u',
+'e', 's', 't', '\032', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o',
+'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's',
+'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', 't', '\n', '\017', 'S', 't', 'r', 'e', 'a', 'm', 'L', 'i', 's', 't',
+'e', 'n', 'e', 'r', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's',
+'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's',
+'t', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e',
+'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000',
+'(', '\001', '0', '\001', '\022', '\227', '\001', '\n', '\016', 'F', 'e', 't', 'c', 'h', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 's', '\022', ',',
+'.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.',
+'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v',
'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D',
-'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's',
-'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o',
-'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', '\227', '\001', '\n', '\016', 'F', 'e',
-'t', 'c', 'h', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v',
-'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r',
-'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.',
-'d', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's',
-'p', 'o', 'n', 's', 'e', '\"', '(', '\202', '\323', '\344', '\223', '\002', '\031', '\"', '\027', '/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v',
-'e', 'r', 'y', ':', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 's', '\202', '\323', '\344', '\223', '\002', '\003', ':', '\001', '*', '\032', ')', '\212',
-'\244', '\226', '\363', '\007', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e',
-'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e', 'r', 'B', '@', '\n', '\'', 'i', 'o', '.', 'e', 'n', 'v',
-'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'l', 'i', 's',
-'t', 'e', 'n', 'e', 'r', '.', 'v', '3', 'B', '\010', 'L', 'd', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\210', '\001', '\001', '\272', '\200',
-'\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '(', '\202', '\323', '\344', '\223', '\002', '\031', '\"',
+'\027', '/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', ':', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', 's', '\202',
+'\323', '\344', '\223', '\002', '\003', ':', '\001', '*', '\032', ')', '\212', '\244', '\226', '\363', '\007', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'c',
+'o', 'n', 'f', 'i', 'g', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', '.', 'L', 'i', 's', 't', 'e', 'n', 'e',
+'r', 'B', '@', '\n', '\'', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'s', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'l', 'i', 's', 't', 'e', 'n', 'e', 'r', '.', 'v', '3', 'B', '\010', 'L', 'd', 's', 'P',
+'r', 'o', 't', 'o', 'P', '\001', '\210', '\001', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[9] = {
+static upb_def_init *deps[6] = {
&envoy_service_discovery_v3_discovery_proto_upbdefinit,
&google_api_annotations_proto_upbdefinit,
- &google_protobuf_duration_proto_upbdefinit,
- &google_protobuf_wrappers_proto_upbdefinit,
&envoy_annotations_resource_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
- &validate_validate_proto_upbdefinit,
NULL
};
deps,
layouts,
"envoy/service/listener/v3/lds.proto",
- UPB_STRVIEW_INIT(descriptor, 914)
+ UPB_STRVIEW_INIT(descriptor, 825)
};
extern upb_def_init google_protobuf_duration_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
-extern upb_def_init validate_validate_proto_upbdefinit;
extern const upb_msglayout envoy_service_load_stats_v3_LoadStatsRequest_msginit;
extern const upb_msglayout envoy_service_load_stats_v3_LoadStatsResponse_msginit;
&envoy_service_load_stats_v3_LoadStatsResponse_msginit,
};
-static const char descriptor[983] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'l', 'o', 'a', 'd', '_', 's', 't', 'a', 't',
+static const char descriptor[958] = {'\n', '%', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'l', 'o', 'a', 'd', '_', 's', 't', 'a', 't',
's', '/', 'v', '3', '/', 'l', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\022', '\033', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r',
'v', 'i', 'c', 'e', '.', 'l', 'o', 'a', 'd', '_', 's', 't', 'a', 't', 's', '.', 'v', '3', '\032', '\037', 'e', 'n', 'v', 'o', 'y',
'/', 'c', 'o', 'n', 'f', 'i', 'g', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'b', 'a', 's', 'e', '.', 'p', 'r', 'o', 't',
'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o',
't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't',
'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
-'s', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd',
-'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\304', '\001', '\n', '\020', 'L', 'o',
+'s', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\"', '\304', '\001', '\n', '\020', 'L', 'o',
'a', 'd', 'S', 't', 'a', 't', 's', 'R', 'e', 'q', 'u', 'e', 's', 't', '\022', '.', '\n', '\004', 'n', 'o', 'd', 'e', '\030', '\001', ' ',
'\001', '(', '\013', '2', '\032', '.', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'c', 'o', 'r', 'e', '.', 'v',
'3', '.', 'N', 'o', 'd', 'e', 'R', '\004', 'n', 'o', 'd', 'e', '\022', 'K', '\n', '\r', 'c', 'l', 'u', 's', 't', 'e', 'r', '_', 's',
'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[7] = {
+static upb_def_init *deps[6] = {
&envoy_config_core_v3_base_proto_upbdefinit,
&envoy_config_endpoint_v3_load_report_proto_upbdefinit,
&google_protobuf_duration_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
- &validate_validate_proto_upbdefinit,
NULL
};
deps,
layouts,
"envoy/service/load_stats/v3/lrs.proto",
- UPB_STRVIEW_INIT(descriptor, 983)
+ UPB_STRVIEW_INIT(descriptor, 958)
};
extern upb_def_init envoy_service_discovery_v3_discovery_proto_upbdefinit;
extern upb_def_init google_api_annotations_proto_upbdefinit;
-extern upb_def_init google_protobuf_wrappers_proto_upbdefinit;
extern upb_def_init envoy_annotations_resource_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
-extern upb_def_init validate_validate_proto_upbdefinit;
extern const upb_msglayout envoy_service_route_v3_RdsDummy_msginit;
static const upb_msglayout *layouts[1] = {
&envoy_service_route_v3_RdsDummy_msginit,
};
-static const char descriptor[1071] = {'\n', ' ', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/',
+static const char descriptor[1014] = {'\n', ' ', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'r', 'o', 'u', 't', 'e', '/', 'v', '3', '/',
'r', 'd', 's', '.', 'p', 'r', 'o', 't', 'o', '\022', '\026', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.',
'r', 'o', 'u', 't', 'e', '.', 'v', '3', '\032', '*', 'e', 'n', 'v', 'o', 'y', '/', 's', 'e', 'r', 'v', 'i', 'c', 'e', '/', 'd',
'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'p', 'r', 'o',
't', 'o', '\032', '\034', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'a', 'p', 'i', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
-'s', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/',
-'w', 'r', 'a', 'p', 'p', 'e', 'r', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', ' ', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n',
-'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035',
-'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p',
-'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e',
-'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/',
-'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '(', '\n', '\010', 'R', 'd', 's', 'D', 'u', 'm', 'm',
-'y', ':', '\034', '\232', '\305', '\210', '\036', '\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'R', 'd',
-'s', 'D', 'u', 'm', 'm', 'y', '2', '\314', '\003', '\n', '\025', 'R', 'o', 'u', 't', 'e', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y',
-'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', 'q', '\n', '\014', 'S', 't', 'r', 'e', 'a', 'm', 'R', 'o', 'u', 't', 'e', 's', '\022', ',',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.',
-'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v',
-'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D',
-'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', 'z', '\n',
-'\013', 'D', 'e', 'l', 't', 'a', 'R', 'o', 'u', 't', 'e', 's', '\022', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v',
-'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's',
-'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r',
-'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i',
-'s', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', '\221', '\001', '\n',
-'\013', 'F', 'e', 't', 'c', 'h', 'R', 'o', 'u', 't', 'e', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v',
+'s', '.', 'p', 'r', 'o', 't', 'o', '\032', ' ', 'e', 'n', 'v', 'o', 'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n',
+'s', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n',
+'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u',
+'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n',
+'g', '.', 'p', 'r', 'o', 't', 'o', '\"', '(', '\n', '\010', 'R', 'd', 's', 'D', 'u', 'm', 'm', 'y', ':', '\034', '\232', '\305', '\210', '\036',
+'\027', '\n', '\025', 'e', 'n', 'v', 'o', 'y', '.', 'a', 'p', 'i', '.', 'v', '2', '.', 'R', 'd', 's', 'D', 'u', 'm', 'm', 'y', '2',
+'\314', '\003', '\n', '\025', 'R', 'o', 'u', 't', 'e', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e',
+'\022', 'q', '\n', '\014', 'S', 't', 'r', 'e', 'a', 'm', 'R', 'o', 'u', 't', 'e', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'s', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c',
+'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v',
'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r',
-'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.',
-'d', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's',
-'p', 'o', 'n', 's', 'e', '\"', '%', '\202', '\323', '\344', '\223', '\002', '\026', '\"', '\024', '/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v',
-'e', 'r', 'y', ':', 'r', 'o', 'u', 't', 'e', 's', '\202', '\323', '\344', '\223', '\002', '\003', ':', '\001', '*', '\032', '0', '\212', '\244', '\226', '\363',
-'\007', '*', '\n', '(', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3',
-'.', 'R', 'o', 'u', 't', 'e', 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '2', '\313', '\001', '\n', '\033', 'V',
-'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'S', 'e', 'r', 'v', 'i', 'c',
-'e', '\022', '\200', '\001', '\n', '\021', 'D', 'e', 'l', 't', 'a', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', 's', '\022', '1',
-'.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.',
-'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032',
-'2', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y',
-'.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's',
-'e', '\"', '\000', '(', '\001', '0', '\001', '\032', ')', '\212', '\244', '\226', '\363', '\007', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o',
-'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't',
-'B', '=', '\n', '$', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 's',
-'e', 'r', 'v', 'i', 'c', 'e', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', 'B', '\010', 'R', 'd', 's', 'P', 'r', 'o', 't', 'o',
-'P', '\001', '\210', '\001', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', 'z', '\n', '\013', 'D', 'e', 'l', 't', 'a', 'R',
+'o', 'u', 't', 'e', 's', '\022', '1', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's',
+'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R',
+'e', 'q', 'u', 'e', 's', 't', '\032', '2', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i',
+'s', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y',
+'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001', '\022', '\221', '\001', '\n', '\013', 'F', 'e', 't', 'c', 'h', 'R',
+'o', 'u', 't', 'e', 's', '\022', ',', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's',
+'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's',
+'t', '\032', '-', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e',
+'r', 'y', '.', 'v', '3', '.', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '%',
+'\202', '\323', '\344', '\223', '\002', '\026', '\"', '\024', '/', 'v', '3', '/', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', ':', 'r', 'o', 'u',
+'t', 'e', 's', '\202', '\323', '\344', '\223', '\002', '\003', ':', '\001', '*', '\032', '0', '\212', '\244', '\226', '\363', '\007', '*', '\n', '(', 'e', 'n', 'v',
+'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o', 'u', 't', 'e', '.', 'v', '3', '.', 'R', 'o', 'u', 't', 'e', 'C',
+'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', '2', '\313', '\001', '\n', '\033', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H',
+'o', 's', 't', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'S', 'e', 'r', 'v', 'i', 'c', 'e', '\022', '\200', '\001', '\n', '\021', 'D',
+'e', 'l', 't', 'a', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', 's', '\022', '1', '.', 'e', 'n', 'v', 'o', 'y', '.',
+'s', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l', 't',
+'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 'q', 'u', 'e', 's', 't', '\032', '2', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.', 'd', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', '.', 'v', '3', '.', 'D', 'e', 'l',
+'t', 'a', 'D', 'i', 's', 'c', 'o', 'v', 'e', 'r', 'y', 'R', 'e', 's', 'p', 'o', 'n', 's', 'e', '\"', '\000', '(', '\001', '0', '\001',
+'\032', ')', '\212', '\244', '\226', '\363', '\007', '#', '\n', '!', 'e', 'n', 'v', 'o', 'y', '.', 'c', 'o', 'n', 'f', 'i', 'g', '.', 'r', 'o',
+'u', 't', 'e', '.', 'v', '3', '.', 'V', 'i', 'r', 't', 'u', 'a', 'l', 'H', 'o', 's', 't', 'B', '=', '\n', '$', 'i', 'o', '.',
+'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 's', 'e', 'r', 'v', 'i', 'c', 'e', '.',
+'r', 'o', 'u', 't', 'e', '.', 'v', '3', 'B', '\010', 'R', 'd', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\210', '\001', '\001', '\272', '\200',
+'\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[8] = {
+static upb_def_init *deps[6] = {
&envoy_service_discovery_v3_discovery_proto_upbdefinit,
&google_api_annotations_proto_upbdefinit,
- &google_protobuf_wrappers_proto_upbdefinit,
&envoy_annotations_resource_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
- &validate_validate_proto_upbdefinit,
NULL
};
deps,
layouts,
"envoy/service/route/v3/rds.proto",
- UPB_STRVIEW_INIT(descriptor, 1071)
+ UPB_STRVIEW_INIT(descriptor, 1014)
};
#include "envoy/type/matcher/v3/string.upbdefs.h"
extern upb_def_init envoy_type_matcher_v3_regex_proto_upbdefinit;
-extern upb_def_init envoy_annotations_deprecation_proto_upbdefinit;
extern upb_def_init udpa_annotations_status_proto_upbdefinit;
extern upb_def_init udpa_annotations_versioning_proto_upbdefinit;
extern upb_def_init validate_validate_proto_upbdefinit;
&envoy_type_matcher_v3_ListStringMatcher_msginit,
};
-static const char descriptor[775] = {'\n', '\"', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't', 'c', 'h', 'e', 'r', '/', 'v', '3', '/', 's',
+static const char descriptor[738] = {'\n', '\"', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't', 'c', 'h', 'e', 'r', '/', 'v', '3', '/', 's',
't', 'r', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\022', '\025', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm',
'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '\032', '!', 'e', 'n', 'v', 'o', 'y', '/', 't', 'y', 'p', 'e', '/', 'm', 'a', 't',
-'c', 'h', 'e', 'r', '/', 'v', '3', '/', 'r', 'e', 'g', 'e', 'x', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'e', 'n', 'v', 'o',
-'y', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'd', 'e', 'p', 'r', 'e', 'c', 'a', 't', 'i', 'o', 'n',
-'.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/',
-'s', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a',
-'t', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v',
-'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\321', '\002',
-'\n', '\r', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', '\026', '\n', '\005', 'e', 'x', 'a', 'c', 't', '\030',
-'\001', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\005', 'e', 'x', 'a', 'c', 't', '\022', '!', '\n', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\030',
-'\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\022',
-'!', '\n', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\030', '\003', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H',
-'\000', 'R', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\022', 'N', '\n', '\n', 's', 'a', 'f', 'e', '_', 'r', 'e', 'g', 'e', 'x', '\030', '\005',
-' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r',
-'.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020',
-'\001', 'H', '\000', 'R', '\t', 's', 'a', 'f', 'e', 'R', 'e', 'g', 'e', 'x', '\022', '%', '\n', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n',
-'s', '\030', '\007', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\010', 'c', 'o', 'n', 't', 'a',
-'i', 'n', 's', '\022', '\037', '\n', '\013', 'i', 'g', 'n', 'o', 'r', 'e', '_', 'c', 'a', 's', 'e', '\030', '\006', ' ', '\001', '(', '\010', 'R',
-'\n', 'i', 'g', 'n', 'o', 'r', 'e', 'C', 'a', 's', 'e', ':', '\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y',
-'.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h',
-'e', 'r', 'B', '\024', '\n', '\r', 'm', 'a', 't', 'c', 'h', '_', 'p', 'a', 't', 't', 'e', 'r', 'n', '\022', '\003', '\370', 'B', '\001', 'J',
-'\004', '\010', '\004', '\020', '\005', 'R', '\005', 'r', 'e', 'g', 'e', 'x', '\"', '\214', '\001', '\n', '\021', 'L', 'i', 's', 't', 'S', 't', 'r', 'i',
-'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'J', '\n', '\010', 'p', 'a', 't', 't', 'e', 'r', 'n', 's', '\030', '\001', ' ', '\003',
-'(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v',
-'3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001',
-'R', '\010', 'p', 'a', 't', 't', 'e', 'r', 'n', 's', ':', '+', '\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.',
-'t', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'L', 'i', 's', 't', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a',
-'t', 'c', 'h', 'e', 'r', 'B', '<', '\n', '#', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n',
-'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', 'B', '\013', 'S', 't', 'r', 'i',
-'n', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+'c', 'h', 'e', 'r', '/', 'v', '3', '/', 'r', 'e', 'g', 'e', 'x', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a',
+'/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o',
+'\032', '!', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 'v', 'e', 'r', 's', 'i', 'o',
+'n', 'i', 'n', 'g', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i',
+'d', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\321', '\002', '\n', '\r', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c',
+'h', 'e', 'r', '\022', '\026', '\n', '\005', 'e', 'x', 'a', 'c', 't', '\030', '\001', ' ', '\001', '(', '\t', 'H', '\000', 'R', '\005', 'e', 'x', 'a',
+'c', 't', '\022', '!', '\n', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002',
+'\020', '\001', 'H', '\000', 'R', '\006', 'p', 'r', 'e', 'f', 'i', 'x', '\022', '!', '\n', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\030', '\003', ' ',
+'\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'H', '\000', 'R', '\006', 's', 'u', 'f', 'f', 'i', 'x', '\022', 'N', '\n',
+'\n', 's', 'a', 'f', 'e', '_', 'r', 'e', 'g', 'e', 'x', '\030', '\005', ' ', '\001', '(', '\013', '2', '#', '.', 'e', 'n', 'v', 'o', 'y',
+'.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'R', 'e', 'g', 'e', 'x', 'M', 'a', 't',
+'c', 'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\212', '\001', '\002', '\020', '\001', 'H', '\000', 'R', '\t', 's', 'a', 'f', 'e', 'R', 'e', 'g',
+'e', 'x', '\022', '%', '\n', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\030', '\007', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004',
+'r', '\002', '\020', '\001', 'H', '\000', 'R', '\010', 'c', 'o', 'n', 't', 'a', 'i', 'n', 's', '\022', '\037', '\n', '\013', 'i', 'g', 'n', 'o', 'r',
+'e', '_', 'c', 'a', 's', 'e', '\030', '\006', ' ', '\001', '(', '\010', 'R', '\n', 'i', 'g', 'n', 'o', 'r', 'e', 'C', 'a', 's', 'e', ':',
+'\'', '\232', '\305', '\210', '\036', '\"', '\n', ' ', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e',
+'r', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '\024', '\n', '\r', 'm', 'a', 't', 'c', 'h', '_',
+'p', 'a', 't', 't', 'e', 'r', 'n', '\022', '\003', '\370', 'B', '\001', 'J', '\004', '\010', '\004', '\020', '\005', 'R', '\005', 'r', 'e', 'g', 'e', 'x',
+'\"', '\214', '\001', '\n', '\021', 'L', 'i', 's', 't', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', '\022', 'J', '\n',
+'\010', 'p', 'a', 't', 't', 'e', 'r', 'n', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '$', '.', 'e', 'n', 'v', 'o', 'y', '.', 't',
+'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r', '.', 'v', '3', '.', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c',
+'h', 'e', 'r', 'B', '\010', '\372', 'B', '\005', '\222', '\001', '\002', '\010', '\001', 'R', '\010', 'p', 'a', 't', 't', 'e', 'r', 'n', 's', ':', '+',
+'\232', '\305', '\210', '\036', '&', '\n', '$', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't', 'c', 'h', 'e', 'r',
+'.', 'L', 'i', 's', 't', 'S', 't', 'r', 'i', 'n', 'g', 'M', 'a', 't', 'c', 'h', 'e', 'r', 'B', '<', '\n', '#', 'i', 'o', '.',
+'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'e', 'n', 'v', 'o', 'y', '.', 't', 'y', 'p', 'e', '.', 'm', 'a', 't',
+'c', 'h', 'e', 'r', '.', 'v', '3', 'B', '\013', 'S', 't', 'r', 'i', 'n', 'g', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310',
+'\321', '\006', '\002', '\020', '\002', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
-static upb_def_init *deps[6] = {
+static upb_def_init *deps[5] = {
&envoy_type_matcher_v3_regex_proto_upbdefinit,
- &envoy_annotations_deprecation_proto_upbdefinit,
&udpa_annotations_status_proto_upbdefinit,
&udpa_annotations_versioning_proto_upbdefinit,
&validate_validate_proto_upbdefinit,
deps,
layouts,
"envoy/type/matcher/v3/string.proto",
- UPB_STRVIEW_INIT(descriptor, 775)
+ UPB_STRVIEW_INIT(descriptor, 738)
};
extern const upb_msglayout google_api_expr_v1alpha1_Constant_msginit;
extern const upb_msglayout google_api_expr_v1alpha1_SourceInfo_msginit;
extern const upb_msglayout google_api_expr_v1alpha1_SourceInfo_PositionsEntry_msginit;
+extern const upb_msglayout google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_msginit;
extern const upb_msglayout google_api_expr_v1alpha1_SourcePosition_msginit;
-static const upb_msglayout *layouts[13] = {
+static const upb_msglayout *layouts[14] = {
&google_api_expr_v1alpha1_ParsedExpr_msginit,
&google_api_expr_v1alpha1_Expr_msginit,
&google_api_expr_v1alpha1_Expr_Ident_msginit,
&google_api_expr_v1alpha1_Constant_msginit,
&google_api_expr_v1alpha1_SourceInfo_msginit,
&google_api_expr_v1alpha1_SourceInfo_PositionsEntry_msginit,
+ &google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_msginit,
&google_api_expr_v1alpha1_SourcePosition_msginit,
};
-static const char descriptor[2877] = {'\n', '%', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'a', 'p', 'i', '/', 'e', 'x', 'p', 'r', '/', 'v', '1', 'a', 'l', 'p', 'h', 'a',
+static const char descriptor[3059] = {'\n', '%', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'a', 'p', 'i', '/', 'e', 'x', 'p', 'r', '/', 'v', '1', 'a', 'l', 'p', 'h', 'a',
'1', '/', 's', 'y', 'n', 't', 'a', 'x', '.', 'p', 'r', 'o', 't', 'o', '\022', '\030', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'a', 'p',
'i', '.', 'e', 'x', 'p', 'r', '.', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', '\032', '\036', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p',
'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't', 'o', '\032', '\034', 'g',
'm', 'p', '_', 'v', 'a', 'l', 'u', 'e', '\030', '\t', ' ', '\001', '(', '\013', '2', '\032', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p',
'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'T', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'B', '\002', '\030', '\001', 'H', '\000', 'R', '\016',
't', 'i', 'm', 'e', 's', 't', 'a', 'm', 'p', 'V', 'a', 'l', 'u', 'e', 'B', '\017', '\n', '\r', 'c', 'o', 'n', 's', 't', 'a', 'n',
-'t', '_', 'k', 'i', 'n', 'd', '\"', '\203', '\002', '\n', '\n', 'S', 'o', 'u', 'r', 'c', 'e', 'I', 'n', 'f', 'o', '\022', '%', '\n', '\016',
+'t', '_', 'k', 'i', 'n', 'd', '\"', '\271', '\003', '\n', '\n', 'S', 'o', 'u', 'r', 'c', 'e', 'I', 'n', 'f', 'o', '\022', '%', '\n', '\016',
's', 'y', 'n', 't', 'a', 'x', '_', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\r', 's', 'y', 'n',
't', 'a', 'x', 'V', 'e', 'r', 's', 'i', 'o', 'n', '\022', '\032', '\n', '\010', 'l', 'o', 'c', 'a', 't', 'i', 'o', 'n', '\030', '\002', ' ',
'\001', '(', '\t', 'R', '\010', 'l', 'o', 'c', 'a', 't', 'i', 'o', 'n', '\022', '!', '\n', '\014', 'l', 'i', 'n', 'e', '_', 'o', 'f', 'f',
'\n', '\t', 'p', 'o', 's', 'i', 't', 'i', 'o', 'n', 's', '\030', '\004', ' ', '\003', '(', '\013', '2', '3', '.', 'g', 'o', 'o', 'g', 'l',
'e', '.', 'a', 'p', 'i', '.', 'e', 'x', 'p', 'r', '.', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', '.', 'S', 'o', 'u', 'r', 'c',
'e', 'I', 'n', 'f', 'o', '.', 'P', 'o', 's', 'i', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', 'R', '\t', 'p', 'o', 's',
-'i', 't', 'i', 'o', 'n', 's', '\032', '<', '\n', '\016', 'P', 'o', 's', 'i', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', '\022',
-'\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\003', 'R', '\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005', 'v', 'a', 'l', 'u',
-'e', '\030', '\002', ' ', '\001', '(', '\005', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', '\"', 'p', '\n', '\016', 'S', 'o', 'u',
-'r', 'c', 'e', 'P', 'o', 's', 'i', 't', 'i', 'o', 'n', '\022', '\032', '\n', '\010', 'l', 'o', 'c', 'a', 't', 'i', 'o', 'n', '\030', '\001',
-' ', '\001', '(', '\t', 'R', '\010', 'l', 'o', 'c', 'a', 't', 'i', 'o', 'n', '\022', '\026', '\n', '\006', 'o', 'f', 'f', 's', 'e', 't', '\030',
-'\002', ' ', '\001', '(', '\005', 'R', '\006', 'o', 'f', 'f', 's', 'e', 't', '\022', '\022', '\n', '\004', 'l', 'i', 'n', 'e', '\030', '\003', ' ', '\001',
-'(', '\005', 'R', '\004', 'l', 'i', 'n', 'e', '\022', '\026', '\n', '\006', 'c', 'o', 'l', 'u', 'm', 'n', '\030', '\004', ' ', '\001', '(', '\005', 'R',
-'\006', 'c', 'o', 'l', 'u', 'm', 'n', 'B', 'n', '\n', '\034', 'c', 'o', 'm', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'a', 'p', 'i',
-'.', 'e', 'x', 'p', 'r', '.', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', 'B', '\013', 'S', 'y', 'n', 't', 'a', 'x', 'P', 'r', 'o',
-'t', 'o', 'P', '\001', 'Z', '<', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'g', 'o', 'l', 'a', 'n', 'g', '.', 'o', 'r', 'g', '/', 'g',
-'e', 'n', 'p', 'r', 'o', 't', 'o', '/', 'g', 'o', 'o', 'g', 'l', 'e', 'a', 'p', 'i', 's', '/', 'a', 'p', 'i', '/', 'e', 'x',
-'p', 'r', '/', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', ';', 'e', 'x', 'p', 'r', '\370', '\001', '\001', 'b', '\006', 'p', 'r', 'o', 't',
-'o', '3',
+'i', 't', 'i', 'o', 'n', 's', '\022', 'U', '\n', '\013', 'm', 'a', 'c', 'r', 'o', '_', 'c', 'a', 'l', 'l', 's', '\030', '\005', ' ', '\003',
+'(', '\013', '2', '4', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'a', 'p', 'i', '.', 'e', 'x', 'p', 'r', '.', 'v', '1', 'a', 'l',
+'p', 'h', 'a', '1', '.', 'S', 'o', 'u', 'r', 'c', 'e', 'I', 'n', 'f', 'o', '.', 'M', 'a', 'c', 'r', 'o', 'C', 'a', 'l', 'l',
+'s', 'E', 'n', 't', 'r', 'y', 'R', '\n', 'm', 'a', 'c', 'r', 'o', 'C', 'a', 'l', 'l', 's', '\032', '<', '\n', '\016', 'P', 'o', 's',
+'i', 't', 'i', 'o', 'n', 's', 'E', 'n', 't', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\003', 'R',
+'\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005', 'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\005', 'R', '\005', 'v', 'a', 'l', 'u',
+'e', ':', '\002', '8', '\001', '\032', ']', '\n', '\017', 'M', 'a', 'c', 'r', 'o', 'C', 'a', 'l', 'l', 's', 'E', 'n', 't', 'r', 'y', '\022',
+'\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\003', 'R', '\003', 'k', 'e', 'y', '\022', '4', '\n', '\005', 'v', 'a', 'l', 'u',
+'e', '\030', '\002', ' ', '\001', '(', '\013', '2', '\036', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'a', 'p', 'i', '.', 'e', 'x', 'p', 'r',
+'.', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', '.', 'E', 'x', 'p', 'r', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001',
+'\"', 'p', '\n', '\016', 'S', 'o', 'u', 'r', 'c', 'e', 'P', 'o', 's', 'i', 't', 'i', 'o', 'n', '\022', '\032', '\n', '\010', 'l', 'o', 'c',
+'a', 't', 'i', 'o', 'n', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\010', 'l', 'o', 'c', 'a', 't', 'i', 'o', 'n', '\022', '\026', '\n', '\006',
+'o', 'f', 'f', 's', 'e', 't', '\030', '\002', ' ', '\001', '(', '\005', 'R', '\006', 'o', 'f', 'f', 's', 'e', 't', '\022', '\022', '\n', '\004', 'l',
+'i', 'n', 'e', '\030', '\003', ' ', '\001', '(', '\005', 'R', '\004', 'l', 'i', 'n', 'e', '\022', '\026', '\n', '\006', 'c', 'o', 'l', 'u', 'm', 'n',
+'\030', '\004', ' ', '\001', '(', '\005', 'R', '\006', 'c', 'o', 'l', 'u', 'm', 'n', 'B', 'n', '\n', '\034', 'c', 'o', 'm', '.', 'g', 'o', 'o',
+'g', 'l', 'e', '.', 'a', 'p', 'i', '.', 'e', 'x', 'p', 'r', '.', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', 'B', '\013', 'S', 'y',
+'n', 't', 'a', 'x', 'P', 'r', 'o', 't', 'o', 'P', '\001', 'Z', '<', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'g', 'o', 'l', 'a', 'n',
+'g', '.', 'o', 'r', 'g', '/', 'g', 'e', 'n', 'p', 'r', 'o', 't', 'o', '/', 'g', 'o', 'o', 'g', 'l', 'e', 'a', 'p', 'i', 's',
+'/', 'a', 'p', 'i', '/', 'e', 'x', 'p', 'r', '/', 'v', '1', 'a', 'l', 'p', 'h', 'a', '1', ';', 'e', 'x', 'p', 'r', '\370', '\001',
+'\001', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
};
static upb_def_init *deps[4] = {
deps,
layouts,
"google/api/expr/v1alpha1/syntax.proto",
- UPB_STRVIEW_INIT(descriptor, 2877)
+ UPB_STRVIEW_INIT(descriptor, 3059)
};
return upb_symtab_lookupmsg(s, "google.api.expr.v1alpha1.SourceInfo.PositionsEntry");
}
+UPB_INLINE const upb_msgdef *google_api_expr_v1alpha1_SourceInfo_MacroCallsEntry_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &google_api_expr_v1alpha1_syntax_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "google.api.expr.v1alpha1.SourceInfo.MacroCallsEntry");
+}
+
UPB_INLINE const upb_msgdef *google_api_expr_v1alpha1_SourcePosition_getmsgdef(upb_symtab *s) {
_upb_symtab_loaddefinit(s, &google_api_expr_v1alpha1_syntax_proto_upbdefinit);
return upb_symtab_lookupmsg(s, "google.api.expr.v1alpha1.SourcePosition");
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * src/proto/grpc/auth/v1/authz_policy.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "src/proto/grpc/auth/v1/authz_policy.upbdefs.h"
+
+extern const upb_msglayout grpc_auth_v1_Peer_msginit;
+extern const upb_msglayout grpc_auth_v1_Header_msginit;
+extern const upb_msglayout grpc_auth_v1_Request_msginit;
+extern const upb_msglayout grpc_auth_v1_Rule_msginit;
+extern const upb_msglayout grpc_auth_v1_AuthorizationPolicy_msginit;
+
+static const upb_msglayout *layouts[5] = {
+ &grpc_auth_v1_Peer_msginit,
+ &grpc_auth_v1_Header_msginit,
+ &grpc_auth_v1_Request_msginit,
+ &grpc_auth_v1_Rule_msginit,
+ &grpc_auth_v1_AuthorizationPolicy_msginit,
+};
+
+static const char descriptor[507] = {'\n', ')', 's', 'r', 'c', '/', 'p', 'r', 'o', 't', 'o', '/', 'g', 'r', 'p', 'c', '/', 'a', 'u', 't', 'h', '/', 'v', '1', '/',
+'a', 'u', 't', 'h', 'z', '_', 'p', 'o', 'l', 'i', 'c', 'y', '.', 'p', 'r', 'o', 't', 'o', '\022', '\014', 'g', 'r', 'p', 'c', '.',
+'a', 'u', 't', 'h', '.', 'v', '1', '\"', '&', '\n', '\004', 'P', 'e', 'e', 'r', '\022', '\036', '\n', '\n', 'p', 'r', 'i', 'n', 'c', 'i',
+'p', 'a', 'l', 's', '\030', '\001', ' ', '\003', '(', '\t', 'R', '\n', 'p', 'r', 'i', 'n', 'c', 'i', 'p', 'a', 'l', 's', '\"', '2', '\n',
+'\006', 'H', 'e', 'a', 'd', 'e', 'r', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y',
+'\022', '\026', '\n', '\006', 'v', 'a', 'l', 'u', 'e', 's', '\030', '\002', ' ', '\003', '(', '\t', 'R', '\006', 'v', 'a', 'l', 'u', 'e', 's', '\"',
+'O', '\n', '\007', 'R', 'e', 'q', 'u', 'e', 's', 't', '\022', '\024', '\n', '\005', 'p', 'a', 't', 'h', 's', '\030', '\001', ' ', '\003', '(', '\t',
+'R', '\005', 'p', 'a', 't', 'h', 's', '\022', '.', '\n', '\007', 'h', 'e', 'a', 'd', 'e', 'r', 's', '\030', '\003', ' ', '\003', '(', '\013', '2',
+'\024', '.', 'g', 'r', 'p', 'c', '.', 'a', 'u', 't', 'h', '.', 'v', '1', '.', 'H', 'e', 'a', 'd', 'e', 'r', 'R', '\007', 'h', 'e',
+'a', 'd', 'e', 'r', 's', '\"', 'w', '\n', '\004', 'R', 'u', 'l', 'e', '\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001',
+'(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '*', '\n', '\006', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\002', ' ', '\001', '(', '\013', '2',
+'\022', '.', 'g', 'r', 'p', 'c', '.', 'a', 'u', 't', 'h', '.', 'v', '1', '.', 'P', 'e', 'e', 'r', 'R', '\006', 's', 'o', 'u', 'r',
+'c', 'e', '\022', '/', '\n', '\007', 'r', 'e', 'q', 'u', 'e', 's', 't', '\030', '\003', ' ', '\001', '(', '\013', '2', '\025', '.', 'g', 'r', 'p',
+'c', '.', 'a', 'u', 't', 'h', '.', 'v', '1', '.', 'R', 'e', 'q', 'u', 'e', 's', 't', 'R', '\007', 'r', 'e', 'q', 'u', 'e', 's',
+'t', '\"', '\221', '\001', '\n', '\023', 'A', 'u', 't', 'h', 'o', 'r', 'i', 'z', 'a', 't', 'i', 'o', 'n', 'P', 'o', 'l', 'i', 'c', 'y',
+'\022', '\022', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '1', '\n', '\n', 'd',
+'e', 'n', 'y', '_', 'r', 'u', 'l', 'e', 's', '\030', '\002', ' ', '\003', '(', '\013', '2', '\022', '.', 'g', 'r', 'p', 'c', '.', 'a', 'u',
+'t', 'h', '.', 'v', '1', '.', 'R', 'u', 'l', 'e', 'R', '\t', 'd', 'e', 'n', 'y', 'R', 'u', 'l', 'e', 's', '\022', '3', '\n', '\013',
+'a', 'l', 'l', 'o', 'w', '_', 'r', 'u', 'l', 'e', 's', '\030', '\003', ' ', '\003', '(', '\013', '2', '\022', '.', 'g', 'r', 'p', 'c', '.',
+'a', 'u', 't', 'h', '.', 'v', '1', '.', 'R', 'u', 'l', 'e', 'R', '\n', 'a', 'l', 'l', 'o', 'w', 'R', 'u', 'l', 'e', 's', 'b',
+'\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[1] = {
+ NULL
+};
+
+upb_def_init src_proto_grpc_auth_v1_authz_policy_proto_upbdefinit = {
+ deps,
+ layouts,
+ "src/proto/grpc/auth/v1/authz_policy.proto",
+ UPB_STRVIEW_INIT(descriptor, 507)
+};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * src/proto/grpc/auth/v1/authz_policy.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef SRC_PROTO_GRPC_AUTH_V1_AUTHZ_POLICY_PROTO_UPBDEFS_H_
+#define SRC_PROTO_GRPC_AUTH_V1_AUTHZ_POLICY_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init src_proto_grpc_auth_v1_authz_policy_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *grpc_auth_v1_Peer_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &src_proto_grpc_auth_v1_authz_policy_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "grpc.auth.v1.Peer");
+}
+
+UPB_INLINE const upb_msgdef *grpc_auth_v1_Header_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &src_proto_grpc_auth_v1_authz_policy_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "grpc.auth.v1.Header");
+}
+
+UPB_INLINE const upb_msgdef *grpc_auth_v1_Request_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &src_proto_grpc_auth_v1_authz_policy_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "grpc.auth.v1.Request");
+}
+
+UPB_INLINE const upb_msgdef *grpc_auth_v1_Rule_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &src_proto_grpc_auth_v1_authz_policy_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "grpc.auth.v1.Rule");
+}
+
+UPB_INLINE const upb_msgdef *grpc_auth_v1_AuthorizationPolicy_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &src_proto_grpc_auth_v1_authz_policy_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "grpc.auth.v1.AuthorizationPolicy");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* SRC_PROTO_GRPC_AUTH_V1_AUTHZ_POLICY_PROTO_UPBDEFS_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/authority.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include "upb/def.h"
-#include "udpa/core/v1/authority.upbdefs.h"
-
-extern upb_def_init udpa_annotations_status_proto_upbdefinit;
-extern upb_def_init validate_validate_proto_upbdefinit;
-extern const upb_msglayout udpa_core_v1_Authority_msginit;
-
-static const upb_msglayout *layouts[1] = {
- &udpa_core_v1_Authority_msginit,
-};
-
-static const char descriptor[208] = {'\n', '\034', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '.',
-'p', 'r', 'o', 't', 'o', '\022', '\014', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '\032', '\035', 'u', 'd', 'p', 'a',
-'/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o',
-'\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o',
-'\"', '(', '\n', '\t', 'A', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001',
-'(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', 'B', '8', '\n', '\034', 'c', 'o', 'm', '.',
-'g', 'i', 't', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', 'B',
-'\016', 'A', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\010', '\001',
-'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
-};
-
-static upb_def_init *deps[3] = {
- &udpa_annotations_status_proto_upbdefinit,
- &validate_validate_proto_upbdefinit,
- NULL
-};
-
-upb_def_init udpa_core_v1_authority_proto_upbdefinit = {
- deps,
- layouts,
- "udpa/core/v1/authority.proto",
- UPB_STRVIEW_INIT(descriptor, 208)
-};
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/authority.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_AUTHORITY_PROTO_UPBDEFS_H_
-#define UDPA_CORE_V1_AUTHORITY_PROTO_UPBDEFS_H_
-
-#include "upb/def.h"
-#include "upb/port_def.inc"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "upb/def.h"
-
-#include "upb/port_def.inc"
-
-extern upb_def_init udpa_core_v1_authority_proto_upbdefinit;
-
-UPB_INLINE const upb_msgdef *udpa_core_v1_Authority_getmsgdef(upb_symtab *s) {
- _upb_symtab_loaddefinit(s, &udpa_core_v1_authority_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "udpa.core.v1.Authority");
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_AUTHORITY_PROTO_UPBDEFS_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/collection_entry.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include "upb/def.h"
-#include "udpa/core/v1/collection_entry.upbdefs.h"
-
-extern upb_def_init google_protobuf_any_proto_upbdefinit;
-extern upb_def_init udpa_annotations_status_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_resource_locator_proto_upbdefinit;
-extern upb_def_init validate_validate_proto_upbdefinit;
-extern const upb_msglayout udpa_core_v1_CollectionEntry_msginit;
-extern const upb_msglayout udpa_core_v1_CollectionEntry_InlineEntry_msginit;
-
-static const upb_msglayout *layouts[2] = {
- &udpa_core_v1_CollectionEntry_msginit,
- &udpa_core_v1_CollectionEntry_InlineEntry_msginit,
-};
-
-static const char descriptor[571] = {'\n', '#', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n',
-'_', 'e', 'n', 't', 'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\022', '\014', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'1', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r',
-'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a',
-'t', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '#', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r',
-'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a',
-'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\305', '\002', '\n',
-'\017', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', '\022', '9', '\n', '\007', 'l', 'o', 'c', 'a', 't',
-'o', 'r', '\030', '\001', ' ', '\001', '(', '\013', '2', '\035', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'R',
-'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'H', '\000', 'R', '\007', 'l', 'o', 'c', 'a', 't', 'o', 'r',
-'\022', 'N', '\n', '\014', 'i', 'n', 'l', 'i', 'n', 'e', '_', 'e', 'n', 't', 'r', 'y', '\030', '\002', ' ', '\001', '(', '\013', '2', ')', '.',
-'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n',
-'t', 'r', 'y', '.', 'I', 'n', 'l', 'i', 'n', 'e', 'E', 'n', 't', 'r', 'y', 'H', '\000', 'R', '\013', 'i', 'n', 'l', 'i', 'n', 'e',
-'E', 'n', 't', 'r', 'y', '\032', '\213', '\001', '\n', '\013', 'I', 'n', 'l', 'i', 'n', 'e', 'E', 'n', 't', 'r', 'y', '\022', '0', '\n', '\004',
-'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t', 'B', '\034', '\372', 'B', '\031', 'r', '\027', '2', '\025', '^', '[', '0', '-', '9', 'a',
-'-', 'z', 'A', '-', 'Z', '_', '\\', '-', '\\', '.', '~', ':', ']', '+', '$', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\030', '\n', '\007',
-'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '0', '\n',
-'\010', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\010', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'B', '\031', '\n',
-'\022', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B',
-'>', '\n', '\034', 'c', 'o', 'm', '.', 'g', 'i', 't', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'u', 'd', 'p', 'a', '.', 'c',
-'o', 'r', 'e', '.', 'v', '1', 'B', '\024', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', 'P', 'r',
-'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\010', '\001', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
-};
-
-static upb_def_init *deps[5] = {
- &google_protobuf_any_proto_upbdefinit,
- &udpa_annotations_status_proto_upbdefinit,
- &udpa_core_v1_resource_locator_proto_upbdefinit,
- &validate_validate_proto_upbdefinit,
- NULL
-};
-
-upb_def_init udpa_core_v1_collection_entry_proto_upbdefinit = {
- deps,
- layouts,
- "udpa/core/v1/collection_entry.proto",
- UPB_STRVIEW_INIT(descriptor, 571)
-};
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/collection_entry.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_COLLECTION_ENTRY_PROTO_UPBDEFS_H_
-#define UDPA_CORE_V1_COLLECTION_ENTRY_PROTO_UPBDEFS_H_
-
-#include "upb/def.h"
-#include "upb/port_def.inc"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "upb/def.h"
-
-#include "upb/port_def.inc"
-
-extern upb_def_init udpa_core_v1_collection_entry_proto_upbdefinit;
-
-UPB_INLINE const upb_msgdef *udpa_core_v1_CollectionEntry_getmsgdef(upb_symtab *s) {
- _upb_symtab_loaddefinit(s, &udpa_core_v1_collection_entry_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "udpa.core.v1.CollectionEntry");
-}
-
-UPB_INLINE const upb_msgdef *udpa_core_v1_CollectionEntry_InlineEntry_getmsgdef(upb_symtab *s) {
- _upb_symtab_loaddefinit(s, &udpa_core_v1_collection_entry_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "udpa.core.v1.CollectionEntry.InlineEntry");
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_COLLECTION_ENTRY_PROTO_UPBDEFS_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/context_params.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include "upb/def.h"
-#include "udpa/core/v1/context_params.upbdefs.h"
-
-extern upb_def_init udpa_annotations_status_proto_upbdefinit;
-extern const upb_msglayout udpa_core_v1_ContextParams_msginit;
-extern const upb_msglayout udpa_core_v1_ContextParams_ParamsEntry_msginit;
-
-static const upb_msglayout *layouts[2] = {
- &udpa_core_v1_ContextParams_msginit,
- &udpa_core_v1_ContextParams_ParamsEntry_msginit,
-};
-
-static const char descriptor[292] = {'\n', '!', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'p', 'a',
-'r', 'a', 'm', 's', '.', 'p', 'r', 'o', 't', 'o', '\022', '\014', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '\032',
-'\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.',
-'p', 'r', 'o', 't', 'o', '\"', '\213', '\001', '\n', '\r', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', '\022', '?',
-'\n', '\006', 'p', 'a', 'r', 'a', 'm', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '\'', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r',
-'e', '.', 'v', '1', '.', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', '.', 'P', 'a', 'r', 'a', 'm', 's',
-'E', 'n', 't', 'r', 'y', 'R', '\006', 'p', 'a', 'r', 'a', 'm', 's', '\032', '9', '\n', '\013', 'P', 'a', 'r', 'a', 'm', 's', 'E', 'n',
-'t', 'r', 'y', '\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005',
-'v', 'a', 'l', 'u', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', 'B', '<', '\n',
-'\034', 'c', 'o', 'm', '.', 'g', 'i', 't', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r',
-'e', '.', 'v', '1', 'B', '\022', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', 'P', 'r', 'o', 't', 'o', 'P',
-'\001', '\272', '\200', '\310', '\321', '\006', '\002', '\010', '\001', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
-};
-
-static upb_def_init *deps[2] = {
- &udpa_annotations_status_proto_upbdefinit,
- NULL
-};
-
-upb_def_init udpa_core_v1_context_params_proto_upbdefinit = {
- deps,
- layouts,
- "udpa/core/v1/context_params.proto",
- UPB_STRVIEW_INIT(descriptor, 292)
-};
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/context_params.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_CONTEXT_PARAMS_PROTO_UPBDEFS_H_
-#define UDPA_CORE_V1_CONTEXT_PARAMS_PROTO_UPBDEFS_H_
-
-#include "upb/def.h"
-#include "upb/port_def.inc"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "upb/def.h"
-
-#include "upb/port_def.inc"
-
-extern upb_def_init udpa_core_v1_context_params_proto_upbdefinit;
-
-UPB_INLINE const upb_msgdef *udpa_core_v1_ContextParams_getmsgdef(upb_symtab *s) {
- _upb_symtab_loaddefinit(s, &udpa_core_v1_context_params_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "udpa.core.v1.ContextParams");
-}
-
-UPB_INLINE const upb_msgdef *udpa_core_v1_ContextParams_ParamsEntry_getmsgdef(upb_symtab *s) {
- _upb_symtab_loaddefinit(s, &udpa_core_v1_context_params_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "udpa.core.v1.ContextParams.ParamsEntry");
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_CONTEXT_PARAMS_PROTO_UPBDEFS_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include "upb/def.h"
-#include "udpa/core/v1/resource.upbdefs.h"
-
-extern upb_def_init google_protobuf_any_proto_upbdefinit;
-extern upb_def_init udpa_annotations_status_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_resource_name_proto_upbdefinit;
-extern const upb_msglayout udpa_core_v1_Resource_msginit;
-
-static const upb_msglayout *layouts[1] = {
- &udpa_core_v1_Resource_msginit,
-};
-
-static const char descriptor[337] = {'\n', '\033', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p',
-'r', 'o', 't', 'o', '\022', '\014', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '\032', '\031', 'g', 'o', 'o', 'g', 'l',
-'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p',
-'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't',
-'o', '\032', ' ', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_',
-'n', 'a', 'm', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\206', '\001', '\n', '\010', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', '\022', '.',
-'\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\032', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.',
-'v', '1', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\030', '\n', '\007',
-'v', 'e', 'r', 's', 'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '0', '\n',
-'\010', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.',
-'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\010', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'B', '7', '\n',
-'\034', 'c', 'o', 'm', '.', 'g', 'i', 't', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r',
-'e', '.', 'v', '1', 'B', '\r', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321',
-'\006', '\002', '\010', '\001', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
-};
-
-static upb_def_init *deps[4] = {
- &google_protobuf_any_proto_upbdefinit,
- &udpa_annotations_status_proto_upbdefinit,
- &udpa_core_v1_resource_name_proto_upbdefinit,
- NULL
-};
-
-upb_def_init udpa_core_v1_resource_proto_upbdefinit = {
- deps,
- layouts,
- "udpa/core/v1/resource.proto",
- UPB_STRVIEW_INIT(descriptor, 337)
-};
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_RESOURCE_PROTO_UPBDEFS_H_
-#define UDPA_CORE_V1_RESOURCE_PROTO_UPBDEFS_H_
-
-#include "upb/def.h"
-#include "upb/port_def.inc"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "upb/def.h"
-
-#include "upb/port_def.inc"
-
-extern upb_def_init udpa_core_v1_resource_proto_upbdefinit;
-
-UPB_INLINE const upb_msgdef *udpa_core_v1_Resource_getmsgdef(upb_symtab *s) {
- _upb_symtab_loaddefinit(s, &udpa_core_v1_resource_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "udpa.core.v1.Resource");
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_RESOURCE_PROTO_UPBDEFS_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource_locator.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include "upb/def.h"
-#include "udpa/core/v1/resource_locator.upbdefs.h"
-
-extern upb_def_init udpa_annotations_status_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_context_params_proto_upbdefinit;
-extern upb_def_init validate_validate_proto_upbdefinit;
-extern const upb_msglayout udpa_core_v1_ResourceLocator_msginit;
-extern const upb_msglayout udpa_core_v1_ResourceLocator_Directive_msginit;
-
-static const upb_msglayout *layouts[2] = {
- &udpa_core_v1_ResourceLocator_msginit,
- &udpa_core_v1_ResourceLocator_Directive_msginit,
-};
-
-static const char descriptor[756] = {'\n', '#', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'l',
-'o', 'c', 'a', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', '\014', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v',
-'1', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u',
-'s', '.', 'p', 'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'c', 'o', 'n',
-'t', 'e', 'x', 't', '_', 'p', 'a', 'r', 'a', 'm', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a',
-'t', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\233', '\004', '\n', '\017', 'R', 'e', 's',
-'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', '\022', 'F', '\n', '\006', 's', 'c', 'h', 'e', 'm', 'e', '\030', '\001', ' ',
-'\001', '(', '\016', '2', '$', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u', 'r',
-'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', '.', 'S', 'c', 'h', 'e', 'm', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020',
-'\001', 'R', '\006', 's', 'c', 'h', 'e', 'm', 'e', '\022', '\030', '\n', '\002', 'i', 'd', '\030', '\002', ' ', '\003', '(', '\t', 'B', '\010', '\372', 'B',
-'\005', '\222', '\001', '\002', '\010', '\001', 'R', '\002', 'i', 'd', '\022', '\034', '\n', '\t', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '\030', '\003',
-' ', '\001', '(', '\t', 'R', '\t', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '\022', ',', '\n', '\r', 'r', 'e', 's', 'o', 'u', 'r',
-'c', 'e', '_', 't', 'y', 'p', 'e', '\030', '\004', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\014', 'r',
-'e', 's', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', 'B', '\n', '\r', 'e', 'x', 'a', 'c', 't', '_', 'c', 'o', 'n', 't',
-'e', 'x', 't', '\030', '\005', ' ', '\001', '(', '\013', '2', '\033', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.',
-'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', 'H', '\000', 'R', '\014', 'e', 'x', 'a', 'c', 't', 'C', 'o', 'n',
-'t', 'e', 'x', 't', '\022', 'G', '\n', '\n', 'd', 'i', 'r', 'e', 'c', 't', 'i', 'v', 'e', 's', '\030', '\006', ' ', '\003', '(', '\013', '2',
-'\'', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o',
-'c', 'a', 't', 'o', 'r', '.', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'v', 'e', 'R', '\n', 'd', 'i', 'r', 'e', 'c', 't', 'i', 'v',
-'e', 's', '\032', '\211', '\001', '\n', '\t', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'v', 'e', '\022', '1', '\n', '\003', 'a', 'l', 't', '\030', '\001',
-' ', '\001', '(', '\013', '2', '\035', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'R', 'e', 's', 'o', 'u',
-'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'H', '\000', 'R', '\003', 'a', 'l', 't', '\022', '7', '\n', '\005', 'e', 'n', 't', 'r',
-'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\037', '\372', 'B', '\034', 'r', '\032', '\020', '\001', '2', '\026', '^', '[', '0', '-', '9', 'a', '-',
-'z', 'A', '-', 'Z', '_', '\\', '-', '\\', '.', '/', '~', ':', ']', '+', '$', 'H', '\000', 'R', '\005', 'e', 'n', 't', 'r', 'y', 'B',
-'\020', '\n', '\t', 'd', 'i', 'r', 'e', 'c', 't', 'i', 'v', 'e', '\022', '\003', '\370', 'B', '\001', '\"', '&', '\n', '\006', 'S', 'c', 'h', 'e',
-'m', 'e', '\022', '\010', '\n', '\004', 'U', 'D', 'P', 'A', '\020', '\000', '\022', '\010', '\n', '\004', 'H', 'T', 'T', 'P', '\020', '\001', '\022', '\010', '\n',
-'\004', 'F', 'I', 'L', 'E', '\020', '\002', 'B', '\031', '\n', '\027', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'p', 'a', 'r', 'a', 'm', '_',
-'s', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'B', '>', '\n', '\034', 'c', 'o', 'm', '.', 'g', 'i', 't', 'h', 'u', 'b', '.', 'u',
-'d', 'p', 'a', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', 'B', '\024', 'R', 'e', 's', 'o', 'u', 'r', 'c',
-'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\010', '\001', 'b', '\006',
-'p', 'r', 'o', 't', 'o', '3',
-};
-
-static upb_def_init *deps[4] = {
- &udpa_annotations_status_proto_upbdefinit,
- &udpa_core_v1_context_params_proto_upbdefinit,
- &validate_validate_proto_upbdefinit,
- NULL
-};
-
-upb_def_init udpa_core_v1_resource_locator_proto_upbdefinit = {
- deps,
- layouts,
- "udpa/core/v1/resource_locator.proto",
- UPB_STRVIEW_INIT(descriptor, 756)
-};
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource_locator.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_RESOURCE_LOCATOR_PROTO_UPBDEFS_H_
-#define UDPA_CORE_V1_RESOURCE_LOCATOR_PROTO_UPBDEFS_H_
-
-#include "upb/def.h"
-#include "upb/port_def.inc"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "upb/def.h"
-
-#include "upb/port_def.inc"
-
-extern upb_def_init udpa_core_v1_resource_locator_proto_upbdefinit;
-
-UPB_INLINE const upb_msgdef *udpa_core_v1_ResourceLocator_getmsgdef(upb_symtab *s) {
- _upb_symtab_loaddefinit(s, &udpa_core_v1_resource_locator_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "udpa.core.v1.ResourceLocator");
-}
-
-UPB_INLINE const upb_msgdef *udpa_core_v1_ResourceLocator_Directive_getmsgdef(upb_symtab *s) {
- _upb_symtab_loaddefinit(s, &udpa_core_v1_resource_locator_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "udpa.core.v1.ResourceLocator.Directive");
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_RESOURCE_LOCATOR_PROTO_UPBDEFS_H_ */
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource_name.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#include "upb/def.h"
-#include "udpa/core/v1/resource_name.upbdefs.h"
-
-extern upb_def_init udpa_annotations_status_proto_upbdefinit;
-extern upb_def_init udpa_core_v1_context_params_proto_upbdefinit;
-extern upb_def_init validate_validate_proto_upbdefinit;
-extern const upb_msglayout udpa_core_v1_ResourceName_msginit;
-
-static const upb_msglayout *layouts[1] = {
- &udpa_core_v1_ResourceName_msginit,
-};
-
-static const char descriptor[382] = {'\n', ' ', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n',
-'a', 'm', 'e', '.', 'p', 'r', 'o', 't', 'o', '\022', '\014', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '\032', '\035',
-'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p',
-'r', 'o', 't', 'o', '\032', '!', 'u', 'd', 'p', 'a', '/', 'c', 'o', 'r', 'e', '/', 'v', '1', '/', 'c', 'o', 'n', 't', 'e', 'x',
-'t', '_', 'p', 'a', 'r', 'a', 'm', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/',
-'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\253', '\001', '\n', '\014', 'R', 'e', 's', 'o', 'u', 'r',
-'c', 'e', 'N', 'a', 'm', 'e', '\022', '\030', '\n', '\002', 'i', 'd', '\030', '\001', ' ', '\003', '(', '\t', 'B', '\010', '\372', 'B', '\005', '\222', '\001',
-'\002', '\010', '\001', 'R', '\002', 'i', 'd', '\022', '\034', '\n', '\t', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '\030', '\002', ' ', '\001', '(',
-'\t', 'R', '\t', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '\022', ',', '\n', '\r', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_',
-'t', 'y', 'p', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\014', 'r', 'e', 's', 'o',
-'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', '5', '\n', '\007', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\004', ' ', '\001', '(', '\013',
-'2', '\033', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', '.', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a',
-'r', 'a', 'm', 's', 'R', '\007', 'c', 'o', 'n', 't', 'e', 'x', 't', 'B', ';', '\n', '\034', 'c', 'o', 'm', '.', 'g', 'i', 't', 'h',
-'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'u', 'd', 'p', 'a', '.', 'c', 'o', 'r', 'e', '.', 'v', '1', 'B', '\021', 'R', 'e', 's',
-'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\010', '\001', 'b',
-'\006', 'p', 'r', 'o', 't', 'o', '3',
-};
-
-static upb_def_init *deps[4] = {
- &udpa_annotations_status_proto_upbdefinit,
- &udpa_core_v1_context_params_proto_upbdefinit,
- &validate_validate_proto_upbdefinit,
- NULL
-};
-
-upb_def_init udpa_core_v1_resource_name_proto_upbdefinit = {
- deps,
- layouts,
- "udpa/core/v1/resource_name.proto",
- UPB_STRVIEW_INIT(descriptor, 382)
-};
+++ /dev/null
-/* This file was generated by upbc (the upb compiler) from the input
- * file:
- *
- * udpa/core/v1/resource_name.proto
- *
- * Do not edit -- your changes will be discarded when the file is
- * regenerated. */
-
-#ifndef UDPA_CORE_V1_RESOURCE_NAME_PROTO_UPBDEFS_H_
-#define UDPA_CORE_V1_RESOURCE_NAME_PROTO_UPBDEFS_H_
-
-#include "upb/def.h"
-#include "upb/port_def.inc"
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "upb/def.h"
-
-#include "upb/port_def.inc"
-
-extern upb_def_init udpa_core_v1_resource_name_proto_upbdefinit;
-
-UPB_INLINE const upb_msgdef *udpa_core_v1_ResourceName_getmsgdef(upb_symtab *s) {
- _upb_symtab_loaddefinit(s, &udpa_core_v1_resource_name_proto_upbdefinit);
- return upb_symtab_lookupmsg(s, "udpa.core.v1.ResourceName");
-}
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#include "upb/port_undef.inc"
-
-#endif /* UDPA_CORE_V1_RESOURCE_NAME_PROTO_UPBDEFS_H_ */
&validate_TimestampRules_msginit,
};
-static const char descriptor[5699] = {'\n', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o',
+static const char descriptor[5759] = {'\n', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o',
'\022', '\010', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '\032', ' ', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b',
'u', 'f', '/', 'd', 'e', 's', 'c', 'r', 'i', 'p', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '\036', 'g', 'o', 'o', 'g',
'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '.', 'p', 'r', 'o', 't',
'H', 'T', 'T', 'P', '_', 'H', 'E', 'A', 'D', 'E', 'R', '_', 'V', 'A', 'L', 'U', 'E', '\020', '\002', ':', '<', '\n', '\010', 'd', 'i',
's', 'a', 'b', 'l', 'e', 'd', '\022', '\037', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.',
'M', 'e', 's', 's', 'a', 'g', 'e', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\257', '\010', ' ', '\001', '(', '\010', 'R', '\010', 'd', 'i',
-'s', 'a', 'b', 'l', 'e', 'd', ':', ':', '\n', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', '\022', '\035', '.', 'g', 'o', 'o', 'g',
-'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'O', 'n', 'e', 'o', 'f', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030',
-'\257', '\010', ' ', '\001', '(', '\010', 'R', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e', 'd', ':', 'J', '\n', '\005', 'r', 'u', 'l', 'e', 's',
-'\022', '\035', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'F', 'i', 'e', 'l', 'd', 'O',
-'p', 't', 'i', 'o', 'n', 's', '\030', '\257', '\010', ' ', '\001', '(', '\013', '2', '\024', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.',
-'F', 'i', 'e', 'l', 'd', 'R', 'u', 'l', 'e', 's', 'R', '\005', 'r', 'u', 'l', 'e', 's', 'B', 'P', '\n', '\032', 'i', 'o', '.', 'e',
-'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'p', 'g', 'v', '.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', 'Z', '2', 'g',
-'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '/', 'p', 'r', 'o', 't',
-'o', 'c', '-', 'g', 'e', 'n', '-', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'s', 'a', 'b', 'l', 'e', 'd', ':', ':', '\n', '\007', 'i', 'g', 'n', 'o', 'r', 'e', 'd', '\022', '\037', '.', 'g', 'o', 'o', 'g', 'l',
+'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'M', 'e', 's', 's', 'a', 'g', 'e', 'O', 'p', 't', 'i', 'o', 'n', 's',
+'\030', '\260', '\010', ' ', '\001', '(', '\010', 'R', '\007', 'i', 'g', 'n', 'o', 'r', 'e', 'd', ':', ':', '\n', '\010', 'r', 'e', 'q', 'u', 'i',
+'r', 'e', 'd', '\022', '\035', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '.', 'O', 'n', 'e',
+'o', 'f', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\257', '\010', ' ', '\001', '(', '\010', 'R', '\010', 'r', 'e', 'q', 'u', 'i', 'r', 'e',
+'d', ':', 'J', '\n', '\005', 'r', 'u', 'l', 'e', 's', '\022', '\035', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'F', 'i', 'e', 'l', 'd', 'O', 'p', 't', 'i', 'o', 'n', 's', '\030', '\257', '\010', ' ', '\001', '(', '\013', '2', '\024',
+'.', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'F', 'i', 'e', 'l', 'd', 'R', 'u', 'l', 'e', 's', 'R', '\005', 'r', 'u', 'l',
+'e', 's', 'B', 'P', '\n', '\032', 'i', 'o', '.', 'e', 'n', 'v', 'o', 'y', 'p', 'r', 'o', 'x', 'y', '.', 'p', 'g', 'v', '.', 'v',
+'a', 'l', 'i', 'd', 'a', 't', 'e', 'Z', '2', 'g', 'i', 't', 'h', 'u', 'b', '.', 'c', 'o', 'm', '/', 'e', 'n', 'v', 'o', 'y',
+'p', 'r', 'o', 'x', 'y', '/', 'p', 'r', 'o', 't', 'o', 'c', '-', 'g', 'e', 'n', '-', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
+'/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e',
};
static upb_def_init *deps[4] = {
deps,
layouts,
"validate/validate.proto",
- UPB_STRVIEW_INIT(descriptor, 5699)
+ UPB_STRVIEW_INIT(descriptor, 5759)
};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/authority.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "xds/core/v3/authority.upbdefs.h"
+
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
+extern const upb_msglayout xds_core_v3_Authority_msginit;
+
+static const upb_msglayout *layouts[1] = {
+ &xds_core_v3_Authority_msginit,
+};
+
+static const char descriptor[205] = {'\n', '\033', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '.', 'p',
+'r', 'o', 't', 'o', '\022', '\013', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a',
+'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027',
+'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '(',
+'\n', '\t', 'A', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '\022', '\033', '\n', '\004', 'n', 'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\t',
+'B', '\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\004', 'n', 'a', 'm', 'e', 'B', '7', '\n', '\033', 'c', 'o', 'm', '.', 'g', 'i',
+'t', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B', '\016', 'A', 'u',
+'t', 'h', 'o', 'r', 'i', 't', 'y', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\010', '\001', 'b', '\006', 'p',
+'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[3] = {
+ &udpa_annotations_status_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init xds_core_v3_authority_proto_upbdefinit = {
+ deps,
+ layouts,
+ "xds/core/v3/authority.proto",
+ UPB_STRVIEW_INIT(descriptor, 205)
+};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/authority.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_AUTHORITY_PROTO_UPBDEFS_H_
+#define XDS_CORE_V3_AUTHORITY_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init xds_core_v3_authority_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *xds_core_v3_Authority_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &xds_core_v3_authority_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "xds.core.v3.Authority");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_AUTHORITY_PROTO_UPBDEFS_H_ */
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/collection_entry.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "xds/core/v3/collection_entry.upbdefs.h"
+
+extern upb_def_init google_protobuf_any_proto_upbdefinit;
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init xds_core_v3_resource_locator_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
+extern const upb_msglayout xds_core_v3_CollectionEntry_msginit;
+extern const upb_msglayout xds_core_v3_CollectionEntry_InlineEntry_msginit;
+
+static const upb_msglayout *layouts[2] = {
+ &xds_core_v3_CollectionEntry_msginit,
+ &xds_core_v3_CollectionEntry_InlineEntry_msginit,
+};
+
+static const char descriptor[565] = {'\n', '\"', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', '_',
+'e', 'n', 't', 'r', 'y', '.', 'p', 'r', 'o', 't', 'o', '\022', '\013', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032',
+'\031', 'g', 'o', 'o', 'g', 'l', 'e', '/', 'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't',
+'o', '\032', '\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u',
+'s', '.', 'p', 'r', 'o', 't', 'o', '\032', '\"', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'r', 'e', 's', 'o',
+'u', 'r', 'c', 'e', '_', 'l', 'o', 'c', 'a', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd',
+'a', 't', 'e', '/', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\303', '\002', '\n', '\017', 'C', 'o',
+'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', '\022', '8', '\n', '\007', 'l', 'o', 'c', 'a', 't', 'o', 'r', '\030',
+'\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'e', 's', 'o', 'u',
+'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'H', '\000', 'R', '\007', 'l', 'o', 'c', 'a', 't', 'o', 'r', '\022', 'M', '\n', '\014',
+'i', 'n', 'l', 'i', 'n', 'e', '_', 'e', 'n', 't', 'r', 'y', '\030', '\002', ' ', '\001', '(', '\013', '2', '(', '.', 'x', 'd', 's', '.',
+'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', '.', 'I',
+'n', 'l', 'i', 'n', 'e', 'E', 'n', 't', 'r', 'y', 'H', '\000', 'R', '\013', 'i', 'n', 'l', 'i', 'n', 'e', 'E', 'n', 't', 'r', 'y',
+'\032', '\213', '\001', '\n', '\013', 'I', 'n', 'l', 'i', 'n', 'e', 'E', 'n', 't', 'r', 'y', '\022', '0', '\n', '\004', 'n', 'a', 'm', 'e', '\030',
+'\001', ' ', '\001', '(', '\t', 'B', '\034', '\372', 'B', '\031', 'r', '\027', '2', '\025', '^', '[', '0', '-', '9', 'a', '-', 'z', 'A', '-', 'Z',
+'_', '\\', '-', '\\', '.', '~', ':', ']', '+', '$', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\030', '\n', '\007', 'v', 'e', 'r', 's', 'i',
+'o', 'n', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '0', '\n', '\010', 'r', 'e', 's', 'o',
+'u', 'r', 'c', 'e', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't', 'o',
+'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\010', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'B', '\031', '\n', '\022', 'r', 'e', 's', 'o',
+'u', 'r', 'c', 'e', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', '\022', '\003', '\370', 'B', '\001', 'B', '=', '\n', '\033', 'c', 'o',
+'m', '.', 'g', 'i', 't', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
+'B', '\024', 'C', 'o', 'l', 'l', 'e', 'c', 't', 'i', 'o', 'n', 'E', 'n', 't', 'r', 'y', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272',
+'\200', '\310', '\321', '\006', '\002', '\010', '\001', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[5] = {
+ &google_protobuf_any_proto_upbdefinit,
+ &udpa_annotations_status_proto_upbdefinit,
+ &xds_core_v3_resource_locator_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init xds_core_v3_collection_entry_proto_upbdefinit = {
+ deps,
+ layouts,
+ "xds/core/v3/collection_entry.proto",
+ UPB_STRVIEW_INIT(descriptor, 565)
+};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/collection_entry.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_COLLECTION_ENTRY_PROTO_UPBDEFS_H_
+#define XDS_CORE_V3_COLLECTION_ENTRY_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init xds_core_v3_collection_entry_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *xds_core_v3_CollectionEntry_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &xds_core_v3_collection_entry_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "xds.core.v3.CollectionEntry");
+}
+
+UPB_INLINE const upb_msgdef *xds_core_v3_CollectionEntry_InlineEntry_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &xds_core_v3_collection_entry_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "xds.core.v3.CollectionEntry.InlineEntry");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_COLLECTION_ENTRY_PROTO_UPBDEFS_H_ */
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/context_params.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "xds/core/v3/context_params.upbdefs.h"
+
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern const upb_msglayout xds_core_v3_ContextParams_msginit;
+extern const upb_msglayout xds_core_v3_ContextParams_ParamsEntry_msginit;
+
+static const upb_msglayout *layouts[2] = {
+ &xds_core_v3_ContextParams_msginit,
+ &xds_core_v3_ContextParams_ParamsEntry_msginit,
+};
+
+static const char descriptor[288] = {'\n', ' ', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'p', 'a', 'r',
+'a', 'm', 's', '.', 'p', 'r', 'o', 't', 'o', '\022', '\013', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\035', 'u',
+'d', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r',
+'o', 't', 'o', '\"', '\212', '\001', '\n', '\r', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', '\022', '>', '\n', '\006',
+'p', 'a', 'r', 'a', 'm', 's', '\030', '\001', ' ', '\003', '(', '\013', '2', '&', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', '.', 'P', 'a', 'r', 'a', 'm', 's', 'E', 'n', 't',
+'r', 'y', 'R', '\006', 'p', 'a', 'r', 'a', 'm', 's', '\032', '9', '\n', '\013', 'P', 'a', 'r', 'a', 'm', 's', 'E', 'n', 't', 'r', 'y',
+'\022', '\020', '\n', '\003', 'k', 'e', 'y', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\003', 'k', 'e', 'y', '\022', '\024', '\n', '\005', 'v', 'a', 'l',
+'u', 'e', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\005', 'v', 'a', 'l', 'u', 'e', ':', '\002', '8', '\001', 'B', ';', '\n', '\033', 'c', 'o',
+'m', '.', 'g', 'i', 't', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3',
+'B', '\022', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310',
+'\321', '\006', '\002', '\010', '\001', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[2] = {
+ &udpa_annotations_status_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init xds_core_v3_context_params_proto_upbdefinit = {
+ deps,
+ layouts,
+ "xds/core/v3/context_params.proto",
+ UPB_STRVIEW_INIT(descriptor, 288)
+};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/context_params.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_CONTEXT_PARAMS_PROTO_UPBDEFS_H_
+#define XDS_CORE_V3_CONTEXT_PARAMS_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init xds_core_v3_context_params_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *xds_core_v3_ContextParams_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &xds_core_v3_context_params_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "xds.core.v3.ContextParams");
+}
+
+UPB_INLINE const upb_msgdef *xds_core_v3_ContextParams_ParamsEntry_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &xds_core_v3_context_params_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "xds.core.v3.ContextParams.ParamsEntry");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_CONTEXT_PARAMS_PROTO_UPBDEFS_H_ */
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "xds/core/v3/resource.upbdefs.h"
+
+extern upb_def_init google_protobuf_any_proto_upbdefinit;
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init xds_core_v3_resource_name_proto_upbdefinit;
+extern const upb_msglayout xds_core_v3_Resource_msginit;
+
+static const upb_msglayout *layouts[1] = {
+ &xds_core_v3_Resource_msginit,
+};
+
+static const char descriptor[332] = {'\n', '\032', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '.', 'p', 'r',
+'o', 't', 'o', '\022', '\013', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\031', 'g', 'o', 'o', 'g', 'l', 'e', '/',
+'p', 'r', 'o', 't', 'o', 'b', 'u', 'f', '/', 'a', 'n', 'y', '.', 'p', 'r', 'o', 't', 'o', '\032', '\035', 'u', 'd', 'p', 'a', '/',
+'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o', 't', 'o', '\032',
+'\037', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a', 'm',
+'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\205', '\001', '\n', '\010', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', '\022', '-', '\n', '\004', 'n',
+'a', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\013', '2', '\031', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R',
+'e', 's', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', 'R', '\004', 'n', 'a', 'm', 'e', '\022', '\030', '\n', '\007', 'v', 'e', 'r', 's',
+'i', 'o', 'n', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\007', 'v', 'e', 'r', 's', 'i', 'o', 'n', '\022', '0', '\n', '\010', 'r', 'e', 's',
+'o', 'u', 'r', 'c', 'e', '\030', '\003', ' ', '\001', '(', '\013', '2', '\024', '.', 'g', 'o', 'o', 'g', 'l', 'e', '.', 'p', 'r', 'o', 't',
+'o', 'b', 'u', 'f', '.', 'A', 'n', 'y', 'R', '\010', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'B', '6', '\n', '\033', 'c', 'o', 'm',
+'.', 'g', 'i', 't', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B',
+'\r', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200', '\310', '\321', '\006', '\002', '\010', '\001', 'b',
+'\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[4] = {
+ &google_protobuf_any_proto_upbdefinit,
+ &udpa_annotations_status_proto_upbdefinit,
+ &xds_core_v3_resource_name_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init xds_core_v3_resource_proto_upbdefinit = {
+ deps,
+ layouts,
+ "xds/core/v3/resource.proto",
+ UPB_STRVIEW_INIT(descriptor, 332)
+};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_RESOURCE_PROTO_UPBDEFS_H_
+#define XDS_CORE_V3_RESOURCE_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init xds_core_v3_resource_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *xds_core_v3_Resource_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &xds_core_v3_resource_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "xds.core.v3.Resource");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_RESOURCE_PROTO_UPBDEFS_H_ */
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource_locator.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "xds/core/v3/resource_locator.upbdefs.h"
+
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init xds_core_v3_context_params_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
+extern const upb_msglayout xds_core_v3_ResourceLocator_msginit;
+extern const upb_msglayout xds_core_v3_ResourceLocator_Directive_msginit;
+
+static const upb_msglayout *layouts[2] = {
+ &xds_core_v3_ResourceLocator_msginit,
+ &xds_core_v3_ResourceLocator_Directive_msginit,
+};
+
+static const char descriptor[739] = {'\n', '\"', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'l', 'o',
+'c', 'a', 't', 'o', 'r', '.', 'p', 'r', 'o', 't', 'o', '\022', '\013', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032',
+'\035', 'u', 'd', 'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.',
+'p', 'r', 'o', 't', 'o', '\032', ' ', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'n', 't', 'e', 'x',
+'t', '_', 'p', 'a', 'r', 'a', 'm', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/',
+'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\216', '\004', '\n', '\017', 'R', 'e', 's', 'o', 'u', 'r',
+'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', '\022', 'E', '\n', '\006', 's', 'c', 'h', 'e', 'm', 'e', '\030', '\001', ' ', '\001', '(', '\016',
+'2', '#', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o',
+'c', 'a', 't', 'o', 'r', '.', 'S', 'c', 'h', 'e', 'm', 'e', 'B', '\010', '\372', 'B', '\005', '\202', '\001', '\002', '\020', '\001', 'R', '\006', 's',
+'c', 'h', 'e', 'm', 'e', '\022', '\016', '\n', '\002', 'i', 'd', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\002', 'i', 'd', '\022', '\034', '\n', '\t',
+'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '\030', '\003', ' ', '\001', '(', '\t', 'R', '\t', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't',
+'y', '\022', ',', '\n', '\r', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 't', 'y', 'p', 'e', '\030', '\004', ' ', '\001', '(', '\t', 'B',
+'\007', '\372', 'B', '\004', 'r', '\002', '\020', '\001', 'R', '\014', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', 'A', '\n',
+'\r', 'e', 'x', 'a', 'c', 't', '_', 'c', 'o', 'n', 't', 'e', 'x', 't', '\030', '\005', ' ', '\001', '(', '\013', '2', '\032', '.', 'x', 'd',
+'s', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', 'H', '\000',
+'R', '\014', 'e', 'x', 'a', 'c', 't', 'C', 'o', 'n', 't', 'e', 'x', 't', '\022', 'F', '\n', '\n', 'd', 'i', 'r', 'e', 'c', 't', 'i',
+'v', 'e', 's', '\030', '\006', ' ', '\003', '(', '\013', '2', '&', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '.', 'R',
+'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', '.', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'v', 'e', 'R',
+'\n', 'd', 'i', 'r', 'e', 'c', 't', 'i', 'v', 'e', 's', '\032', '\210', '\001', '\n', '\t', 'D', 'i', 'r', 'e', 'c', 't', 'i', 'v', 'e',
+'\022', '0', '\n', '\003', 'a', 'l', 't', '\030', '\001', ' ', '\001', '(', '\013', '2', '\034', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.',
+'v', '3', '.', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'H', '\000', 'R', '\003', 'a', 'l', 't',
+'\022', '7', '\n', '\005', 'e', 'n', 't', 'r', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'B', '\037', '\372', 'B', '\034', 'r', '\032', '\020', '\001', '2',
+'\026', '^', '[', '0', '-', '9', 'a', '-', 'z', 'A', '-', 'Z', '_', '\\', '-', '\\', '.', '/', '~', ':', ']', '+', '$', 'H', '\000',
+'R', '\005', 'e', 'n', 't', 'r', 'y', 'B', '\020', '\n', '\t', 'd', 'i', 'r', 'e', 'c', 't', 'i', 'v', 'e', '\022', '\003', '\370', 'B', '\001',
+'\"', '\'', '\n', '\006', 'S', 'c', 'h', 'e', 'm', 'e', '\022', '\t', '\n', '\005', 'X', 'D', 'S', 'T', 'P', '\020', '\000', '\022', '\010', '\n', '\004',
+'H', 'T', 'T', 'P', '\020', '\001', '\022', '\010', '\n', '\004', 'F', 'I', 'L', 'E', '\020', '\002', 'B', '\031', '\n', '\027', 'c', 'o', 'n', 't', 'e',
+'x', 't', '_', 'p', 'a', 'r', 'a', 'm', '_', 's', 'p', 'e', 'c', 'i', 'f', 'i', 'e', 'r', 'B', '=', '\n', '\033', 'c', 'o', 'm',
+'.', 'g', 'i', 't', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', 'B',
+'\024', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'L', 'o', 'c', 'a', 't', 'o', 'r', 'P', 'r', 'o', 't', 'o', 'P', '\001', '\272', '\200',
+'\310', '\321', '\006', '\002', '\010', '\001', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[4] = {
+ &udpa_annotations_status_proto_upbdefinit,
+ &xds_core_v3_context_params_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init xds_core_v3_resource_locator_proto_upbdefinit = {
+ deps,
+ layouts,
+ "xds/core/v3/resource_locator.proto",
+ UPB_STRVIEW_INIT(descriptor, 739)
+};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource_locator.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_RESOURCE_LOCATOR_PROTO_UPBDEFS_H_
+#define XDS_CORE_V3_RESOURCE_LOCATOR_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init xds_core_v3_resource_locator_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *xds_core_v3_ResourceLocator_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &xds_core_v3_resource_locator_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "xds.core.v3.ResourceLocator");
+}
+
+UPB_INLINE const upb_msgdef *xds_core_v3_ResourceLocator_Directive_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &xds_core_v3_resource_locator_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "xds.core.v3.ResourceLocator.Directive");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_RESOURCE_LOCATOR_PROTO_UPBDEFS_H_ */
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource_name.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#include "upb/def.h"
+#include "xds/core/v3/resource_name.upbdefs.h"
+
+extern upb_def_init udpa_annotations_status_proto_upbdefinit;
+extern upb_def_init xds_core_v3_context_params_proto_upbdefinit;
+extern upb_def_init validate_validate_proto_upbdefinit;
+extern const upb_msglayout xds_core_v3_ResourceName_msginit;
+
+static const upb_msglayout *layouts[1] = {
+ &xds_core_v3_ResourceName_msginit,
+};
+
+static const char descriptor[367] = {'\n', '\037', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 'n', 'a',
+'m', 'e', '.', 'p', 'r', 'o', 't', 'o', '\022', '\013', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v', '3', '\032', '\035', 'u', 'd',
+'p', 'a', '/', 'a', 'n', 'n', 'o', 't', 'a', 't', 'i', 'o', 'n', 's', '/', 's', 't', 'a', 't', 'u', 's', '.', 'p', 'r', 'o',
+'t', 'o', '\032', ' ', 'x', 'd', 's', '/', 'c', 'o', 'r', 'e', '/', 'v', '3', '/', 'c', 'o', 'n', 't', 'e', 'x', 't', '_', 'p',
+'a', 'r', 'a', 'm', 's', '.', 'p', 'r', 'o', 't', 'o', '\032', '\027', 'v', 'a', 'l', 'i', 'd', 'a', 't', 'e', '/', 'v', 'a', 'l',
+'i', 'd', 'a', 't', 'e', '.', 'p', 'r', 'o', 't', 'o', '\"', '\240', '\001', '\n', '\014', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'N',
+'a', 'm', 'e', '\022', '\016', '\n', '\002', 'i', 'd', '\030', '\001', ' ', '\001', '(', '\t', 'R', '\002', 'i', 'd', '\022', '\034', '\n', '\t', 'a', 'u',
+'t', 'h', 'o', 'r', 'i', 't', 'y', '\030', '\002', ' ', '\001', '(', '\t', 'R', '\t', 'a', 'u', 't', 'h', 'o', 'r', 'i', 't', 'y', '\022',
+',', '\n', '\r', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', '_', 't', 'y', 'p', 'e', '\030', '\003', ' ', '\001', '(', '\t', 'B', '\007', '\372',
+'B', '\004', 'r', '\002', '\020', '\001', 'R', '\014', 'r', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'T', 'y', 'p', 'e', '\022', '4', '\n', '\007', 'c',
+'o', 'n', 't', 'e', 'x', 't', '\030', '\004', ' ', '\001', '(', '\013', '2', '\032', '.', 'x', 'd', 's', '.', 'c', 'o', 'r', 'e', '.', 'v',
+'3', '.', 'C', 'o', 'n', 't', 'e', 'x', 't', 'P', 'a', 'r', 'a', 'm', 's', 'R', '\007', 'c', 'o', 'n', 't', 'e', 'x', 't', 'B',
+':', '\n', '\033', 'c', 'o', 'm', '.', 'g', 'i', 't', 'h', 'u', 'b', '.', 'u', 'd', 'p', 'a', '.', 'x', 'd', 's', '.', 'c', 'o',
+'r', 'e', '.', 'v', '3', 'B', '\021', 'R', 'e', 's', 'o', 'u', 'r', 'c', 'e', 'N', 'a', 'm', 'e', 'P', 'r', 'o', 't', 'o', 'P',
+'\001', '\272', '\200', '\310', '\321', '\006', '\002', '\010', '\001', 'b', '\006', 'p', 'r', 'o', 't', 'o', '3',
+};
+
+static upb_def_init *deps[4] = {
+ &udpa_annotations_status_proto_upbdefinit,
+ &xds_core_v3_context_params_proto_upbdefinit,
+ &validate_validate_proto_upbdefinit,
+ NULL
+};
+
+upb_def_init xds_core_v3_resource_name_proto_upbdefinit = {
+ deps,
+ layouts,
+ "xds/core/v3/resource_name.proto",
+ UPB_STRVIEW_INIT(descriptor, 367)
+};
--- /dev/null
+/* This file was generated by upbc (the upb compiler) from the input
+ * file:
+ *
+ * xds/core/v3/resource_name.proto
+ *
+ * Do not edit -- your changes will be discarded when the file is
+ * regenerated. */
+
+#ifndef XDS_CORE_V3_RESOURCE_NAME_PROTO_UPBDEFS_H_
+#define XDS_CORE_V3_RESOURCE_NAME_PROTO_UPBDEFS_H_
+
+#include "upb/def.h"
+#include "upb/port_def.inc"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "upb/def.h"
+
+#include "upb/port_def.inc"
+
+extern upb_def_init xds_core_v3_resource_name_proto_upbdefinit;
+
+UPB_INLINE const upb_msgdef *xds_core_v3_ResourceName_getmsgdef(upb_symtab *s) {
+ _upb_symtab_loaddefinit(s, &xds_core_v3_resource_name_proto_upbdefinit);
+ return upb_symtab_lookupmsg(s, "xds.core.v3.ResourceName");
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#include "upb/port_undef.inc"
+
+#endif /* XDS_CORE_V3_RESOURCE_NAME_PROTO_UPBDEFS_H_ */
grpc_error** error) override;
RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
- RefCountedPtr<CertificateProviderFactory::Config> config) override {
+ RefCountedPtr<CertificateProviderFactory::Config> /*config*/) override {
// TODO(yashykt) : To be implemented
return nullptr;
}
#include "src/core/lib/gpr/env.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gpr/useful.h"
+#include "src/core/lib/gprpp/host_port.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/sockaddr_utils.h"
#include "src/core/lib/slice/slice_utils.h"
#include "envoy/config/endpoint/v3/load_report.upb.h"
#include "envoy/config/listener/v3/api_listener.upb.h"
#include "envoy/config/listener/v3/listener.upb.h"
+#include "envoy/config/listener/v3/listener_components.upb.h"
#include "envoy/config/route/v3/route.upb.h"
#include "envoy/config/route/v3/route.upbdefs.h"
#include "envoy/config/route/v3/route_components.upb.h"
+#include "envoy/extensions/clusters/aggregate/v3/cluster.upb.h"
#include "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h"
#include "envoy/extensions/transport_sockets/tls/v3/common.upb.h"
#include "envoy/extensions/transport_sockets/tls/v3/tls.upb.h"
namespace grpc_core {
-// TODO (donnadionne): Check to see if timeout is enabled, this will be
+// TODO(donnadionne): Check to see if timeout is enabled, this will be
// removed once timeout feature is fully integration-tested and enabled by
// default.
bool XdsTimeoutEnabled() {
return parse_succeeded && parsed_value;
}
-// TODO(yashykt): Check to see if xDS security is enabled. This will be
-// removed once this feature is fully integration-tested and enabled by
+// TODO(donnadionne): Check to see if cluster types aggregate_cluster and
+// logical_dns are enabled, this will be
+// removed once the cluster types are fully integration-tested and enabled by
// default.
-bool XdsSecurityEnabled() {
- char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT");
+bool XdsAggregateAndLogicalDnsClusterEnabled() {
+ char* value = gpr_getenv(
+ "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER");
bool parsed_value;
bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
gpr_free(value);
return parse_succeeded && parsed_value;
}
-//
-// XdsApi::Route::Matchers::PathMatcher
-//
-
-XdsApi::Route::Matchers::PathMatcher::PathMatcher(const PathMatcher& other)
- : type(other.type), case_sensitive(other.case_sensitive) {
- if (type == PathMatcherType::REGEX) {
- RE2::Options options;
- options.set_case_sensitive(case_sensitive);
- regex_matcher =
- absl::make_unique<RE2>(other.regex_matcher->pattern(), options);
- } else {
- string_matcher = other.string_matcher;
- }
-}
-
-XdsApi::Route::Matchers::PathMatcher& XdsApi::Route::Matchers::PathMatcher::
-operator=(const PathMatcher& other) {
- type = other.type;
- case_sensitive = other.case_sensitive;
- if (type == PathMatcherType::REGEX) {
- RE2::Options options;
- options.set_case_sensitive(case_sensitive);
- regex_matcher =
- absl::make_unique<RE2>(other.regex_matcher->pattern(), options);
- } else {
- string_matcher = other.string_matcher;
- }
- return *this;
-}
-
-bool XdsApi::Route::Matchers::PathMatcher::operator==(
- const PathMatcher& other) const {
- if (type != other.type) return false;
- if (case_sensitive != other.case_sensitive) return false;
- if (type == PathMatcherType::REGEX) {
- // Should never be null.
- if (regex_matcher == nullptr || other.regex_matcher == nullptr) {
- return false;
- }
- return regex_matcher->pattern() == other.regex_matcher->pattern();
- }
- return string_matcher == other.string_matcher;
-}
-
-std::string XdsApi::Route::Matchers::PathMatcher::ToString() const {
- std::string path_type_string;
- switch (type) {
- case PathMatcherType::PATH:
- path_type_string = "path match";
- break;
- case PathMatcherType::PREFIX:
- path_type_string = "prefix match";
- break;
- case PathMatcherType::REGEX:
- path_type_string = "regex match";
- break;
- default:
- break;
- }
- return absl::StrFormat("Path %s:%s%s", path_type_string,
- type == PathMatcherType::REGEX
- ? regex_matcher->pattern()
- : string_matcher,
- case_sensitive ? "" : "[case_sensitive=false]");
-}
-
-//
-// XdsApi::Route::Matchers::HeaderMatcher
-//
-
-XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcher(
- const HeaderMatcher& other)
- : name(other.name), type(other.type), invert_match(other.invert_match) {
- switch (type) {
- case HeaderMatcherType::REGEX:
- regex_match = absl::make_unique<RE2>(other.regex_match->pattern());
- break;
- case HeaderMatcherType::RANGE:
- range_start = other.range_start;
- range_end = other.range_end;
- break;
- case HeaderMatcherType::PRESENT:
- present_match = other.present_match;
- break;
- default:
- string_matcher = other.string_matcher;
- }
+// TODO(donnadionne): Check to see if ring hash policy is enabled, this will be
+// removed once ring hash policy is fully integration-tested and enabled by
+// default.
+bool XdsRingHashEnabled() {
+ char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ENABLE_RING_HASH");
+ bool parsed_value;
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
+ gpr_free(value);
+ return parse_succeeded && parsed_value;
}
-XdsApi::Route::Matchers::HeaderMatcher& XdsApi::Route::Matchers::HeaderMatcher::
-operator=(const HeaderMatcher& other) {
- name = other.name;
- type = other.type;
- invert_match = other.invert_match;
- switch (type) {
- case HeaderMatcherType::REGEX:
- regex_match = absl::make_unique<RE2>(other.regex_match->pattern());
- break;
- case HeaderMatcherType::RANGE:
- range_start = other.range_start;
- range_end = other.range_end;
- break;
- case HeaderMatcherType::PRESENT:
- present_match = other.present_match;
- break;
- default:
- string_matcher = other.string_matcher;
- }
- return *this;
-}
-
-bool XdsApi::Route::Matchers::HeaderMatcher::operator==(
- const HeaderMatcher& other) const {
- if (name != other.name) return false;
- if (type != other.type) return false;
- if (invert_match != other.invert_match) return false;
- switch (type) {
- case HeaderMatcherType::REGEX:
- return regex_match->pattern() != other.regex_match->pattern();
- case HeaderMatcherType::RANGE:
- return range_start != other.range_start && range_end != other.range_end;
- case HeaderMatcherType::PRESENT:
- return present_match != other.present_match;
- default:
- return string_matcher != other.string_matcher;
- }
-}
-
-std::string XdsApi::Route::Matchers::HeaderMatcher::ToString() const {
- switch (type) {
- case HeaderMatcherType::EXACT:
- return absl::StrFormat("Header exact match:%s %s:%s",
- invert_match ? " not" : "", name, string_matcher);
- case HeaderMatcherType::REGEX:
- return absl::StrFormat("Header regex match:%s %s:%s",
- invert_match ? " not" : "", name,
- regex_match->pattern());
- case HeaderMatcherType::RANGE:
- return absl::StrFormat("Header range match:%s %s:[%d, %d)",
- invert_match ? " not" : "", name, range_start,
- range_end);
- case HeaderMatcherType::PRESENT:
- return absl::StrFormat("Header present match:%s %s:%s",
- invert_match ? " not" : "", name,
- present_match ? "true" : "false");
- case HeaderMatcherType::PREFIX:
- return absl::StrFormat("Header prefix match:%s %s:%s",
- invert_match ? " not" : "", name, string_matcher);
- case HeaderMatcherType::SUFFIX:
- return absl::StrFormat("Header suffix match:%s %s:%s",
- invert_match ? " not" : "", name, string_matcher);
- default:
- return "";
- }
+// TODO(yashykt): Check to see if xDS security is enabled. This will be
+// removed once this feature is fully integration-tested and enabled by
+// default.
+bool XdsSecurityEnabled() {
+ char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT");
+ bool parsed_value;
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
+ gpr_free(value);
+ return parse_succeeded && parsed_value;
}
//
std::string XdsApi::Route::Matchers::ToString() const {
std::vector<std::string> contents;
- contents.push_back(path_matcher.ToString());
+ contents.push_back(
+ absl::StrFormat("PathMatcher{%s}", path_matcher.ToString()));
for (const HeaderMatcher& header_matcher : header_matchers) {
contents.push_back(header_matcher.ToString());
}
}
//
-// XdsApi::StringMatcher
-//
-
-XdsApi::StringMatcher::StringMatcher(StringMatcherType type,
- const std::string& matcher,
- bool ignore_case)
- : type_(type), ignore_case_(ignore_case) {
- if (type_ == StringMatcherType::SAFE_REGEX) {
- regex_matcher_ = absl::make_unique<RE2>(matcher);
- } else {
- string_matcher_ = matcher;
- }
-}
-
-XdsApi::StringMatcher::StringMatcher(const StringMatcher& other)
- : type_(other.type_), ignore_case_(other.ignore_case_) {
- switch (type_) {
- case StringMatcherType::SAFE_REGEX:
- regex_matcher_ = absl::make_unique<RE2>(other.regex_matcher_->pattern());
- break;
- default:
- string_matcher_ = other.string_matcher_;
- }
-}
-
-XdsApi::StringMatcher& XdsApi::StringMatcher::operator=(
- const StringMatcher& other) {
- type_ = other.type_;
- switch (type_) {
- case StringMatcherType::SAFE_REGEX:
- regex_matcher_ = absl::make_unique<RE2>(other.regex_matcher_->pattern());
- break;
- default:
- string_matcher_ = other.string_matcher_;
- }
- ignore_case_ = other.ignore_case_;
- return *this;
-}
-
-bool XdsApi::StringMatcher::operator==(const StringMatcher& other) const {
- if (type_ != other.type_ || ignore_case_ != other.ignore_case_) return false;
- switch (type_) {
- case StringMatcherType::SAFE_REGEX:
- return regex_matcher_->pattern() == other.regex_matcher_->pattern();
- default:
- return string_matcher_ == other.string_matcher_;
- }
-}
-
-bool XdsApi::StringMatcher::Match(absl::string_view value) const {
- switch (type_) {
- case XdsApi::StringMatcher::StringMatcherType::EXACT:
- return ignore_case_ ? absl::EqualsIgnoreCase(value, string_matcher_)
- : value == string_matcher_;
- case XdsApi::StringMatcher::StringMatcherType::PREFIX:
- return ignore_case_ ? absl::StartsWithIgnoreCase(value, string_matcher_)
- : absl::StartsWith(value, string_matcher_);
- case XdsApi::StringMatcher::StringMatcherType::SUFFIX:
- return ignore_case_ ? absl::EndsWithIgnoreCase(value, string_matcher_)
- : absl::EndsWith(value, string_matcher_);
- case XdsApi::StringMatcher::StringMatcherType::CONTAINS:
- return ignore_case_
- ? absl::StrContains(absl::AsciiStrToLower(value),
- absl::AsciiStrToLower(string_matcher_))
- : absl::StrContains(value, string_matcher_);
- case XdsApi::StringMatcher::StringMatcherType::SAFE_REGEX:
- // ignore_case_ is ignored for SAFE_REGEX
- return RE2::FullMatch(std::string(value), *regex_matcher_);
- default:
- return false;
- }
-}
-
-std::string XdsApi::StringMatcher::ToString() const {
- switch (type_) {
- case StringMatcherType::EXACT:
- return absl::StrFormat("StringMatcher{exact=%s%s}", string_matcher_,
- ignore_case_ ? ", ignore_case" : "");
- case StringMatcherType::PREFIX:
- return absl::StrFormat("StringMatcher{prefix=%s%s}", string_matcher_,
- ignore_case_ ? ", ignore_case" : "");
- case StringMatcherType::SUFFIX:
- return absl::StrFormat("StringMatcher{suffix=%s%s}", string_matcher_,
- ignore_case_ ? ", ignore_case" : "");
- case StringMatcherType::CONTAINS:
- return absl::StrFormat("StringMatcher{contains=%s%s}", string_matcher_,
- ignore_case_ ? ", ignore_case" : "");
- case StringMatcherType::SAFE_REGEX:
- return absl::StrFormat("StringMatcher{safe_regex=%s}",
- regex_matcher_->pattern());
- default:
- return "";
- }
-}
-
-//
// XdsApi::CommonTlsContext::CertificateValidationContext
//
}
//
+// XdsApi::DownstreamTlsContext
+//
+
+std::string XdsApi::DownstreamTlsContext::ToString() const {
+ return absl::StrFormat("common_tls_context=%s, require_client_certificate=%s",
+ common_tls_context.ToString(),
+ require_client_certificate ? "true" : "false");
+}
+
+bool XdsApi::DownstreamTlsContext::Empty() const {
+ return common_tls_context.Empty();
+}
+
+//
+// XdsApi::LdsUpdate
+//
+
+std::string XdsApi::LdsUpdate::ToString() const {
+ absl::InlinedVector<std::string, 3> contents;
+ if (type == ListenerType::kTcpListener) {
+ if (!downstream_tls_context.Empty()) {
+ contents.push_back(absl::StrFormat("downstream_tls_context=%s",
+ downstream_tls_context.ToString()));
+ }
+ } else if (type == ListenerType::kHttpApiListener) {
+ contents.push_back(absl::StrFormat(
+ "route_config_name=%s",
+ !route_config_name.empty() ? route_config_name.c_str() : "<inlined>"));
+ contents.push_back(absl::StrFormat("http_max_stream_duration=%s",
+ http_max_stream_duration.ToString()));
+ if (rds_update.has_value()) {
+ contents.push_back(
+ absl::StrFormat("rds_update=%s", rds_update->ToString()));
+ }
+ }
+ return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
+}
+
+//
// XdsApi::CdsUpdate
//
// generate them in the parsing code, and then use that here.
google_rpc_Status_set_code(error_detail, GRPC_STATUS_INVALID_ARGUMENT);
// Error description comes from the error that was passed in.
- grpc_slice error_description_slice;
- GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
- &error_description_slice));
- upb_strview error_description_strview =
- StdStringToUpbString(StringViewFromSlice(error_description_slice));
- google_rpc_Status_set_message(error_detail, error_description_strview);
+ upb_strview error_description =
+ StdStringToUpbString(absl::string_view(grpc_error_string(error)));
+ google_rpc_Status_set_message(error_detail, error_description);
GRPC_ERROR_UNREF(error);
}
// Populate node.
grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
XdsApi::Route* route, bool* ignore_route) {
- auto* case_sensitive = envoy_config_route_v3_RouteMatch_case_sensitive(match);
- if (case_sensitive != nullptr) {
- route->matchers.path_matcher.case_sensitive =
- google_protobuf_BoolValue_value(case_sensitive);
- }
+ auto* case_sensitive_ptr =
+ envoy_config_route_v3_RouteMatch_case_sensitive(match);
+ bool case_sensitive = true;
+ if (case_sensitive_ptr != nullptr) {
+ case_sensitive = google_protobuf_BoolValue_value(case_sensitive_ptr);
+ }
+ StringMatcher::Type type;
+ std::string match_string;
if (envoy_config_route_v3_RouteMatch_has_prefix(match)) {
absl::string_view prefix =
UpbStringToAbsl(envoy_config_route_v3_RouteMatch_prefix(match));
return GRPC_ERROR_NONE;
}
}
- route->matchers.path_matcher.type =
- XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PREFIX;
- route->matchers.path_matcher.string_matcher = std::string(prefix);
+ type = StringMatcher::Type::PREFIX;
+ match_string = std::string(prefix);
} else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
absl::string_view path =
UpbStringToAbsl(envoy_config_route_v3_RouteMatch_path(match));
*ignore_route = true;
return GRPC_ERROR_NONE;
}
- route->matchers.path_matcher.type =
- XdsApi::Route::Matchers::PathMatcher::PathMatcherType::PATH;
- route->matchers.path_matcher.string_matcher = std::string(path);
+ type = StringMatcher::Type::EXACT;
+ match_string = std::string(path);
} else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
envoy_config_route_v3_RouteMatch_safe_regex(match);
GPR_ASSERT(regex_matcher != nullptr);
- std::string matcher = UpbStringToStdString(
+ type = StringMatcher::Type::SAFE_REGEX;
+ match_string = UpbStringToStdString(
envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
- RE2::Options options;
- options.set_case_sensitive(route->matchers.path_matcher.case_sensitive);
- auto regex = absl::make_unique<RE2>(std::move(matcher), options);
- if (!regex->ok()) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Invalid regex string specified in path matcher.");
- }
- route->matchers.path_matcher.type =
- XdsApi::Route::Matchers::PathMatcher::PathMatcherType::REGEX;
- route->matchers.path_matcher.regex_matcher = std::move(regex);
} else {
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"Invalid route path specifier specified.");
}
+ absl::StatusOr<StringMatcher> string_matcher =
+ StringMatcher::Create(type, match_string, case_sensitive);
+ if (!string_matcher.ok()) {
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("path matcher: ", string_matcher.status().message())
+ .c_str());
+ ;
+ }
+ route->matchers.path_matcher = std::move(string_matcher.value());
return GRPC_ERROR_NONE;
}
envoy_config_route_v3_RouteMatch_headers(match, &size);
for (size_t i = 0; i < size; ++i) {
const envoy_config_route_v3_HeaderMatcher* header = headers[i];
- XdsApi::Route::Matchers::HeaderMatcher header_matcher;
- header_matcher.name =
+ const std::string name =
UpbStringToStdString(envoy_config_route_v3_HeaderMatcher_name(header));
+ HeaderMatcher::Type type;
+ std::string match_string;
+ int64_t range_start = 0;
+ int64_t range_end = 0;
+ bool present_match = false;
if (envoy_config_route_v3_HeaderMatcher_has_exact_match(header)) {
- header_matcher.type =
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::EXACT;
- header_matcher.string_matcher = UpbStringToStdString(
+ type = HeaderMatcher::Type::EXACT;
+ match_string = UpbStringToStdString(
envoy_config_route_v3_HeaderMatcher_exact_match(header));
} else if (envoy_config_route_v3_HeaderMatcher_has_safe_regex_match(
header)) {
const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
envoy_config_route_v3_HeaderMatcher_safe_regex_match(header);
GPR_ASSERT(regex_matcher != nullptr);
- const std::string matcher = UpbStringToStdString(
+ type = HeaderMatcher::Type::SAFE_REGEX;
+ match_string = UpbStringToStdString(
envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
- std::unique_ptr<RE2> regex = absl::make_unique<RE2>(matcher);
- if (!regex->ok()) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Invalid regex string specified in header matcher.");
- }
- header_matcher.type =
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::REGEX;
- header_matcher.regex_match = std::move(regex);
} else if (envoy_config_route_v3_HeaderMatcher_has_range_match(header)) {
- header_matcher.type =
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::RANGE;
+ type = HeaderMatcher::Type::RANGE;
const envoy_type_v3_Int64Range* range_matcher =
envoy_config_route_v3_HeaderMatcher_range_match(header);
- header_matcher.range_start =
- envoy_type_v3_Int64Range_start(range_matcher);
- header_matcher.range_end = envoy_type_v3_Int64Range_end(range_matcher);
- if (header_matcher.range_end < header_matcher.range_start) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Invalid range header matcher specifier specified: end "
- "cannot be smaller than start.");
- }
+ range_start = envoy_type_v3_Int64Range_start(range_matcher);
+ range_end = envoy_type_v3_Int64Range_end(range_matcher);
} else if (envoy_config_route_v3_HeaderMatcher_has_present_match(header)) {
- header_matcher.type =
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PRESENT;
- header_matcher.present_match =
- envoy_config_route_v3_HeaderMatcher_present_match(header);
+ type = HeaderMatcher::Type::PRESENT;
+ present_match = envoy_config_route_v3_HeaderMatcher_present_match(header);
} else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
- header_matcher.type =
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::PREFIX;
- header_matcher.string_matcher = UpbStringToStdString(
+ type = HeaderMatcher::Type::PREFIX;
+ match_string = UpbStringToStdString(
envoy_config_route_v3_HeaderMatcher_prefix_match(header));
} else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
- header_matcher.type =
- XdsApi::Route::Matchers::HeaderMatcher::HeaderMatcherType::SUFFIX;
- header_matcher.string_matcher = UpbStringToStdString(
+ type = HeaderMatcher::Type::SUFFIX;
+ match_string = UpbStringToStdString(
envoy_config_route_v3_HeaderMatcher_suffix_match(header));
+ } else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
+ type = HeaderMatcher::Type::CONTAINS;
+ match_string = UpbStringToStdString(
+ envoy_config_route_v3_HeaderMatcher_contains_match(header));
} else {
return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"Invalid route header matcher specified.");
}
- header_matcher.invert_match =
+ bool invert_match =
envoy_config_route_v3_HeaderMatcher_invert_match(header);
- route->matchers.header_matchers.emplace_back(std::move(header_matcher));
+ absl::StatusOr<HeaderMatcher> header_matcher =
+ HeaderMatcher::Create(name, type, match_string, range_start, range_end,
+ present_match, invert_match);
+ if (!header_matcher.ok()) {
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("header matcher: ", header_matcher.status().message())
+ .c_str());
+ }
+ route->matchers.header_matchers.emplace_back(
+ std::move(header_matcher.value()));
}
return GRPC_ERROR_NONE;
}
return GRPC_ERROR_NONE;
}
-grpc_error* LdsResponseParse(
- XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
- const envoy_service_discovery_v3_DiscoveryResponse* response,
- const std::set<absl::string_view>& expected_listener_names,
- XdsApi::LdsUpdateMap* lds_update_map, upb_arena* arena) {
- // Get the resources from the response.
- size_t size;
- const google_protobuf_Any* const* resources =
- envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
- for (size_t i = 0; i < size; ++i) {
- // Check the type_url of the resource.
- absl::string_view type_url =
- UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
- if (!IsLds(type_url)) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not LDS.");
- }
- // Decode the listener.
- const upb_strview encoded_listener =
- google_protobuf_Any_value(resources[i]);
- const envoy_config_listener_v3_Listener* listener =
- envoy_config_listener_v3_Listener_parse(encoded_listener.data,
- encoded_listener.size, arena);
- if (listener == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode listener.");
- }
- // Check listener name. Ignore unexpected listeners.
- std::string listener_name =
- UpbStringToStdString(envoy_config_listener_v3_Listener_name(listener));
- if (expected_listener_names.find(listener_name) ==
- expected_listener_names.end()) {
- continue;
- }
- // Fail if listener name is duplicated.
- if (lds_update_map->find(listener_name) != lds_update_map->end()) {
- return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat("duplicate listener name \"", listener_name, "\"")
- .c_str());
- }
- XdsApi::LdsUpdate& lds_update = (*lds_update_map)[listener_name];
- // Get api_listener and decode it to http_connection_manager.
- const envoy_config_listener_v3_ApiListener* api_listener =
- envoy_config_listener_v3_Listener_api_listener(listener);
- if (api_listener == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Listener has no ApiListener.");
- }
- const upb_strview encoded_api_listener = google_protobuf_Any_value(
- envoy_config_listener_v3_ApiListener_api_listener(api_listener));
- const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
- http_connection_manager =
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
- encoded_api_listener.data, encoded_api_listener.size, arena);
- if (http_connection_manager == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Could not parse HttpConnectionManager config from ApiListener");
- }
- if (XdsTimeoutEnabled()) {
- // Obtain max_stream_duration from Http Protocol Options.
- const envoy_config_core_v3_HttpProtocolOptions* options =
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(
- http_connection_manager);
- if (options != nullptr) {
- const google_protobuf_Duration* duration =
- envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(
- options);
- if (duration != nullptr) {
- lds_update.http_max_stream_duration.seconds =
- google_protobuf_Duration_seconds(duration);
- lds_update.http_max_stream_duration.nanos =
- google_protobuf_Duration_nanos(duration);
- }
- }
- }
- // Found inlined route_config. Parse it to find the cluster_name.
- if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
- http_connection_manager)) {
- const envoy_config_route_v3_RouteConfiguration* route_config =
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
- http_connection_manager);
- XdsApi::RdsUpdate rds_update;
- grpc_error* error =
- RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
- if (error != GRPC_ERROR_NONE) return error;
- lds_update.rds_update = std::move(rds_update);
- continue;
- }
- // Validate that RDS must be used to get the route_config dynamically.
- if (!envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_rds(
- http_connection_manager)) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "HttpConnectionManager neither has inlined route_config nor RDS.");
- }
- const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
- http_connection_manager);
- // Check that the ConfigSource specifies ADS.
- const envoy_config_core_v3_ConfigSource* config_source =
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(
- rds);
- if (config_source == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "HttpConnectionManager missing config_source for RDS.");
- }
- if (!envoy_config_core_v3_ConfigSource_has_ads(config_source)) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "HttpConnectionManager ConfigSource for RDS does not specify ADS.");
- }
- // Get the route_config_name.
- lds_update.route_config_name = UpbStringToStdString(
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
- rds));
- }
- return GRPC_ERROR_NONE;
-}
-
-grpc_error* RdsResponseParse(
- XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
- const envoy_service_discovery_v3_DiscoveryResponse* response,
- const std::set<absl::string_view>& expected_route_configuration_names,
- XdsApi::RdsUpdateMap* rds_update_map, upb_arena* arena) {
- // Get the resources from the response.
- size_t size;
- const google_protobuf_Any* const* resources =
- envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
- for (size_t i = 0; i < size; ++i) {
- // Check the type_url of the resource.
- absl::string_view type_url =
- UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
- if (!IsRds(type_url)) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not RDS.");
- }
- // Decode the route_config.
- const upb_strview encoded_route_config =
- google_protobuf_Any_value(resources[i]);
- const envoy_config_route_v3_RouteConfiguration* route_config =
- envoy_config_route_v3_RouteConfiguration_parse(
- encoded_route_config.data, encoded_route_config.size, arena);
- if (route_config == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode route_config.");
- }
- // Check route_config_name. Ignore unexpected route_config.
- std::string route_config_name = UpbStringToStdString(
- envoy_config_route_v3_RouteConfiguration_name(route_config));
- if (expected_route_configuration_names.find(route_config_name) ==
- expected_route_configuration_names.end()) {
- continue;
- }
- // Fail if route config name is duplicated.
- if (rds_update_map->find(route_config_name) != rds_update_map->end()) {
- return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat("duplicate route config name \"", route_config_name,
- "\"")
- .c_str());
- }
- // Parse the route_config.
- XdsApi::RdsUpdate& rds_update =
- (*rds_update_map)[std::move(route_config_name)];
- grpc_error* error =
- RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
- if (error != GRPC_ERROR_NONE) return error;
- }
- return GRPC_ERROR_NONE;
-}
-
XdsApi::CommonTlsContext::CertificateProviderInstance
CertificateProviderInstanceParse(
const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance*
envoy_extensions_transport_sockets_tls_v3_CertificateValidationContext_match_subject_alt_names(
default_validation_context, &len);
for (size_t i = 0; i < len; ++i) {
- XdsApi::StringMatcher::StringMatcherType type;
+ StringMatcher::Type type;
std::string matcher;
if (envoy_type_matcher_v3_StringMatcher_has_exact(
subject_alt_names_matchers[i])) {
- type = XdsApi::StringMatcher::StringMatcherType::EXACT;
+ type = StringMatcher::Type::EXACT;
matcher =
UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_exact(
subject_alt_names_matchers[i]));
} else if (envoy_type_matcher_v3_StringMatcher_has_prefix(
subject_alt_names_matchers[i])) {
- type = XdsApi::StringMatcher::StringMatcherType::PREFIX;
+ type = StringMatcher::Type::PREFIX;
matcher =
UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_prefix(
subject_alt_names_matchers[i]));
} else if (envoy_type_matcher_v3_StringMatcher_has_suffix(
subject_alt_names_matchers[i])) {
- type = XdsApi::StringMatcher::StringMatcherType::SUFFIX;
+ type = StringMatcher::Type::SUFFIX;
matcher =
UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_suffix(
subject_alt_names_matchers[i]));
} else if (envoy_type_matcher_v3_StringMatcher_has_contains(
subject_alt_names_matchers[i])) {
- type = XdsApi::StringMatcher::StringMatcherType::CONTAINS;
+ type = StringMatcher::Type::CONTAINS;
matcher =
UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_contains(
subject_alt_names_matchers[i]));
} else if (envoy_type_matcher_v3_StringMatcher_has_safe_regex(
subject_alt_names_matchers[i])) {
- type = XdsApi::StringMatcher::StringMatcherType::SAFE_REGEX;
+ type = StringMatcher::Type::SAFE_REGEX;
auto* regex_matcher = envoy_type_matcher_v3_StringMatcher_safe_regex(
subject_alt_names_matchers[i]);
matcher = UpbStringToStdString(
}
bool ignore_case = envoy_type_matcher_v3_StringMatcher_ignore_case(
subject_alt_names_matchers[i]);
- XdsApi::StringMatcher string_matcher(type, matcher, ignore_case);
- if (type == XdsApi::StringMatcher::StringMatcherType::SAFE_REGEX) {
- if (!string_matcher.regex_matcher()->ok()) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Invalid regex string specified in string matcher.");
- }
- if (ignore_case) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "StringMatcher: ignore_case has no effect for SAFE_REGEX.");
- }
+ absl::StatusOr<StringMatcher> string_matcher =
+ StringMatcher::Create(type, matcher,
+ /*case_sensitive=*/!ignore_case);
+ if (!string_matcher.ok()) {
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("string matcher: ",
+ string_matcher.status().message())
+ .c_str());
+ }
+ if (type == StringMatcher::Type::SAFE_REGEX && ignore_case) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "StringMatcher: ignore_case has no effect for SAFE_REGEX.");
}
common_tls_context->combined_validation_context
.default_validation_context.match_subject_alt_names.push_back(
- std::move(string_matcher));
+ std::move(string_matcher.value()));
}
}
auto* validation_context_certificate_provider_instance =
return GRPC_ERROR_NONE;
}
+grpc_error* LdsResponseParseClient(
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab, upb_arena* arena,
+ const envoy_config_listener_v3_ApiListener* api_listener,
+ XdsApi::LdsUpdate* lds_update) {
+ lds_update->type = XdsApi::LdsUpdate::ListenerType::kHttpApiListener;
+ const upb_strview encoded_api_listener = google_protobuf_Any_value(
+ envoy_config_listener_v3_ApiListener_api_listener(api_listener));
+ const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
+ http_connection_manager =
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
+ encoded_api_listener.data, encoded_api_listener.size, arena);
+ if (http_connection_manager == nullptr) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Could not parse HttpConnectionManager config from ApiListener");
+ }
+ if (XdsTimeoutEnabled()) {
+ // Obtain max_stream_duration from Http Protocol Options.
+ const envoy_config_core_v3_HttpProtocolOptions* options =
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(
+ http_connection_manager);
+ if (options != nullptr) {
+ const google_protobuf_Duration* duration =
+ envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(options);
+ if (duration != nullptr) {
+ lds_update->http_max_stream_duration.seconds =
+ google_protobuf_Duration_seconds(duration);
+ lds_update->http_max_stream_duration.nanos =
+ google_protobuf_Duration_nanos(duration);
+ }
+ }
+ }
+ // Found inlined route_config. Parse it to find the cluster_name.
+ if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
+ http_connection_manager)) {
+ const envoy_config_route_v3_RouteConfiguration* route_config =
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
+ http_connection_manager);
+ XdsApi::RdsUpdate rds_update;
+ grpc_error* error =
+ RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
+ if (error != GRPC_ERROR_NONE) return error;
+ lds_update->rds_update = std::move(rds_update);
+ return GRPC_ERROR_NONE;
+ }
+ // Validate that RDS must be used to get the route_config dynamically.
+ if (!envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_rds(
+ http_connection_manager)) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "HttpConnectionManager neither has inlined route_config nor RDS.");
+ }
+ const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
+ http_connection_manager);
+ // Check that the ConfigSource specifies ADS.
+ const envoy_config_core_v3_ConfigSource* config_source =
+ envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(
+ rds);
+ if (config_source == nullptr) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "HttpConnectionManager missing config_source for RDS.");
+ }
+ if (!envoy_config_core_v3_ConfigSource_has_ads(config_source)) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "HttpConnectionManager ConfigSource for RDS does not specify ADS.");
+ }
+ // Get the route_config_name.
+ lds_update->route_config_name = UpbStringToStdString(
+ envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
+ rds));
+ return GRPC_ERROR_NONE;
+}
+
+grpc_error* LdsResponseParseServer(
+ upb_arena* arena, const envoy_config_listener_v3_Listener* listener,
+ const std::string& /*listener_name*/,
+ const envoy_config_core_v3_Address* /*address*/,
+ XdsApi::LdsUpdate* lds_update) {
+ lds_update->type = XdsApi::LdsUpdate::ListenerType::kTcpListener;
+ // TODO(yashykt): Support filter chain match.
+ // Right now, we are supporting and expecting only one entry in filter_chains.
+ size_t size = 0;
+ auto* filter_chains =
+ envoy_config_listener_v3_Listener_filter_chains(listener, &size);
+ if (size != 1) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Only one filter_chain supported.");
+ }
+ // Get the DownstreamTlsContext from the match
+ if (XdsSecurityEnabled()) {
+ auto* transport_socket =
+ envoy_config_listener_v3_FilterChain_transport_socket(filter_chains[0]);
+ if (transport_socket != nullptr) {
+ absl::string_view name = UpbStringToAbsl(
+ envoy_config_core_v3_TransportSocket_name(transport_socket));
+ if (name == "envoy.transport_sockets.tls") {
+ auto* typed_config =
+ envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
+ if (typed_config != nullptr) {
+ const upb_strview encoded_downstream_tls_context =
+ google_protobuf_Any_value(typed_config);
+ auto* downstream_tls_context =
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
+ encoded_downstream_tls_context.data,
+ encoded_downstream_tls_context.size, arena);
+ if (downstream_tls_context == nullptr) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Can't decode downstream tls context.");
+ }
+ auto* common_tls_context =
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
+ downstream_tls_context);
+ if (common_tls_context != nullptr) {
+ grpc_error* error = CommonTlsContextParse(
+ common_tls_context,
+ &lds_update->downstream_tls_context.common_tls_context);
+ if (error != GRPC_ERROR_NONE) return error;
+ }
+ auto* require_client_certificate =
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
+ downstream_tls_context);
+ if (require_client_certificate != nullptr) {
+ lds_update->downstream_tls_context.require_client_certificate =
+ google_protobuf_BoolValue_value(require_client_certificate);
+ }
+ }
+ if (lds_update->downstream_tls_context.common_tls_context
+ .tls_certificate_certificate_provider_instance.instance_name
+ .empty()) {
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "TLS configuration provided but no "
+ "tls_certificate_certificate_provider_instance found.");
+ }
+ }
+ }
+ }
+ return GRPC_ERROR_NONE;
+}
+
+grpc_error* LdsResponseParse(
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
+ const envoy_service_discovery_v3_DiscoveryResponse* response,
+ const std::set<absl::string_view>& expected_listener_names,
+ XdsApi::LdsUpdateMap* lds_update_map,
+ std::set<std::string>* resource_names_failed, upb_arena* arena) {
+ std::vector<grpc_error*> errors;
+ // Get the resources from the response.
+ size_t size;
+ const google_protobuf_Any* const* resources =
+ envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
+ for (size_t i = 0; i < size; ++i) {
+ // Check the type_url of the resource.
+ absl::string_view type_url =
+ UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
+ if (!IsLds(type_url)) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("resource index ", i, ": Resource is not LDS.")
+ .c_str()));
+ continue;
+ }
+ // Decode the listener.
+ const upb_strview encoded_listener =
+ google_protobuf_Any_value(resources[i]);
+ const envoy_config_listener_v3_Listener* listener =
+ envoy_config_listener_v3_Listener_parse(encoded_listener.data,
+ encoded_listener.size, arena);
+ if (listener == nullptr) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("resource index ", i, ": Can't decode listener.")
+ .c_str()));
+ continue;
+ }
+ // Check listener name. Ignore unexpected listeners.
+ std::string listener_name =
+ UpbStringToStdString(envoy_config_listener_v3_Listener_name(listener));
+ if (expected_listener_names.find(listener_name) ==
+ expected_listener_names.end()) {
+ continue;
+ }
+ // Fail if listener name is duplicated.
+ if (lds_update_map->find(listener_name) != lds_update_map->end()) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("duplicate listener name \"", listener_name, "\"")
+ .c_str()));
+ resource_names_failed->insert(listener_name);
+ continue;
+ }
+ XdsApi::LdsUpdate& lds_update = (*lds_update_map)[listener_name];
+ // Check whether it's a client or server listener.
+ const envoy_config_listener_v3_ApiListener* api_listener =
+ envoy_config_listener_v3_Listener_api_listener(listener);
+ const envoy_config_core_v3_Address* address =
+ envoy_config_listener_v3_Listener_address(listener);
+ if (api_listener != nullptr && address != nullptr) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(listener_name,
+ ": Listener has both address and ApiListener")
+ .c_str()));
+ resource_names_failed->insert(listener_name);
+ continue;
+ }
+ if (api_listener == nullptr && address == nullptr) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(listener_name,
+ ": Listener has neither address nor ApiListener")
+ .c_str()));
+ resource_names_failed->insert(listener_name);
+ continue;
+ }
+ grpc_error* error = GRPC_ERROR_NONE;
+ if (api_listener != nullptr) {
+ error = LdsResponseParseClient(client, tracer, symtab, arena,
+ api_listener, &lds_update);
+ } else {
+ error = LdsResponseParseServer(arena, listener, listener_name, address,
+ &lds_update);
+ }
+ if (error != GRPC_ERROR_NONE) {
+ errors.push_back(grpc_error_add_child(
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(listener_name, ": validation error").c_str()),
+ error));
+ resource_names_failed->insert(listener_name);
+ }
+ }
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing LDS response", &errors);
+}
+
+grpc_error* RdsResponseParse(
+ XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
+ const envoy_service_discovery_v3_DiscoveryResponse* response,
+ const std::set<absl::string_view>& expected_route_configuration_names,
+ XdsApi::RdsUpdateMap* rds_update_map,
+ std::set<std::string>* resource_names_failed, upb_arena* arena) {
+ std::vector<grpc_error*> errors;
+ // Get the resources from the response.
+ size_t size;
+ const google_protobuf_Any* const* resources =
+ envoy_service_discovery_v3_DiscoveryResponse_resources(response, &size);
+ for (size_t i = 0; i < size; ++i) {
+ // Check the type_url of the resource.
+ absl::string_view type_url =
+ UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
+ if (!IsRds(type_url)) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("resource index ", i, ": Resource is not RDS.")
+ .c_str()));
+ continue;
+ }
+ // Decode the route_config.
+ const upb_strview encoded_route_config =
+ google_protobuf_Any_value(resources[i]);
+ const envoy_config_route_v3_RouteConfiguration* route_config =
+ envoy_config_route_v3_RouteConfiguration_parse(
+ encoded_route_config.data, encoded_route_config.size, arena);
+ if (route_config == nullptr) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("resource index ", i, ": Can't decode route_config.")
+ .c_str()));
+ continue;
+ }
+ // Check route_config_name. Ignore unexpected route_config.
+ std::string route_config_name = UpbStringToStdString(
+ envoy_config_route_v3_RouteConfiguration_name(route_config));
+ if (expected_route_configuration_names.find(route_config_name) ==
+ expected_route_configuration_names.end()) {
+ continue;
+ }
+ // Fail if route config name is duplicated.
+ if (rds_update_map->find(route_config_name) != rds_update_map->end()) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("duplicate route config name \"", route_config_name,
+ "\"")
+ .c_str()));
+ resource_names_failed->insert(route_config_name);
+ continue;
+ }
+ // Parse the route_config.
+ XdsApi::RdsUpdate& rds_update = (*rds_update_map)[route_config_name];
+ grpc_error* error =
+ RouteConfigParse(client, tracer, symtab, route_config, &rds_update);
+ if (error != GRPC_ERROR_NONE) {
+ errors.push_back(grpc_error_add_child(
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(route_config_name, ": validation error").c_str()),
+ error));
+ resource_names_failed->insert(route_config_name);
+ }
+ }
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing RDS response", &errors);
+}
+
grpc_error* CdsResponseParse(
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
const envoy_service_discovery_v3_DiscoveryResponse* response,
const std::set<absl::string_view>& expected_cluster_names,
- XdsApi::CdsUpdateMap* cds_update_map, upb_arena* arena) {
+ XdsApi::CdsUpdateMap* cds_update_map,
+ std::set<std::string>* resource_names_failed, upb_arena* arena) {
+ std::vector<grpc_error*> errors;
// Get the resources from the response.
size_t size;
const google_protobuf_Any* const* resources =
absl::string_view type_url =
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
if (!IsCds(type_url)) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not CDS.");
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("resource index ", i, ": Resource is not CDS.")
+ .c_str()));
+ continue;
}
// Decode the cluster.
const upb_strview encoded_cluster = google_protobuf_Any_value(resources[i]);
envoy_config_cluster_v3_Cluster_parse(encoded_cluster.data,
encoded_cluster.size, arena);
if (cluster == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode cluster.");
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("resource index ", i, ": Can't decode cluster.")
+ .c_str()));
+ continue;
}
MaybeLogCluster(client, tracer, symtab, cluster);
// Ignore unexpected cluster names.
}
// Fail on duplicate resources.
if (cds_update_map->find(cluster_name) != cds_update_map->end()) {
- return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
absl::StrCat("duplicate resource name \"", cluster_name, "\"")
- .c_str());
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
}
- XdsApi::CdsUpdate& cds_update = (*cds_update_map)[std::move(cluster_name)];
+ XdsApi::CdsUpdate& cds_update = (*cds_update_map)[cluster_name];
// Check the cluster_discovery_type.
- if (!envoy_config_cluster_v3_Cluster_has_type(cluster)) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType not found.");
+ if (!envoy_config_cluster_v3_Cluster_has_type(cluster) &&
+ !envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name, ": DiscoveryType not found.").c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
}
- if (envoy_config_cluster_v3_Cluster_type(cluster) !=
+ if (envoy_config_cluster_v3_Cluster_type(cluster) ==
envoy_config_cluster_v3_Cluster_EDS) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType is not EDS.");
- }
- // Check the EDS config source.
- const envoy_config_cluster_v3_Cluster_EdsClusterConfig* eds_cluster_config =
- envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
- const envoy_config_core_v3_ConfigSource* eds_config =
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
- eds_cluster_config);
- if (!envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "EDS ConfigSource is not ADS.");
- }
- // Record EDS service_name (if any).
- upb_strview service_name =
- envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
- eds_cluster_config);
- if (service_name.size != 0) {
- cds_update.eds_service_name = UpbStringToStdString(service_name);
+ cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::EDS;
+ // Check the EDS config source.
+ const envoy_config_cluster_v3_Cluster_EdsClusterConfig*
+ eds_cluster_config =
+ envoy_config_cluster_v3_Cluster_eds_cluster_config(cluster);
+ const envoy_config_core_v3_ConfigSource* eds_config =
+ envoy_config_cluster_v3_Cluster_EdsClusterConfig_eds_config(
+ eds_cluster_config);
+ if (!envoy_config_core_v3_ConfigSource_has_ads(eds_config)) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name, ": EDS ConfigSource is not ADS.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
+ // Record EDS service_name (if any).
+ upb_strview service_name =
+ envoy_config_cluster_v3_Cluster_EdsClusterConfig_service_name(
+ eds_cluster_config);
+ if (service_name.size != 0) {
+ cds_update.eds_service_name = UpbStringToStdString(service_name);
+ }
+ } else if (!XdsAggregateAndLogicalDnsClusterEnabled()) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name, ": DiscoveryType is not valid.").c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
+ envoy_config_cluster_v3_Cluster_LOGICAL_DNS) {
+ cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::LOGICAL_DNS;
+ } else {
+ if (envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
+ const envoy_config_cluster_v3_Cluster_CustomClusterType*
+ custom_cluster_type =
+ envoy_config_cluster_v3_Cluster_cluster_type(cluster);
+ upb_strview type_name =
+ envoy_config_cluster_v3_Cluster_CustomClusterType_name(
+ custom_cluster_type);
+ if (UpbStringToAbsl(type_name) == "envoy.clusters.aggregate") {
+ cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::AGGREGATE;
+ // Retrieve aggregate clusters.
+ const google_protobuf_Any* typed_config =
+ envoy_config_cluster_v3_Cluster_CustomClusterType_typed_config(
+ custom_cluster_type);
+ const upb_strview aggregate_cluster_config_upb_strview =
+ google_protobuf_Any_value(typed_config);
+ const envoy_extensions_clusters_aggregate_v3_ClusterConfig*
+ aggregate_cluster_config =
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_parse(
+ aggregate_cluster_config_upb_strview.data,
+ aggregate_cluster_config_upb_strview.size, arena);
+ if (aggregate_cluster_config == nullptr) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name, ": Can't parse aggregate cluster.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
+ size_t size;
+ const upb_strview* clusters =
+ envoy_extensions_clusters_aggregate_v3_ClusterConfig_clusters(
+ aggregate_cluster_config, &size);
+ for (size_t i = 0; i < size; ++i) {
+ const upb_strview cluster = clusters[i];
+ cds_update.prioritized_cluster_names.emplace_back(
+ UpbStringToStdString(cluster));
+ }
+ } else {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name, ": DiscoveryType is not valid.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
+ } else {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name, ": DiscoveryType is not valid.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
}
// Check the LB policy.
- if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) !=
+ if (envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
envoy_config_cluster_v3_Cluster_ROUND_ROBIN) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "LB policy is not ROUND_ROBIN.");
+ cds_update.lb_policy = "ROUND_ROBIN";
+ } else if (XdsRingHashEnabled() &&
+ envoy_config_cluster_v3_Cluster_lb_policy(cluster) ==
+ envoy_config_cluster_v3_Cluster_RING_HASH) {
+ cds_update.lb_policy = "RING_HASH";
+ // Record ring hash lb config
+ auto* ring_hash_config =
+ envoy_config_cluster_v3_Cluster_ring_hash_lb_config(cluster);
+ if (ring_hash_config == nullptr) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name,
+ ": ring hash lb config required but not present.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
+ const google_protobuf_UInt64Value* max_ring_size =
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_maximum_ring_size(
+ ring_hash_config);
+ if (max_ring_size != nullptr) {
+ cds_update.max_ring_size =
+ google_protobuf_UInt64Value_value(max_ring_size);
+ if (cds_update.max_ring_size > 8388608 ||
+ cds_update.max_ring_size == 0) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(
+ cluster_name,
+ ": max_ring_size is not in the range of 1 to 8388608.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
+ }
+ const google_protobuf_UInt64Value* min_ring_size =
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_minimum_ring_size(
+ ring_hash_config);
+ if (min_ring_size != nullptr) {
+ cds_update.min_ring_size =
+ google_protobuf_UInt64Value_value(min_ring_size);
+ if (cds_update.min_ring_size > 8388608 ||
+ cds_update.min_ring_size == 0) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(
+ cluster_name,
+ ": min_ring_size is not in the range of 1 to 8388608.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
+ if (cds_update.min_ring_size > cds_update.max_ring_size) {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(
+ cluster_name,
+ ": min_ring_size cannot be greater than max_ring_size.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
+ }
+ if (envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
+ ring_hash_config) ==
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_XX_HASH) {
+ cds_update.hash_function = XdsApi::CdsUpdate::HashFunction::XX_HASH;
+ } else if (
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
+ ring_hash_config) ==
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_MURMUR_HASH_2) {
+ cds_update.hash_function =
+ XdsApi::CdsUpdate::HashFunction::MURMUR_HASH_2;
+ } else {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name,
+ ": ring hash lb config has invalid hash function.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
+ } else {
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name, ": LB policy is not supported.").c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
}
if (XdsSecurityEnabled()) {
// Record Upstream tls context
encoded_upstream_tls_context.data,
encoded_upstream_tls_context.size, arena);
if (upstream_tls_context == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Can't decode upstream tls context.");
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name,
+ ": Can't decode upstream tls context.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
}
auto* common_tls_context =
envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
if (common_tls_context != nullptr) {
grpc_error* error = CommonTlsContextParse(
common_tls_context, &cds_update.common_tls_context);
- if (error != GRPC_ERROR_NONE) return error;
+ if (error != GRPC_ERROR_NONE) {
+ errors.push_back(grpc_error_add_child(
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name, ": error in TLS context")
+ .c_str()),
+ error));
+ resource_names_failed->insert(cluster_name);
+ continue;
+ }
}
}
if (cds_update.common_tls_context.combined_validation_context
.validation_context_certificate_provider_instance
.instance_name.empty()) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "TLS configuration provided but no "
- "validation_context_certificate_provider_instance found.");
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name,
+ "TLS configuration provided but no "
+ "validation_context_certificate_provider_instance "
+ "found.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
}
}
}
envoy_config_cluster_v3_Cluster_lrs_server(cluster);
if (lrs_server != nullptr) {
if (!envoy_config_core_v3_ConfigSource_has_self(lrs_server)) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "LRS ConfigSource is not self.");
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(cluster_name, ": LRS ConfigSource is not self.")
+ .c_str()));
+ resource_names_failed->insert(cluster_name);
+ continue;
}
cds_update.lrs_load_reporting_server_name.emplace("");
}
}
}
}
- return GRPC_ERROR_NONE;
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing CDS response", &errors);
}
grpc_error* ServerAddressParseAndAppend(
XdsClient* client, TraceFlag* tracer, upb_symtab* symtab,
const envoy_service_discovery_v3_DiscoveryResponse* response,
const std::set<absl::string_view>& expected_eds_service_names,
- XdsApi::EdsUpdateMap* eds_update_map, upb_arena* arena) {
+ XdsApi::EdsUpdateMap* eds_update_map,
+ std::set<std::string>* resource_names_failed, upb_arena* arena) {
+ std::vector<grpc_error*> errors;
// Get the resources from the response.
size_t size;
const google_protobuf_Any* const* resources =
absl::string_view type_url =
UpbStringToAbsl(google_protobuf_Any_type_url(resources[i]));
if (!IsEds(type_url)) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not EDS.");
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("resource index ", i, ": Resource is not EDS.")
+ .c_str()));
+ continue;
}
// Get the cluster_load_assignment.
upb_strview encoded_cluster_load_assignment =
encoded_cluster_load_assignment.data,
encoded_cluster_load_assignment.size, arena);
if (cluster_load_assignment == nullptr) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Can't parse cluster_load_assignment.");
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("resource index ", i,
+ ": Can't parse cluster_load_assignment.")
+ .c_str()));
+ continue;
}
MaybeLogClusterLoadAssignment(client, tracer, symtab,
cluster_load_assignment);
}
// Fail on duplicate resources.
if (eds_update_map->find(eds_service_name) != eds_update_map->end()) {
- return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
absl::StrCat("duplicate resource name \"", eds_service_name, "\"")
- .c_str());
+ .c_str()));
+ resource_names_failed->insert(eds_service_name);
+ continue;
}
- XdsApi::EdsUpdate& eds_update =
- (*eds_update_map)[std::move(eds_service_name)];
+ XdsApi::EdsUpdate& eds_update = (*eds_update_map)[eds_service_name];
// Get the endpoints.
size_t locality_size;
const envoy_config_endpoint_v3_LocalityLbEndpoints* const* endpoints =
envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
cluster_load_assignment, &locality_size);
+ grpc_error* error = GRPC_ERROR_NONE;
for (size_t j = 0; j < locality_size; ++j) {
size_t priority;
XdsApi::EdsUpdate::Priority::Locality locality;
- grpc_error* error = LocalityParse(endpoints[j], &locality, &priority);
- if (error != GRPC_ERROR_NONE) return error;
+ error = LocalityParse(endpoints[j], &locality, &priority);
+ if (error != GRPC_ERROR_NONE) break;
// Filter out locality with weight 0.
if (locality.lb_weight == 0) continue;
// Make sure prorities is big enough. Note that they might not
eds_update.priorities[priority].localities.emplace(locality.name.get(),
std::move(locality));
}
+ if (error != GRPC_ERROR_NONE) {
+ errors.push_back(grpc_error_add_child(
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(eds_service_name, ": locality validation error")
+ .c_str()),
+ error));
+ resource_names_failed->insert(eds_service_name);
+ continue;
+ }
for (const auto& priority : eds_update.priorities) {
if (priority.localities.empty()) {
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "EDS update includes sparse priority list");
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(eds_service_name, ": sparse priority list").c_str()));
+ resource_names_failed->insert(eds_service_name);
+ continue;
}
}
// Get the drop config.
envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_drop_overloads(
policy, &drop_size);
for (size_t j = 0; j < drop_size; ++j) {
- grpc_error* error =
+ error =
DropParseAndAppend(drop_overload[j], eds_update.drop_config.get());
- if (error != GRPC_ERROR_NONE) return error;
+ if (error != GRPC_ERROR_NONE) break;
+ }
+ if (error != GRPC_ERROR_NONE) {
+ errors.push_back(grpc_error_add_child(
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat(eds_service_name, ": drop config validation error")
+ .c_str()),
+ error));
+ resource_names_failed->insert(eds_service_name);
+ continue;
}
}
}
- return GRPC_ERROR_NONE;
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing EDS response", &errors);
}
std::string TypeUrlInternalToExternal(absl::string_view type_url) {
return std::string(type_url);
}
+template <typename UpdateMap>
+void MoveUpdatesToFailedSet(UpdateMap* update_map,
+ std::set<std::string>* resource_names_failed) {
+ for (const auto& p : *update_map) {
+ resource_names_failed->insert(p.first);
+ }
+ update_map->clear();
+}
+
} // namespace
XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
envoy_service_discovery_v3_DiscoveryResponse_nonce(response));
// Parse the response according to the resource type.
if (IsLds(result.type_url)) {
- result.parse_error = LdsResponseParse(client_, tracer_, symtab_.ptr(),
- response, expected_listener_names,
- &result.lds_update_map, arena.ptr());
+ result.parse_error = LdsResponseParse(
+ client_, tracer_, symtab_.ptr(), response, expected_listener_names,
+ &result.lds_update_map, &result.resource_names_failed, arena.ptr());
+ if (result.parse_error != GRPC_ERROR_NONE) {
+ MoveUpdatesToFailedSet(&result.lds_update_map,
+ &result.resource_names_failed);
+ }
} else if (IsRds(result.type_url)) {
- result.parse_error =
- RdsResponseParse(client_, tracer_, symtab_.ptr(), response,
- expected_route_configuration_names,
- &result.rds_update_map, arena.ptr());
+ result.parse_error = RdsResponseParse(
+ client_, tracer_, symtab_.ptr(), response,
+ expected_route_configuration_names, &result.rds_update_map,
+ &result.resource_names_failed, arena.ptr());
+ if (result.parse_error != GRPC_ERROR_NONE) {
+ MoveUpdatesToFailedSet(&result.rds_update_map,
+ &result.resource_names_failed);
+ }
} else if (IsCds(result.type_url)) {
- result.parse_error = CdsResponseParse(client_, tracer_, symtab_.ptr(),
- response, expected_cluster_names,
- &result.cds_update_map, arena.ptr());
+ result.parse_error = CdsResponseParse(
+ client_, tracer_, symtab_.ptr(), response, expected_cluster_names,
+ &result.cds_update_map, &result.resource_names_failed, arena.ptr());
+ if (result.parse_error != GRPC_ERROR_NONE) {
+ MoveUpdatesToFailedSet(&result.cds_update_map,
+ &result.resource_names_failed);
+ }
} else if (IsEds(result.type_url)) {
- result.parse_error = EdsResponseParse(client_, tracer_, symtab_.ptr(),
- response, expected_eds_service_names,
- &result.eds_update_map, arena.ptr());
+ result.parse_error = EdsResponseParse(
+ client_, tracer_, symtab_.ptr(), response, expected_eds_service_names,
+ &result.eds_update_map, &result.resource_names_failed, arena.ptr());
+ if (result.parse_error != GRPC_ERROR_NONE) {
+ MoveUpdatesToFailedSet(&result.eds_update_map,
+ &result.resource_names_failed);
+ }
}
return result;
}
#include "src/core/ext/filters/client_channel/server_address.h"
#include "src/core/ext/xds/xds_bootstrap.h"
#include "src/core/ext/xds/xds_client_stats.h"
+#include "src/core/lib/security/authorization/matchers.h"
namespace grpc_core {
struct Route {
// Matchers for this route.
struct Matchers {
- struct PathMatcher {
- enum class PathMatcherType {
- PATH, // path stored in string_matcher field
- PREFIX, // prefix stored in string_matcher field
- REGEX, // regex stored in regex_matcher field
- };
- PathMatcherType type;
- std::string string_matcher;
- std::unique_ptr<RE2> regex_matcher;
- bool case_sensitive = true;
-
- PathMatcher() = default;
- PathMatcher(const PathMatcher& other);
- PathMatcher& operator=(const PathMatcher& other);
- bool operator==(const PathMatcher& other) const;
- std::string ToString() const;
- };
-
- struct HeaderMatcher {
- enum class HeaderMatcherType {
- EXACT, // value stored in string_matcher field
- REGEX, // uses regex_match field
- RANGE, // uses range_start and range_end fields
- PRESENT, // uses present_match field
- PREFIX, // prefix stored in string_matcher field
- SUFFIX, // suffix stored in string_matcher field
- };
- std::string name;
- HeaderMatcherType type;
- int64_t range_start;
- int64_t range_end;
- std::string string_matcher;
- std::unique_ptr<RE2> regex_match;
- bool present_match;
- // invert_match field may or may not exisit, so initialize it to
- // false.
- bool invert_match = false;
-
- HeaderMatcher() = default;
- HeaderMatcher(const HeaderMatcher& other);
- HeaderMatcher& operator=(const HeaderMatcher& other);
- bool operator==(const HeaderMatcher& other) const;
- std::string ToString() const;
- };
-
- PathMatcher path_matcher;
+ StringMatcher path_matcher;
std::vector<HeaderMatcher> header_matchers;
absl::optional<uint32_t> fraction_per_million;
VirtualHost* FindVirtualHostForDomain(const std::string& domain);
};
- class StringMatcher {
- public:
- enum class StringMatcherType {
- EXACT, // value stored in string_matcher_ field
- PREFIX, // value stored in string_matcher_ field
- SUFFIX, // value stored in string_matcher_ field
- SAFE_REGEX, // pattern stored in regex_matcher_ field
- CONTAINS, // value stored in string_matcher_ field
- };
-
- StringMatcher() = default;
- StringMatcher(const StringMatcher& other);
- StringMatcher(StringMatcherType type, const std::string& matcher,
- bool ignore_case = false);
- StringMatcher& operator=(const StringMatcher& other);
- bool operator==(const StringMatcher& other) const;
-
- bool Match(absl::string_view value) const;
-
- std::string ToString() const;
-
- StringMatcherType type() const { return type_; }
-
- // Valid for EXACT, PREFIX, SUFFIX and CONTAINS
- const std::string& string_matcher() const { return string_matcher_; }
-
- // Valid for SAFE_REGEX
- RE2* regex_matcher() const { return regex_matcher_.get(); }
-
- private:
- StringMatcherType type_ = StringMatcherType::EXACT;
- std::string string_matcher_;
- std::unique_ptr<RE2> regex_matcher_;
- bool ignore_case_ = false;
- };
-
struct CommonTlsContext {
struct CertificateValidationContext {
std::vector<StringMatcher> match_subject_alt_names;
bool Empty() const;
};
+ struct DownstreamTlsContext {
+ CommonTlsContext common_tls_context;
+ bool require_client_certificate = false;
+
+ bool operator==(const DownstreamTlsContext& other) const {
+ return common_tls_context == other.common_tls_context &&
+ require_client_certificate == other.require_client_certificate;
+ }
+
+ std::string ToString() const;
+ bool Empty() const;
+ };
+
// TODO(roth): When we can use absl::variant<>, consider using that
// here, to enforce the fact that only one of the two fields can be set.
struct LdsUpdate {
+ enum class ListenerType {
+ kTcpListener = 0,
+ kHttpApiListener,
+ } type;
+ DownstreamTlsContext downstream_tls_context;
// The name to use in the RDS request.
std::string route_config_name;
// Storing the Http Connection Manager Common Http Protocol Option
absl::optional<RdsUpdate> rds_update;
bool operator==(const LdsUpdate& other) const {
- return route_config_name == other.route_config_name &&
+ return downstream_tls_context == other.downstream_tls_context &&
+ route_config_name == other.route_config_name &&
rds_update == other.rds_update &&
http_max_stream_duration == other.http_max_stream_duration;
}
+
+ std::string ToString() const;
};
using LdsUpdateMap = std::map<std::string /*server_name*/, LdsUpdate>;
using RdsUpdateMap = std::map<std::string /*route_config_name*/, RdsUpdate>;
struct CdsUpdate {
+ enum ClusterType { EDS, LOGICAL_DNS, AGGREGATE };
+ ClusterType cluster_type;
+ // For cluster type EDS.
// The name to use in the EDS request.
// If empty, the cluster name will be used.
std::string eds_service_name;
// If set to the empty string, will use the same server we obtained the CDS
// data from.
absl::optional<std::string> lrs_load_reporting_server_name;
+ // The LB policy to use (e.g., "ROUND_ROBIN" or "RING_HASH").
+ std::string lb_policy;
+ // Used for RING_HASH LB policy only.
+ uint64_t min_ring_size = 1024;
+ uint64_t max_ring_size = 8388608;
+ enum HashFunction { XX_HASH, MURMUR_HASH_2 };
+ HashFunction hash_function;
// Maximum number of outstanding requests can be made to the upstream
// cluster.
uint32_t max_concurrent_requests = 1024;
+ // For cluster type AGGREGATE.
+ // The prioritized list of cluster names.
+ std::vector<std::string> prioritized_cluster_names;
bool operator==(const CdsUpdate& other) const {
- return eds_service_name == other.eds_service_name &&
+ return cluster_type == other.cluster_type &&
+ eds_service_name == other.eds_service_name &&
common_tls_context == other.common_tls_context &&
lrs_load_reporting_server_name ==
other.lrs_load_reporting_server_name &&
+ prioritized_cluster_names == other.prioritized_cluster_names &&
max_concurrent_requests == other.max_concurrent_requests;
}
// Parses an ADS response.
// If the response can't be parsed at the top level, the resulting
// type_url will be empty.
+ // If there is any other type of validation error, the parse_error
+ // field will be set to something other than GRPC_ERROR_NONE and the
+ // resource_names_failed field will be populated.
+ // Otherwise, one of the *_update_map fields will be populated, based
+ // on the type_url field.
struct AdsParseResult {
grpc_error* parse_error = GRPC_ERROR_NONE;
std::string version;
RdsUpdateMap rds_update_map;
CdsUpdateMap cds_update_map;
EdsUpdateMap eds_update_map;
+ std::set<std::string> resource_names_failed;
};
AdsParseResult ParseAdsResponse(
const grpc_slice& encoded_response,
creds_type == "fake";
}
-bool XdsChannelCredsRegistry::IsValidConfig(const std::string& creds_type,
- const Json& config) {
+bool XdsChannelCredsRegistry::IsValidConfig(const std::string& /*creds_type*/,
+ const Json& /*config*/) {
// Currently, none of the creds types actually take a config, but we
// ignore whatever might be specified in the bootstrap file for
// forward compatibility reasons.
RefCountedPtr<grpc_channel_credentials>
XdsChannelCredsRegistry::MakeChannelCreds(const std::string& creds_type,
- const Json& config) {
+ const Json& /*config*/) {
if (creds_type == "google_default") {
return grpc_google_default_credentials_create(nullptr);
} else if (creds_type == "insecure") {
return absl::StrJoin(parts, "");
}
-} // namespace
-
-std::unique_ptr<XdsBootstrap> XdsBootstrap::ReadFromFile(XdsClient* client,
- TraceFlag* tracer,
- grpc_error** error) {
- grpc_core::UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
- if (path == nullptr) {
- *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
- "Environment variable GRPC_XDS_BOOTSTRAP not defined");
- return nullptr;
- }
- if (GRPC_TRACE_FLAG_ENABLED(*tracer)) {
- gpr_log(GPR_INFO,
- "[xds_client %p] Got bootstrap file location from "
- "GRPC_XDS_BOOTSTRAP environment variable: %s",
- client, path.get());
- }
- grpc_slice contents;
- *error = grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
- if (*error != GRPC_ERROR_NONE) return nullptr;
- absl::string_view contents_str_view = StringViewFromSlice(contents);
- if (GRPC_TRACE_FLAG_ENABLED(*tracer)) {
- gpr_log(GPR_DEBUG, "[xds_client %p] Bootstrap file contents: %s", client,
- std::string(contents_str_view).c_str());
- }
- Json json = Json::Parse(contents_str_view, error);
- grpc_slice_unref_internal(contents);
+std::unique_ptr<XdsBootstrap> ParseJsonAndCreate(
+ XdsClient* client, TraceFlag* tracer, absl::string_view json_string,
+ absl::string_view bootstrap_source, grpc_error** error) {
+ Json json = Json::Parse(json_string, error);
if (*error != GRPC_ERROR_NONE) {
grpc_error* error_out = GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(
- absl::StrCat("Failed to parse bootstrap file ", path.get()).c_str(),
+ absl::StrCat("Failed to parse bootstrap from ", bootstrap_source)
+ .c_str(),
error, 1);
GRPC_ERROR_UNREF(*error);
*error = error_out;
return result;
}
+} // namespace
+
+std::unique_ptr<XdsBootstrap> XdsBootstrap::Create(XdsClient* client,
+ TraceFlag* tracer,
+ const char* fallback_config,
+ grpc_error** error) {
+ // First, try GRPC_XDS_BOOTSTRAP env var.
+ grpc_core::UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
+ if (path != nullptr) {
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer)) {
+ gpr_log(GPR_INFO,
+ "[xds_client %p] Got bootstrap file location from "
+ "GRPC_XDS_BOOTSTRAP environment variable: %s",
+ client, path.get());
+ }
+ grpc_slice contents;
+ *error =
+ grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
+ if (*error != GRPC_ERROR_NONE) return nullptr;
+ absl::string_view contents_str_view = StringViewFromSlice(contents);
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer)) {
+ gpr_log(GPR_DEBUG, "[xds_client %p] Bootstrap file contents: %s", client,
+ std::string(contents_str_view).c_str());
+ }
+ std::string bootstrap_source = absl::StrCat("file ", path.get());
+ auto result = ParseJsonAndCreate(client, tracer, contents_str_view,
+ bootstrap_source, error);
+ grpc_slice_unref_internal(contents);
+ return result;
+ }
+ // Next, try GRPC_XDS_BOOTSTRAP_CONFIG env var.
+ grpc_core::UniquePtr<char> env_config(
+ gpr_getenv("GRPC_XDS_BOOTSTRAP_CONFIG"));
+ if (env_config != nullptr) {
+ return ParseJsonAndCreate(client, tracer, env_config.get(),
+ "GRPC_XDS_BOOTSTRAP_CONFIG env var", error);
+ }
+ // Finally, try fallback config.
+ if (fallback_config != nullptr) {
+ return ParseJsonAndCreate(client, tracer, fallback_config,
+ "fallback config", error);
+ }
+ // No bootstrap config found.
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Environment variables GRPC_XDS_BOOTSTRAP or GRPC_XDS_BOOTSTRAP_CONFIG "
+ "not defined");
+ return nullptr;
+}
+
XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) {
if (json.type() != Json::Type::OBJECT) {
*error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
Json& child = json->mutable_array()->at(i);
if (child.type() == Json::Type::STRING &&
child.string_value() == "xds_v3") {
- // TODO(roth): Remove env var check once we do interop testing and
- // are sure that the v3 code actually works.
- grpc_core::UniquePtr<char> enable_str(
- gpr_getenv("GRPC_XDS_EXPERIMENTAL_V3_SUPPORT"));
- bool enabled = false;
- if (gpr_parse_bool_value(enable_str.get(), &enabled) && enabled) {
- server->server_features.insert(
- std::move(*child.mutable_string_value()));
- }
+ server->server_features.insert(std::move(*child.mutable_string_value()));
}
}
return GRPC_ERROR_CREATE_FROM_VECTOR(
bool ShouldUseV3() const;
};
+ // Creates bootstrap object, obtaining the bootstrap JSON as appropriate
+ // for the environment:
+ // - If the GRPC_XDS_BOOTSTRAP env var is set, reads the file it specifies
+ // to obtain the bootstrap JSON.
+ // - Otherwise, if the GRPC_XDS_BOOTSTRAP_CONFIG env var is set, reads the
+ // content of that env var to obtain the bootstrap JSON.
+ // - Otherwise, the JSON will be read from fallback_config (if non-null).
// If *error is not GRPC_ERROR_NONE after returning, then there was an
- // error reading the file.
- static std::unique_ptr<XdsBootstrap> ReadFromFile(XdsClient* client,
- TraceFlag* tracer,
- grpc_error** error);
+ // error (e.g., no config found or error reading the file).
+ static std::unique_ptr<XdsBootstrap> Create(XdsClient* client,
+ TraceFlag* tracer,
+ const char* fallback_config,
+ grpc_error** error);
// Do not instantiate directly -- use ReadFromFile() above instead.
XdsBootstrap(Json json, grpc_error** error);
// presently, the watcher is immediately deleted when
// CancelTlsCertificatesWatch() is called, but that can potentially change in
// the future.
- explicit RootCertificatesWatcher(
- RefCountedPtr<grpc_tls_certificate_distributor> parent)
- : parent_(std::move(parent)) {}
+ RootCertificatesWatcher(
+ RefCountedPtr<grpc_tls_certificate_distributor> parent,
+ std::string cert_name)
+ : parent_(std::move(parent)), cert_name_(std::move(cert_name)) {}
void OnCertificatesChanged(absl::optional<absl::string_view> root_certs,
absl::optional<PemKeyCertPairList>
/* key_cert_pairs */) override {
if (root_certs.has_value()) {
- parent_->SetKeyMaterials("", std::string(root_certs.value()),
+ parent_->SetKeyMaterials(cert_name_, std::string(root_certs.value()),
absl::nullopt);
}
}
void OnError(grpc_error* root_cert_error,
grpc_error* identity_cert_error) override {
if (root_cert_error != GRPC_ERROR_NONE) {
- parent_->SetErrorForCert("", root_cert_error /* pass the ref */,
+ parent_->SetErrorForCert(cert_name_, root_cert_error /* pass the ref */,
absl::nullopt);
}
GRPC_ERROR_UNREF(identity_cert_error);
private:
RefCountedPtr<grpc_tls_certificate_distributor> parent_;
+ std::string cert_name_;
};
class IdentityCertificatesWatcher
// presently, the watcher is immediately deleted when
// CancelTlsCertificatesWatch() is called, but that can potentially change in
// the future.
- explicit IdentityCertificatesWatcher(
- RefCountedPtr<grpc_tls_certificate_distributor> parent)
- : parent_(std::move(parent)) {}
+ IdentityCertificatesWatcher(
+ RefCountedPtr<grpc_tls_certificate_distributor> parent,
+ std::string cert_name)
+ : parent_(std::move(parent)), cert_name_(std::move(cert_name)) {}
void OnCertificatesChanged(
absl::optional<absl::string_view> /* root_certs */,
absl::optional<PemKeyCertPairList> key_cert_pairs) override {
if (key_cert_pairs.has_value()) {
- parent_->SetKeyMaterials("", absl::nullopt, key_cert_pairs);
+ parent_->SetKeyMaterials(cert_name_, absl::nullopt, key_cert_pairs);
}
}
void OnError(grpc_error* root_cert_error,
grpc_error* identity_cert_error) override {
if (identity_cert_error != GRPC_ERROR_NONE) {
- parent_->SetErrorForCert("", absl::nullopt,
+ parent_->SetErrorForCert(cert_name_, absl::nullopt,
identity_cert_error /* pass the ref */);
}
GRPC_ERROR_UNREF(root_cert_error);
private:
RefCountedPtr<grpc_tls_certificate_distributor> parent_;
+ std::string cert_name_;
};
} // namespace
-XdsCertificateProvider::XdsCertificateProvider(
- absl::string_view root_cert_name,
- RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor,
- absl::string_view identity_cert_name,
- RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor,
- std::vector<XdsApi::StringMatcher> san_matchers)
- : root_cert_name_(root_cert_name),
- identity_cert_name_(identity_cert_name),
- root_cert_distributor_(std::move(root_cert_distributor)),
- identity_cert_distributor_(std::move(identity_cert_distributor)),
- san_matchers_(std::move(san_matchers)),
- distributor_(MakeRefCounted<grpc_tls_certificate_distributor>()) {
- distributor_->SetWatchStatusCallback(
- absl::bind_front(&XdsCertificateProvider::WatchStatusCallback, this));
+//
+// XdsCertificateProvider::ClusterCertificateState
+//
+
+XdsCertificateProvider::ClusterCertificateState::~ClusterCertificateState() {
+ if (root_cert_watcher_ != nullptr) {
+ root_cert_distributor_->CancelTlsCertificatesWatch(root_cert_watcher_);
+ }
+ if (identity_cert_watcher_ != nullptr) {
+ identity_cert_distributor_->CancelTlsCertificatesWatch(
+ identity_cert_watcher_);
+ }
}
-XdsCertificateProvider::~XdsCertificateProvider() {
- distributor_->SetWatchStatusCallback(nullptr);
+bool XdsCertificateProvider::ClusterCertificateState::IsSafeToRemove() const {
+ return !watching_root_certs_ && !watching_identity_certs_ &&
+ root_cert_distributor_ == nullptr &&
+ identity_cert_distributor_ == nullptr;
}
-void XdsCertificateProvider::UpdateRootCertNameAndDistributor(
- absl::string_view root_cert_name,
- RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor) {
- MutexLock lock(&mu_);
+void XdsCertificateProvider::ClusterCertificateState::
+ UpdateRootCertNameAndDistributor(
+ const std::string& cert_name, absl::string_view root_cert_name,
+ RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor) {
if (root_cert_name_ == root_cert_name &&
root_cert_distributor_ == root_cert_distributor) {
return;
root_cert_distributor_->CancelTlsCertificatesWatch(root_cert_watcher_);
}
if (root_cert_distributor != nullptr) {
- UpdateRootCertWatcher(root_cert_distributor.get());
+ UpdateRootCertWatcher(cert_name, root_cert_distributor.get());
} else {
root_cert_watcher_ = nullptr;
- distributor_->SetErrorForCert(
+ xds_certificate_provider_->distributor_->SetErrorForCert(
"",
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"No certificate provider available for root certificates"),
root_cert_distributor_ = std::move(root_cert_distributor);
}
-void XdsCertificateProvider::UpdateIdentityCertNameAndDistributor(
- absl::string_view identity_cert_name,
- RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor) {
- MutexLock lock(&mu_);
+void XdsCertificateProvider::ClusterCertificateState::
+ UpdateIdentityCertNameAndDistributor(
+ const std::string& cert_name, absl::string_view identity_cert_name,
+ RefCountedPtr<grpc_tls_certificate_distributor>
+ identity_cert_distributor) {
if (identity_cert_name_ == identity_cert_name &&
identity_cert_distributor_ == identity_cert_distributor) {
return;
identity_cert_watcher_);
}
if (identity_cert_distributor != nullptr) {
- UpdateIdentityCertWatcher(identity_cert_distributor.get());
+ UpdateIdentityCertWatcher(cert_name, identity_cert_distributor.get());
} else {
identity_cert_watcher_ = nullptr;
- distributor_->SetErrorForCert(
+ xds_certificate_provider_->distributor_->SetErrorForCert(
"", absl::nullopt,
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"No certificate provider available for identity certificates"));
identity_cert_distributor_ = std::move(identity_cert_distributor);
}
-void XdsCertificateProvider::UpdateSubjectAlternativeNameMatchers(
- std::vector<XdsApi::StringMatcher> matchers) {
- MutexLock lock(&san_matchers_mu_);
- san_matchers_ = std::move(matchers);
+void XdsCertificateProvider::ClusterCertificateState::UpdateRootCertWatcher(
+ const std::string& cert_name,
+ grpc_tls_certificate_distributor* root_cert_distributor) {
+ auto watcher = absl::make_unique<RootCertificatesWatcher>(
+ xds_certificate_provider_->distributor_, cert_name);
+ root_cert_watcher_ = watcher.get();
+ root_cert_distributor->WatchTlsCertificates(std::move(watcher),
+ root_cert_name_, absl::nullopt);
}
-void XdsCertificateProvider::WatchStatusCallback(std::string cert_name,
- bool root_being_watched,
- bool identity_being_watched) {
+void XdsCertificateProvider::ClusterCertificateState::UpdateIdentityCertWatcher(
+ const std::string& cert_name,
+ grpc_tls_certificate_distributor* identity_cert_distributor) {
+ auto watcher = absl::make_unique<IdentityCertificatesWatcher>(
+ xds_certificate_provider_->distributor_, cert_name);
+ identity_cert_watcher_ = watcher.get();
+ identity_cert_distributor->WatchTlsCertificates(
+ std::move(watcher), absl::nullopt, identity_cert_name_);
+}
+
+void XdsCertificateProvider::ClusterCertificateState::WatchStatusCallback(
+ const std::string& cert_name, bool root_being_watched,
+ bool identity_being_watched) {
// We aren't specially handling the case where root_cert_distributor is same
// as identity_cert_distributor. Always using two separate watchers
// irrespective of the fact results in a straightforward design, and using a
// single watcher does not seem to provide any benefit other than cutting down
// on the number of callbacks.
- MutexLock lock(&mu_);
- if (!cert_name.empty()) {
- grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
- absl::StrCat("Illegal certificate name: \'", cert_name,
- "\'. Should be empty.")
- .c_str());
- distributor_->SetErrorForCert(cert_name, GRPC_ERROR_REF(error),
- GRPC_ERROR_REF(error));
- GRPC_ERROR_UNREF(error);
- return;
- }
if (root_being_watched && !watching_root_certs_) {
// We need to start watching root certs.
watching_root_certs_ = true;
if (root_cert_distributor_ == nullptr) {
- distributor_->SetErrorForCert(
- "",
+ xds_certificate_provider_->distributor_->SetErrorForCert(
+ cert_name,
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"No certificate provider available for root certificates"),
absl::nullopt);
} else {
- UpdateRootCertWatcher(root_cert_distributor_.get());
+ UpdateRootCertWatcher(cert_name, root_cert_distributor_.get());
}
} else if (!root_being_watched && watching_root_certs_) {
// We need to cancel root certs watch.
if (identity_being_watched && !watching_identity_certs_) {
watching_identity_certs_ = true;
if (identity_cert_distributor_ == nullptr) {
- distributor_->SetErrorForCert(
- "", absl::nullopt,
+ xds_certificate_provider_->distributor_->SetErrorForCert(
+ cert_name, absl::nullopt,
GRPC_ERROR_CREATE_FROM_STATIC_STRING(
"No certificate provider available for identity certificates"));
} else {
- UpdateIdentityCertWatcher(identity_cert_distributor_.get());
+ UpdateIdentityCertWatcher(cert_name, identity_cert_distributor_.get());
}
} else if (!identity_being_watched && watching_identity_certs_) {
watching_identity_certs_ = false;
}
}
-void XdsCertificateProvider::UpdateRootCertWatcher(
- grpc_tls_certificate_distributor* root_cert_distributor) {
- auto watcher = absl::make_unique<RootCertificatesWatcher>(distributor());
- root_cert_watcher_ = watcher.get();
- root_cert_distributor->WatchTlsCertificates(std::move(watcher),
- root_cert_name_, absl::nullopt);
+//
+// XdsCertificateProvider
+//
+
+XdsCertificateProvider::XdsCertificateProvider()
+ : distributor_(MakeRefCounted<grpc_tls_certificate_distributor>()) {
+ distributor_->SetWatchStatusCallback(
+ absl::bind_front(&XdsCertificateProvider::WatchStatusCallback, this));
}
-void XdsCertificateProvider::UpdateIdentityCertWatcher(
- grpc_tls_certificate_distributor* identity_cert_distributor) {
- auto watcher = absl::make_unique<IdentityCertificatesWatcher>(distributor());
- identity_cert_watcher_ = watcher.get();
- identity_cert_distributor->WatchTlsCertificates(
- std::move(watcher), absl::nullopt, identity_cert_name_);
+XdsCertificateProvider::~XdsCertificateProvider() {
+ distributor_->SetWatchStatusCallback(nullptr);
+}
+
+bool XdsCertificateProvider::ProvidesRootCerts(const std::string& cert_name) {
+ MutexLock lock(&mu_);
+ auto it = certificate_state_map_.find(cert_name);
+ if (it == certificate_state_map_.end()) return false;
+ return it->second->ProvidesRootCerts();
+}
+
+void XdsCertificateProvider::UpdateRootCertNameAndDistributor(
+ const std::string& cert_name, absl::string_view root_cert_name,
+ RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor) {
+ MutexLock lock(&mu_);
+ auto it = certificate_state_map_.find(cert_name);
+ if (it == certificate_state_map_.end()) {
+ it = certificate_state_map_
+ .emplace(cert_name,
+ absl::make_unique<ClusterCertificateState>(this))
+ .first;
+ }
+ it->second->UpdateRootCertNameAndDistributor(cert_name, root_cert_name,
+ root_cert_distributor);
+ // Delete unused entries.
+ if (it->second->IsSafeToRemove()) certificate_state_map_.erase(it);
+}
+
+bool XdsCertificateProvider::ProvidesIdentityCerts(
+ const std::string& cert_name) {
+ MutexLock lock(&mu_);
+ auto it = certificate_state_map_.find(cert_name);
+ if (it == certificate_state_map_.end()) return false;
+ return it->second->ProvidesIdentityCerts();
+}
+
+void XdsCertificateProvider::UpdateIdentityCertNameAndDistributor(
+ const std::string& cert_name, absl::string_view identity_cert_name,
+ RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor) {
+ MutexLock lock(&mu_);
+ auto it = certificate_state_map_.find(cert_name);
+ if (it == certificate_state_map_.end()) {
+ it = certificate_state_map_
+ .emplace(cert_name,
+ absl::make_unique<ClusterCertificateState>(this))
+ .first;
+ }
+ it->second->UpdateIdentityCertNameAndDistributor(
+ cert_name, identity_cert_name, identity_cert_distributor);
+ // Delete unused entries.
+ if (it->second->IsSafeToRemove()) certificate_state_map_.erase(it);
+}
+
+bool XdsCertificateProvider::GetRequireClientCertificate(
+ const std::string& cert_name) {
+ MutexLock lock(&mu_);
+ auto it = certificate_state_map_.find(cert_name);
+ if (it == certificate_state_map_.end()) return false;
+ return it->second->require_client_certificate();
+}
+
+void XdsCertificateProvider::UpdateRequireClientCertificate(
+ const std::string& cert_name, bool require_client_certificate) {
+ MutexLock lock(&mu_);
+ auto it = certificate_state_map_.find(cert_name);
+ if (it == certificate_state_map_.end()) return;
+ it->second->set_require_client_certificate(require_client_certificate);
+}
+
+std::vector<StringMatcher> XdsCertificateProvider::GetSanMatchers(
+ const std::string& cluster) {
+ MutexLock lock(&san_matchers_mu_);
+ auto it = san_matcher_map_.find(cluster);
+ if (it == san_matcher_map_.end()) return {};
+ return it->second;
+}
+
+void XdsCertificateProvider::UpdateSubjectAlternativeNameMatchers(
+ const std::string& cluster, std::vector<StringMatcher> matchers) {
+ MutexLock lock(&san_matchers_mu_);
+ if (matchers.empty()) {
+ san_matcher_map_.erase(cluster);
+ } else {
+ san_matcher_map_[cluster] = std::move(matchers);
+ }
+}
+
+void XdsCertificateProvider::WatchStatusCallback(std::string cert_name,
+ bool root_being_watched,
+ bool identity_being_watched) {
+ MutexLock lock(&mu_);
+ auto it = certificate_state_map_.find(cert_name);
+ if (it == certificate_state_map_.end()) {
+ it = certificate_state_map_
+ .emplace(cert_name,
+ absl::make_unique<ClusterCertificateState>(this))
+ .first;
+ }
+ it->second->WatchStatusCallback(cert_name, root_being_watched,
+ identity_being_watched);
+ // Delete unused entries.
+ if (it->second->IsSafeToRemove()) certificate_state_map_.erase(it);
}
namespace {
class XdsCertificateProvider : public grpc_tls_certificate_provider {
public:
- XdsCertificateProvider(
- absl::string_view root_cert_name,
- RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor,
- absl::string_view identity_cert_name,
- RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor,
- std::vector<XdsApi::StringMatcher> san_matchers);
-
+ XdsCertificateProvider();
~XdsCertificateProvider() override;
- void UpdateRootCertNameAndDistributor(
- absl::string_view root_cert_name,
- RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor);
- void UpdateIdentityCertNameAndDistributor(
- absl::string_view identity_cert_name,
- RefCountedPtr<grpc_tls_certificate_distributor>
- identity_cert_distributor);
- void UpdateSubjectAlternativeNameMatchers(
- std::vector<XdsApi::StringMatcher> matchers);
-
grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor()
const override {
return distributor_;
}
- bool ProvidesRootCerts() {
- MutexLock lock(&mu_);
- return root_cert_distributor_ != nullptr;
- }
+ bool ProvidesRootCerts(const std::string& cert_name);
+ void UpdateRootCertNameAndDistributor(
+ const std::string& cert_name, absl::string_view root_cert_name,
+ RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor);
- bool ProvidesIdentityCerts() {
- MutexLock lock(&mu_);
- return identity_cert_distributor_ != nullptr;
- }
+ bool ProvidesIdentityCerts(const std::string& cert_name);
+ void UpdateIdentityCertNameAndDistributor(
+ const std::string& cert_name, absl::string_view identity_cert_name,
+ RefCountedPtr<grpc_tls_certificate_distributor>
+ identity_cert_distributor);
- std::vector<XdsApi::StringMatcher> subject_alternative_name_matchers() {
- MutexLock lock(&san_matchers_mu_);
- return san_matchers_;
- }
+ bool GetRequireClientCertificate(const std::string& cert_name);
+ // Updating \a require_client_certificate for a non-existing \a cert_name has
+ // no effect.
+ void UpdateRequireClientCertificate(const std::string& cert_name,
+ bool require_client_certificate);
+
+ std::vector<StringMatcher> GetSanMatchers(const std::string& cluster);
+ void UpdateSubjectAlternativeNameMatchers(
+ const std::string& cluster, std::vector<StringMatcher> matchers);
grpc_arg MakeChannelArg() const;
const grpc_channel_args* args);
private:
+ class ClusterCertificateState {
+ public:
+ explicit ClusterCertificateState(
+ XdsCertificateProvider* xds_certificate_provider)
+ : xds_certificate_provider_(xds_certificate_provider) {}
+
+ ~ClusterCertificateState();
+
+ // Returns true if the certs aren't being watched and there are no
+ // distributors configured.
+ bool IsSafeToRemove() const;
+
+ bool ProvidesRootCerts() const { return root_cert_distributor_ != nullptr; }
+ bool ProvidesIdentityCerts() const {
+ return identity_cert_distributor_ != nullptr;
+ }
+
+ void UpdateRootCertNameAndDistributor(
+ const std::string& cert_name, absl::string_view root_cert_name,
+ RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor);
+ void UpdateIdentityCertNameAndDistributor(
+ const std::string& cert_name, absl::string_view identity_cert_name,
+ RefCountedPtr<grpc_tls_certificate_distributor>
+ identity_cert_distributor);
+
+ void UpdateRootCertWatcher(
+ const std::string& cert_name,
+ grpc_tls_certificate_distributor* root_cert_distributor);
+ void UpdateIdentityCertWatcher(
+ const std::string& cert_name,
+ grpc_tls_certificate_distributor* identity_cert_distributor);
+
+ bool require_client_certificate() const {
+ return require_client_certificate_;
+ }
+ void set_require_client_certificate(bool require_client_certificate) {
+ require_client_certificate_ = require_client_certificate;
+ }
+
+ void WatchStatusCallback(const std::string& cert_name,
+ bool root_being_watched,
+ bool identity_being_watched);
+
+ private:
+ XdsCertificateProvider* xds_certificate_provider_;
+ bool watching_root_certs_ = false;
+ bool watching_identity_certs_ = false;
+ std::string root_cert_name_;
+ std::string identity_cert_name_;
+ RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor_;
+ RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor_;
+ grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
+ root_cert_watcher_ = nullptr;
+ grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
+ identity_cert_watcher_ = nullptr;
+ bool require_client_certificate_ = false;
+ };
+
void WatchStatusCallback(std::string cert_name, bool root_being_watched,
bool identity_being_watched);
- void UpdateRootCertWatcher(
- grpc_tls_certificate_distributor* root_cert_distributor);
- void UpdateIdentityCertWatcher(
- grpc_tls_certificate_distributor* identity_cert_distributor);
Mutex mu_;
+ std::map<std::string /*cert_name*/, std::unique_ptr<ClusterCertificateState>>
+ certificate_state_map_;
+
// Use a separate mutex for san_matchers_ to avoid deadlocks since
// san_matchers_ needs to be accessed when a handshake is being done and we
// run into a possible deadlock scenario if using the same mutex. The mutex
// -> HandshakeManager::Add() -> SecurityHandshaker::DoHandshake() ->
// subject_alternative_names_matchers()
Mutex san_matchers_mu_;
- bool watching_root_certs_ = false;
- bool watching_identity_certs_ = false;
- std::string root_cert_name_;
- std::string identity_cert_name_;
- RefCountedPtr<grpc_tls_certificate_distributor> root_cert_distributor_;
- RefCountedPtr<grpc_tls_certificate_distributor> identity_cert_distributor_;
- std::vector<XdsApi::StringMatcher> san_matchers_;
+ std::map<std::string /*cluster_name*/, std::vector<StringMatcher>>
+ san_matcher_map_;
+
RefCountedPtr<grpc_tls_certificate_distributor> distributor_;
- grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
- root_cert_watcher_ = nullptr;
- grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
- identity_cert_watcher_ = nullptr;
};
} // namespace grpc_core
Mutex* g_mu = nullptr;
const grpc_channel_args* g_channel_args = nullptr;
XdsClient* g_xds_client = nullptr;
+char* g_fallback_bootstrap_config = nullptr;
} // namespace
auto& state = lds_state.subscribed_resources[listener_name];
if (state != nullptr) state->Finish();
if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) {
- gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: route_config_name=%s",
- xds_client(), listener_name.c_str(),
- (!lds_update.route_config_name.empty()
- ? lds_update.route_config_name.c_str()
- : "<inlined>"));
- if (lds_update.rds_update.has_value()) {
- gpr_log(GPR_INFO, "RouteConfiguration: %s",
- lds_update.rds_update->ToString().c_str());
- }
+ gpr_log(GPR_INFO, "[xds_client %p] LDS resource %s: %s", xds_client(),
+ listener_name.c_str(), lds_update.ToString().c_str());
}
// Record the RDS resource names seen.
if (!lds_update.route_config_name.empty()) {
: nullptr),
request_timeout_(GetRequestTimeout()),
interested_parties_(grpc_pollset_set_create()),
- bootstrap_(
- XdsBootstrap::ReadFromFile(this, &grpc_xds_client_trace, error)),
+ bootstrap_(XdsBootstrap::Create(this, &grpc_xds_client_trace,
+ g_fallback_bootstrap_config, error)),
certificate_provider_store_(MakeOrphanable<CertificateProviderStore>(
bootstrap_ == nullptr
? CertificateProviderStore::PluginDefinitionMap()
void XdsClientGlobalShutdown() {
delete g_mu;
g_mu = nullptr;
+ gpr_free(g_fallback_bootstrap_config);
+ g_fallback_bootstrap_config = nullptr;
}
RefCountedPtr<XdsClient> XdsClient::GetOrCreate(grpc_error** error) {
g_xds_client = nullptr;
}
+void SetXdsFallbackBootstrapConfig(const char* config) {
+ MutexLock lock(g_mu);
+ gpr_free(g_fallback_bootstrap_config);
+ g_fallback_bootstrap_config = gpr_strdup(config);
+}
+
} // namespace internal
} // namespace grpc_core
namespace internal {
void SetXdsChannelArgsForTest(grpc_channel_args* args);
void UnsetGlobalXdsClientForTest();
+// Sets bootstrap config to be used when no env var is set.
+// Does not take ownership of config.
+void SetXdsFallbackBootstrapConfig(const char* config);
} // namespace internal
} // namespace grpc_core
// not related to a single reporting interval.
total_requests_in_progress_.Load(MemoryOrder::RELAXED),
GetAndResetCounter(&total_error_requests_),
- GetAndResetCounter(&total_issued_requests_)};
+ GetAndResetCounter(&total_issued_requests_),
+ {}};
MutexLock lock(&backend_metrics_mu_);
snapshot.backend_metrics = std::move(backend_metrics_);
return snapshot;
#include <grpc/support/port_platform.h>
+#include "src/core/ext/xds/xds_certificate_provider.h"
#include "src/core/ext/xds/xds_client.h"
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/security/credentials/xds/xds_credentials.h"
#include "src/core/lib/surface/api_trace.h"
#include "src/core/lib/surface/server.h"
namespace grpc_core {
+
+TraceFlag grpc_xds_server_config_fetcher_trace(false,
+ "xds_server_config_fetcher");
+
namespace {
class XdsServerConfigFetcher : public grpc_server_config_fetcher {
GPR_ASSERT(xds_client_ != nullptr);
}
- void StartWatch(std::string listening_address,
+ void StartWatch(std::string listening_address, grpc_channel_args* args,
std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
watcher) override {
grpc_server_config_fetcher::WatcherInterface* watcher_ptr = watcher.get();
- auto listener_watcher =
- absl::make_unique<ListenerWatcher>(std::move(watcher));
+ auto listener_watcher = absl::make_unique<ListenerWatcher>(
+ std::move(watcher), args, xds_client_);
auto* listener_watcher_ptr = listener_watcher.get();
// TODO(yashykt): Get the resource name id from bootstrap
- xds_client_->WatchListenerData(
- absl::StrCat("grpc/server?xds.resource.listening_address=",
- listening_address),
- std::move(listener_watcher));
+ listening_address = absl::StrCat(
+ "grpc/server?xds.resource.listening_address=", listening_address);
+ xds_client_->WatchListenerData(listening_address,
+ std::move(listener_watcher));
MutexLock lock(&mu_);
auto& watcher_state = watchers_[watcher_ptr];
watcher_state.listening_address = listening_address;
public:
explicit ListenerWatcher(
std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
- server_config_watcher)
- : server_config_watcher_(std::move(server_config_watcher)) {}
+ server_config_watcher,
+ grpc_channel_args* args, RefCountedPtr<XdsClient> xds_client)
+ : server_config_watcher_(std::move(server_config_watcher)),
+ args_(args),
+ xds_client_(std::move(xds_client)) {}
+
+ ~ListenerWatcher() override { grpc_channel_args_destroy(args_); }
+
+ // Deleted due to special handling required for args_. Copy the channel args
+ // if we ever need these.
+ ListenerWatcher(const ListenerWatcher&) = delete;
+ ListenerWatcher& operator=(const ListenerWatcher&) = delete;
void OnListenerChanged(XdsApi::LdsUpdate listener) override {
- // TODO(yashykt): Construct channel args according to received update
- server_config_watcher_->UpdateConfig(nullptr);
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_server_config_fetcher_trace)) {
+ gpr_log(
+ GPR_INFO,
+ "[ListenerWatcher %p] Received LDS update from xds client %p: %s",
+ this, xds_client_.get(), listener.ToString().c_str());
+ }
+ grpc_error* error = GRPC_ERROR_NONE;
+ bool update_needed = UpdateXdsCertificateProvider(listener, &error);
+ if (error != GRPC_ERROR_NONE) {
+ OnError(error);
+ return;
+ }
+ // Only send an update, if something changed.
+ if (updated_once_ && !update_needed) {
+ return;
+ }
+ updated_once_ = true;
+ grpc_channel_args* updated_args = nullptr;
+ if (xds_certificate_provider_ != nullptr) {
+ grpc_arg arg_to_add = xds_certificate_provider_->MakeChannelArg();
+ updated_args = grpc_channel_args_copy_and_add(args_, &arg_to_add, 1);
+ } else {
+ updated_args = grpc_channel_args_copy(args_);
+ }
+ server_config_watcher_->UpdateConfig(updated_args);
}
void OnError(grpc_error* error) override {
}
private:
+ // Returns true if the xds certificate provider changed in a way that
+ // required a new security connector to be created, false otherwise.
+ bool UpdateXdsCertificateProvider(const XdsApi::LdsUpdate& listener,
+ grpc_error** error) {
+ // Early out if channel is not configured to use xDS security.
+ grpc_server_credentials* server_creds =
+ grpc_find_server_credentials_in_args(args_);
+ if (server_creds == nullptr ||
+ server_creds->type() != kCredentialsTypeXds) {
+ xds_certificate_provider_ = nullptr;
+ return false;
+ }
+ if (xds_certificate_provider_ == nullptr) {
+ xds_certificate_provider_ = MakeRefCounted<XdsCertificateProvider>();
+ }
+ // Configure root cert.
+ absl::string_view root_provider_instance_name =
+ listener.downstream_tls_context.common_tls_context
+ .combined_validation_context
+ .validation_context_certificate_provider_instance.instance_name;
+ absl::string_view root_provider_cert_name =
+ listener.downstream_tls_context.common_tls_context
+ .combined_validation_context
+ .validation_context_certificate_provider_instance
+ .certificate_name;
+ RefCountedPtr<grpc_tls_certificate_provider> new_root_provider;
+ if (!root_provider_instance_name.empty()) {
+ new_root_provider =
+ xds_client_->certificate_provider_store()
+ .CreateOrGetCertificateProvider(root_provider_instance_name);
+ if (new_root_provider == nullptr) {
+ *error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("Certificate provider instance name: \"",
+ root_provider_instance_name, "\" not recognized.")
+ .c_str());
+ return false;
+ }
+ }
+ // Configure identity cert.
+ absl::string_view identity_provider_instance_name =
+ listener.downstream_tls_context.common_tls_context
+ .tls_certificate_certificate_provider_instance.instance_name;
+ absl::string_view identity_provider_cert_name =
+ listener.downstream_tls_context.common_tls_context
+ .tls_certificate_certificate_provider_instance.certificate_name;
+ RefCountedPtr<grpc_tls_certificate_provider> new_identity_provider;
+ if (!identity_provider_instance_name.empty()) {
+ new_identity_provider = xds_client_->certificate_provider_store()
+ .CreateOrGetCertificateProvider(
+ identity_provider_instance_name);
+ if (new_identity_provider == nullptr) {
+ *error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(
+ absl::StrCat("Certificate provider instance name: \"",
+ identity_provider_instance_name,
+ "\" not recognized.")
+ .c_str());
+ return false;
+ }
+ }
+ bool security_connector_update_required = false;
+ if (((new_root_provider == nullptr) !=
+ (root_certificate_provider_ == nullptr)) ||
+ ((new_identity_provider == nullptr) !=
+ (identity_certificate_provider_ == nullptr)) ||
+ (listener.downstream_tls_context.require_client_certificate !=
+ xds_certificate_provider_->GetRequireClientCertificate(""))) {
+ security_connector_update_required = true;
+ }
+ if (root_certificate_provider_ != new_root_provider) {
+ root_certificate_provider_ = std::move(new_root_provider);
+ }
+ if (identity_certificate_provider_ != new_identity_provider) {
+ identity_certificate_provider_ = std::move(new_identity_provider);
+ }
+ xds_certificate_provider_->UpdateRootCertNameAndDistributor(
+ "", root_provider_cert_name,
+ root_certificate_provider_ == nullptr
+ ? nullptr
+ : root_certificate_provider_->distributor());
+ xds_certificate_provider_->UpdateIdentityCertNameAndDistributor(
+ "", identity_provider_cert_name,
+ identity_certificate_provider_ == nullptr
+ ? nullptr
+ : identity_certificate_provider_->distributor());
+ xds_certificate_provider_->UpdateRequireClientCertificate(
+ "", listener.downstream_tls_context.require_client_certificate);
+ return security_connector_update_required;
+ }
+
std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
server_config_watcher_;
+ grpc_channel_args* args_;
+ RefCountedPtr<XdsClient> xds_client_;
+ RefCountedPtr<grpc_tls_certificate_provider> root_certificate_provider_;
+ RefCountedPtr<grpc_tls_certificate_provider> identity_certificate_provider_;
+ RefCountedPtr<XdsCertificateProvider> xds_certificate_provider_;
+ bool updated_once_ = false;
};
struct WatcherState {
if (error != GRPC_ERROR_NONE) {
gpr_log(GPR_ERROR, "Failed to create xds client: %s",
grpc_error_string(error));
+ GRPC_ERROR_UNREF(error);
return nullptr;
}
return new grpc_core::XdsServerConfigFetcher(std::move(xds_client));
} // namespace
-HandshakeManager::HandshakeManager() { gpr_mu_init(&mu_); }
+HandshakeManager::HandshakeManager() {}
/// Add \a mgr to the server side list of all pending handshake managers, the
/// list starts with \a *head.
handshakers_.push_back(std::move(handshaker));
}
-HandshakeManager::~HandshakeManager() {
- handshakers_.clear();
- gpr_mu_destroy(&mu_);
-}
+HandshakeManager::~HandshakeManager() { handshakers_.clear(); }
void HandshakeManager::Shutdown(grpc_error* why) {
{
static const size_t HANDSHAKERS_INIT_SIZE = 2;
- gpr_mu mu_;
+ Mutex mu_;
bool is_shutdown_ = false;
// An array of handshakers added via grpc_handshake_manager_add().
absl::InlinedVector<RefCountedPtr<Handshaker>, HANDSHAKERS_INIT_SIZE>
#include <stdio.h>
#include <string.h>
-GPR_GLOBAL_CONFIG_DEFINE_STRING(grpc_verbosity, "ERROR",
+#ifndef GPR_DEFAULT_LOG_VERBOSITY_STRING
+#define GPR_DEFAULT_LOG_VERBOSITY_STRING "ERROR"
+#endif // !GPR_DEFAULT_LOG_VERBOSITY_STRING
+
+GPR_GLOBAL_CONFIG_DEFINE_STRING(grpc_verbosity,
+ GPR_DEFAULT_LOG_VERBOSITY_STRING,
"Default gRPC logging verbosity")
GPR_GLOBAL_CONFIG_DEFINE_STRING(grpc_stacktrace_minloglevel, "",
"Messages logged at the same or higher level "
LockedMultiProducerSingleConsumerQueue::Node*
LockedMultiProducerSingleConsumerQueue::TryPop() {
- if (gpr_mu_trylock(mu_.get())) {
+ if (mu_.TryLock()) {
Node* node = queue_.Pop();
- gpr_mu_unlock(mu_.get());
+ mu_.Unlock();
return node;
}
return nullptr;
template <typename T>
class Delete<T, false> {
public:
- explicit Delete(T* t) {}
+ explicit Delete(T* /*t*/) {}
};
} // namespace internal
#include <grpc/support/sync.h>
#include <grpc/support/time.h>
+#include "absl/synchronization/mutex.h"
+#include "src/core/lib/gprpp/time_util.h"
+
// The core library is not accessible in C++ codegen headers, and vice versa.
// Thus, we need to have duplicate headers with similar functionality.
// Make sure any change to this file is also reflected in
namespace grpc_core {
-class Mutex {
+#ifdef GPR_ABSEIL_SYNC
+
+using Mutex = absl::Mutex;
+using MutexLock = absl::MutexLock;
+using ReleasableMutexLock = absl::ReleasableMutexLock;
+using CondVar = absl::CondVar;
+
+// Returns the underlying gpr_mu from Mutex. This should be used only when
+// it has to like passing the C++ mutex to C-core API.
+// TODO(veblush): Remove this after C-core no longer uses gpr_mu.
+inline gpr_mu* GetUnderlyingGprMu(Mutex* mutex) {
+ return reinterpret_cast<gpr_mu*>(mutex);
+}
+
+#else
+
+class ABSL_LOCKABLE Mutex {
public:
Mutex() { gpr_mu_init(&mu_); }
~Mutex() { gpr_mu_destroy(&mu_); }
Mutex(const Mutex&) = delete;
Mutex& operator=(const Mutex&) = delete;
- gpr_mu* get() { return &mu_; }
- const gpr_mu* get() const { return &mu_; }
+ void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION() { gpr_mu_lock(&mu_); }
+ void Unlock() ABSL_UNLOCK_FUNCTION() { gpr_mu_unlock(&mu_); }
+ bool TryLock() ABSL_EXCLUSIVE_TRYLOCK_FUNCTION(true) {
+ return gpr_mu_trylock(&mu_) != 0;
+ }
private:
gpr_mu mu_;
+
+ friend class CondVar;
+ friend gpr_mu* GetUnderlyingGprMu(Mutex* mutex);
};
-// MutexLock is a std::
-class MutexLock {
+// Returns the underlying gpr_mu from Mutex. This should be used only when
+// it has to like passing the C++ mutex to C-core API.
+// TODO(veblush): Remove this after C-core no longer uses gpr_mu.
+inline gpr_mu* GetUnderlyingGprMu(Mutex* mutex) { return &mutex->mu_; }
+
+class ABSL_SCOPED_LOCKABLE MutexLock {
public:
- explicit MutexLock(Mutex* mu) : mu_(mu->get()) { gpr_mu_lock(mu_); }
- explicit MutexLock(gpr_mu* mu) : mu_(mu) { gpr_mu_lock(mu_); }
- ~MutexLock() { gpr_mu_unlock(mu_); }
+ explicit MutexLock(Mutex* mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) : mu_(mu) {
+ mu_->Lock();
+ }
+ ~MutexLock() ABSL_UNLOCK_FUNCTION() { mu_->Unlock(); }
MutexLock(const MutexLock&) = delete;
MutexLock& operator=(const MutexLock&) = delete;
private:
- gpr_mu* const mu_;
+ Mutex* const mu_;
};
-class ReleasableMutexLock {
+class ABSL_SCOPED_LOCKABLE ReleasableMutexLock {
public:
- explicit ReleasableMutexLock(Mutex* mu) : mu_(mu->get()) { gpr_mu_lock(mu_); }
- explicit ReleasableMutexLock(gpr_mu* mu) : mu_(mu) { gpr_mu_lock(mu_); }
- ~ReleasableMutexLock() {
- if (!released_) gpr_mu_unlock(mu_);
+ explicit ReleasableMutexLock(Mutex* mu) ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
+ : mu_(mu) {
+ mu_->Lock();
+ }
+ ~ReleasableMutexLock() ABSL_UNLOCK_FUNCTION() {
+ if (!released_) mu_->Unlock();
}
ReleasableMutexLock(const ReleasableMutexLock&) = delete;
ReleasableMutexLock& operator=(const ReleasableMutexLock&) = delete;
- void Lock() {
- GPR_DEBUG_ASSERT(released_);
- gpr_mu_lock(mu_);
- released_ = false;
- }
-
- void Unlock() {
+ void Release() ABSL_UNLOCK_FUNCTION() {
GPR_DEBUG_ASSERT(!released_);
released_ = true;
- gpr_mu_unlock(mu_);
+ mu_->Unlock();
}
private:
- gpr_mu* const mu_;
+ Mutex* const mu_;
bool released_ = false;
};
CondVar& operator=(const CondVar&) = delete;
void Signal() { gpr_cv_signal(&cv_); }
- void Broadcast() { gpr_cv_broadcast(&cv_); }
+ void SignalAll() { gpr_cv_broadcast(&cv_); }
+
+ void Wait(Mutex* mu) { WaitWithDeadline(mu, absl::InfiniteFuture()); }
+ bool WaitWithTimeout(Mutex* mu, absl::Duration timeout) {
+ return gpr_cv_wait(&cv_, &mu->mu_, ToGprTimeSpec(timeout)) != 0;
+ }
+ bool WaitWithDeadline(Mutex* mu, absl::Time deadline) {
+ return gpr_cv_wait(&cv_, &mu->mu_, ToGprTimeSpec(deadline)) != 0;
+ }
+
+ private:
+ gpr_cv cv_;
+};
+
+#endif // GPR_ABSEIL_SYNC
+
+template <typename Predicate>
+static void WaitUntil(CondVar* cv, Mutex* mu, Predicate pred) {
+ while (!pred()) {
+ cv->Wait(mu);
+ }
+}
+
+// Returns true iff we timed-out
+template <typename Predicate>
+static bool WaitUntilWithTimeout(CondVar* cv, Mutex* mu, Predicate pred,
+ absl::Duration timeout) {
+ while (!pred()) {
+ if (cv->WaitWithTimeout(mu, timeout)) return true;
+ }
+ return false;
+}
+
+// Returns true iff we timed-out
+template <typename Predicate>
+static bool WaitUntilWithDeadline(CondVar* cv, Mutex* mu, Predicate pred,
+ absl::Time deadline) {
+ while (!pred()) {
+ if (cv->WaitWithDeadline(mu, deadline)) return true;
+ }
+ return false;
+}
+
+// Deprecated. Prefer MutexLock
+class MutexLockForGprMu {
+ public:
+ explicit MutexLockForGprMu(gpr_mu* mu) : mu_(mu) { gpr_mu_lock(mu_); }
+ ~MutexLockForGprMu() { gpr_mu_unlock(mu_); }
+
+ MutexLockForGprMu(const MutexLock&) = delete;
+ MutexLockForGprMu& operator=(const MutexLock&) = delete;
+
+ private:
+ gpr_mu* const mu_;
+};
- int Wait(Mutex* mu) { return Wait(mu, gpr_inf_future(GPR_CLOCK_REALTIME)); }
- int Wait(Mutex* mu, const gpr_timespec& deadline) {
- return gpr_cv_wait(&cv_, mu->get(), deadline);
+// Deprecated. Prefer MutexLock or ReleasableMutexLock
+class ABSL_SCOPED_LOCKABLE LockableAndReleasableMutexLock {
+ public:
+ explicit LockableAndReleasableMutexLock(Mutex* mu)
+ ABSL_EXCLUSIVE_LOCK_FUNCTION(mu)
+ : mu_(mu) {
+ mu_->Lock();
}
+ ~LockableAndReleasableMutexLock() ABSL_UNLOCK_FUNCTION() {
+ if (!released_) mu_->Unlock();
+ }
+
+ LockableAndReleasableMutexLock(const LockableAndReleasableMutexLock&) =
+ delete;
+ LockableAndReleasableMutexLock& operator=(
+ const LockableAndReleasableMutexLock&) = delete;
- template <typename Predicate>
- void WaitUntil(Mutex* mu, Predicate pred) {
- while (!pred()) {
- Wait(mu, gpr_inf_future(GPR_CLOCK_REALTIME));
- }
+ void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION() {
+ GPR_DEBUG_ASSERT(released_);
+ mu_->Lock();
+ released_ = false;
}
- // Returns true iff we timed-out
- template <typename Predicate>
- bool WaitUntil(Mutex* mu, Predicate pred, const gpr_timespec& deadline) {
- while (!pred()) {
- if (Wait(mu, deadline)) return true;
- }
- return false;
+ void Release() ABSL_UNLOCK_FUNCTION() {
+ GPR_DEBUG_ASSERT(!released_);
+ released_ = true;
+ mu_->Unlock();
}
private:
- gpr_cv cv_;
+ Mutex* const mu_;
+ bool released_ = false;
};
} // namespace grpc_core
--- /dev/null
+//
+// Copyright 2021 the 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.
+//
+
+#include <grpc/support/port_platform.h>
+
+#include <grpc/support/log.h>
+
+#include "src/core/lib/gprpp/time_util.h"
+
+namespace grpc_core {
+
+gpr_timespec ToGprTimeSpec(absl::Duration duration) {
+ if (duration == absl::InfiniteDuration()) {
+ return gpr_inf_future(GPR_TIMESPAN);
+ } else if (duration == -absl::InfiniteDuration()) {
+ return gpr_inf_past(GPR_TIMESPAN);
+ } else {
+ int64_t s = absl::IDivDuration(duration, absl::Seconds(1), &duration);
+ int64_t n = absl::IDivDuration(duration, absl::Nanoseconds(1), &duration);
+ return gpr_time_add(gpr_time_from_seconds(s, GPR_TIMESPAN),
+ gpr_time_from_nanos(n, GPR_TIMESPAN));
+ }
+}
+
+gpr_timespec ToGprTimeSpec(absl::Time time) {
+ if (time == absl::InfiniteFuture()) {
+ return gpr_inf_future(GPR_CLOCK_REALTIME);
+ } else if (time == absl::InfinitePast()) {
+ return gpr_inf_past(GPR_CLOCK_REALTIME);
+ } else {
+ timespec ts = absl::ToTimespec(time);
+ gpr_timespec out;
+ out.tv_sec = static_cast<decltype(out.tv_sec)>(ts.tv_sec);
+ out.tv_nsec = static_cast<decltype(out.tv_nsec)>(ts.tv_nsec);
+ out.clock_type = GPR_CLOCK_REALTIME;
+ return out;
+ }
+}
+
+absl::Duration ToAbslDuration(gpr_timespec ts) {
+ GPR_ASSERT(ts.clock_type == GPR_TIMESPAN);
+ if (gpr_time_cmp(ts, gpr_inf_future(GPR_TIMESPAN)) == 0) {
+ return absl::InfiniteDuration();
+ } else if (gpr_time_cmp(ts, gpr_inf_past(GPR_TIMESPAN)) == 0) {
+ return -absl::InfiniteDuration();
+ } else {
+ return absl::Seconds(ts.tv_sec) + absl::Nanoseconds(ts.tv_nsec);
+ }
+}
+
+absl::Time ToAbslTime(gpr_timespec ts) {
+ GPR_ASSERT(ts.clock_type != GPR_TIMESPAN);
+ gpr_timespec rts = gpr_convert_clock_type(ts, GPR_CLOCK_REALTIME);
+ if (gpr_time_cmp(rts, gpr_inf_future(GPR_CLOCK_REALTIME)) == 0) {
+ return absl::InfiniteFuture();
+ } else if (gpr_time_cmp(rts, gpr_inf_past(GPR_CLOCK_REALTIME)) == 0) {
+ return absl::InfinitePast();
+ } else {
+ return absl::UnixEpoch() + absl::Seconds(rts.tv_sec) +
+ absl::Nanoseconds(rts.tv_nsec);
+ }
+}
+
+} // namespace grpc_core
--- /dev/null
+//
+// Copyright 2021 the 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.
+//
+
+#ifndef GRPC_CORE_LIB_GPRPP_TIME_UTIL_H
+#define GRPC_CORE_LIB_GPRPP_TIME_UTIL_H
+
+#include <grpc/support/port_platform.h>
+
+#include <grpc/support/time.h>
+
+#include "absl/time/time.h"
+
+namespace grpc_core {
+
+// Converts absl::Duration to gpr_timespec(GPR_TIMESPAN)
+gpr_timespec ToGprTimeSpec(absl::Duration duration);
+
+// Converts absl::Time to gpr_timespec(GPR_CLOCK_REALTIME)
+gpr_timespec ToGprTimeSpec(absl::Time time);
+
+// Converts gpr_timespec(GPR_TIMESPAN) to absl::Duration
+absl::Duration ToAbslDuration(gpr_timespec ts);
+
+// Converts gpr_timespec(GPR_CLOCK_[MONOTONIC|REALTIME|PRECISE]) to absl::Time
+absl::Time ToAbslTime(gpr_timespec ts);
+
+} // namespace grpc_core
+
+#endif // GRPC_CORE_LIB_GPRPP_TIME_UTIL_H
grpc_channel_args args = {1, &channel_arg};
c->handshake_mgr = grpc_core::MakeRefCounted<grpc_core::HandshakeManager>();
grpc_core::HandshakerRegistry::AddHandshakers(
- grpc_core::HANDSHAKER_CLIENT, &args, /*interested_parties=*/nullptr,
- c->handshake_mgr.get());
+ grpc_core::HANDSHAKER_CLIENT, &args,
+ /*interested_parties=*/nullptr, c->handshake_mgr.get());
c->handshake_mgr->DoHandshake(tcp, /*channel_args=*/nullptr, deadline,
/*acceptor=*/nullptr, on_handshake_done,
/*user_data=*/c);
#include <list>
+#include "absl/time/time.h"
+
#include "src/core/lib/gprpp/thd.h"
+#include "src/core/lib/gprpp/time_util.h"
#include "src/core/lib/iomgr/ev_apple.h"
grpc_core::DebugOnlyTraceFlag grpc_apple_polling_trace(false, "apple_polling");
/// Drive the run loop in a global singleton thread until the global run loop is
/// shutdown.
static void GlobalRunLoopFunc(void* arg) {
- grpc_core::ReleasableMutexLock lock(&gGlobalRunLoopContext->mu);
+ grpc_core::LockableAndReleasableMutexLock lock(&gGlobalRunLoopContext->mu);
gGlobalRunLoopContext->run_loop = CFRunLoopGetCurrent();
gGlobalRunLoopContext->init_cv.Signal();
gGlobalRunLoopContext->input_source_cv.Wait(&gGlobalRunLoopContext->mu);
}
gGlobalRunLoopContext->input_source_registered = false;
- lock.Unlock();
+ lock.Release();
CFRunLoopRun();
lock.Lock();
}
- lock.Unlock();
+ lock.Release();
}
// pollset implementation
auto it = apple_pollset->workers.begin();
while (!actual_worker.kicked && !apple_pollset->is_shutdown) {
- if (actual_worker.cv.Wait(
- &apple_pollset->mu,
- grpc_millis_to_timespec(deadline, GPR_CLOCK_REALTIME))) {
+ if (actual_worker.cv.WaitWithDeadline(
+ &apple_pollset->mu, grpc_core::ToAbslTime(grpc_millis_to_timespec(
+ deadline, GPR_CLOCK_REALTIME)))) {
// timed out
break;
}
static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) {
GRPC_POLLING_TRACE("pollset init: %p", pollset);
GrpcApplePollset* apple_pollset = new (pollset) GrpcApplePollset();
- *mu = apple_pollset->mu.get();
+ *mu = grpc_core::GetUnderlyingGprMu(&apple_pollset->mu);
}
/// The caller must acquire the lock GrpcApplePollset.mu before calling this
static bool fd_has_pollset(grpc_fd* fd, grpc_pollset* pollset) {
const int epfd = pollset->active_pollable->epfd;
- grpc_core::MutexLock lock(&fd->pollable_mu);
+ grpc_core::MutexLockForGprMu lock(&fd->pollable_mu);
for (size_t i = 0; i < fd->pollset_fds.size(); ++i) {
if (fd->pollset_fds[i] == epfd) {
return true;
static void fd_add_pollset(grpc_fd* fd, grpc_pollset* pollset) {
const int epfd = pollset->active_pollable->epfd;
- grpc_core::MutexLock lock(&fd->pollable_mu);
+ grpc_core::MutexLockForGprMu lock(&fd->pollable_mu);
fd->pollset_fds.push_back(epfd);
}
static grpc_error* kick_one_worker(grpc_pollset_worker* specific_worker) {
GPR_TIMER_SCOPE("kick_one_worker", 0);
pollable* p = specific_worker->pollable_obj;
- grpc_core::MutexLock lock(&p->mu);
+ grpc_core::MutexLockForGprMu lock(&p->mu);
GPR_ASSERT(specific_worker != nullptr);
if (specific_worker->kicked) {
if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
return;
}
- grpc_core::MutexLock lock(&pollset->mu);
+ grpc_core::MutexLockForGprMu lock(&pollset->mu);
grpc_error* error = pollset_add_fd_locked(pollset, fd);
// If we are in PO_MULTI mode, we should update the pollsets of the FD.
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/iomgr/ev_posix.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
-#include "src/core/lib/iomgr/iomgr_posix.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/tcp_client.h"
#include "src/core/lib/iomgr/tcp_posix.h"
+++ /dev/null
-/*
- *
- * Copyright 2015 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.
- *
- */
-
-#ifndef GRPC_CORE_LIB_IOMGR_IOMGR_POSIX_H
-#define GRPC_CORE_LIB_IOMGR_IOMGR_POSIX_H
-
-#include <grpc/support/port_platform.h>
-
-#include "src/core/lib/iomgr/iomgr_internal.h"
-
-#endif /* GRPC_CORE_LIB_IOMGR_IOMGR_POSIX_H */
#include "src/core/lib/iomgr/ev_apple.h"
#include "src/core/lib/iomgr/ev_posix.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
-#include "src/core/lib/iomgr/iomgr_posix.h"
#include "src/core/lib/iomgr/resolve_address.h"
#include "src/core/lib/iomgr/tcp_client.h"
#include "src/core/lib/iomgr/tcp_posix.h"
if (ip != nullptr && grpc_inet_ntop(addr->sa_family, ip, ntop_buf,
sizeof(ntop_buf)) != nullptr) {
if (sin6_scope_id != 0) {
- // Enclose sin6_scope_id with the format defined in RFC 6784 section 2.
+ // Enclose sin6_scope_id with the format defined in RFC 6874 section 2.
std::string host_with_scope =
absl::StrFormat("%s%%25%" PRIu32, ntop_buf, sin6_scope_id);
out = grpc_core::JoinHostPort(host_with_scope, port);
}
return GRPC_ERROR_NONE;
#else
+ (void)fd;
return GRPC_OS_ERROR(ENOSYS, "setsockopt(SO_ZEROCOPY)");
#endif
}
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/iomgr/ev_posix.h"
-#include "src/core/lib/iomgr/iomgr_posix.h"
+#include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/iomgr/sockaddr.h"
#include "src/core/lib/iomgr/sockaddr_utils.h"
#include "src/core/lib/iomgr/socket_mutator.h"
#else /* GRPC_LINUX_ERRQUEUE */
static TcpZerocopySendRecord* tcp_get_send_zerocopy_record(
- grpc_tcp* tcp, grpc_slice_buffer* buf) {
+ grpc_tcp* /*tcp*/, grpc_slice_buffer* /*buf*/) {
return nullptr;
}
-static void ZerocopyDisableAndWaitForRemaining(grpc_tcp* tcp) {}
+static void ZerocopyDisableAndWaitForRemaining(grpc_tcp* /*tcp*/) {}
static bool tcp_write_with_timestamps(grpc_tcp* /*tcp*/, struct msghdr* /*msg*/,
size_t /*sending_length*/,
static void UnrefMaybePutZerocopySendRecord(grpc_tcp* tcp,
TcpZerocopySendRecord* record,
- uint32_t seq,
- const char* /* tag */) {
+ uint32_t /*seq*/,
+ const char* /*tag*/) {
if (record->Unref()) {
tcp->tcp_zerocopy_send_ctx.PutSendRecord(record);
}
--- /dev/null
+// Copyright 2021 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.
+
+#include <grpc/support/port_platform.h>
+
+#include "src/core/lib/security/authorization/matchers.h"
+
+#include "absl/memory/memory.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/str_split.h"
+
+namespace grpc_core {
+
+//
+// StringMatcher
+//
+
+absl::StatusOr<StringMatcher> StringMatcher::Create(Type type,
+ const std::string& matcher,
+ bool case_sensitive) {
+ if (type == Type::SAFE_REGEX) {
+ RE2::Options options;
+ options.set_case_sensitive(case_sensitive);
+ auto regex_matcher = absl::make_unique<RE2>(matcher, options);
+ if (!regex_matcher->ok()) {
+ return absl::InvalidArgumentError(
+ "Invalid regex string specified in matcher.");
+ }
+ return StringMatcher(std::move(regex_matcher), case_sensitive);
+ } else {
+ return StringMatcher(type, matcher, case_sensitive);
+ }
+}
+
+StringMatcher::StringMatcher(Type type, const std::string& matcher,
+ bool case_sensitive)
+ : type_(type), string_matcher_(matcher), case_sensitive_(case_sensitive) {}
+
+StringMatcher::StringMatcher(std::unique_ptr<RE2> regex_matcher,
+ bool case_sensitive)
+ : type_(Type::SAFE_REGEX),
+ regex_matcher_(std::move(regex_matcher)),
+ case_sensitive_(case_sensitive) {}
+
+StringMatcher::StringMatcher(const StringMatcher& other)
+ : type_(other.type_), case_sensitive_(other.case_sensitive_) {
+ if (type_ == Type::SAFE_REGEX) {
+ RE2::Options options;
+ options.set_case_sensitive(other.case_sensitive_);
+ regex_matcher_ =
+ absl::make_unique<RE2>(other.regex_matcher_->pattern(), options);
+ } else {
+ string_matcher_ = other.string_matcher_;
+ }
+}
+
+StringMatcher& StringMatcher::operator=(const StringMatcher& other) {
+ type_ = other.type_;
+ if (type_ == Type::SAFE_REGEX) {
+ RE2::Options options;
+ options.set_case_sensitive(other.case_sensitive_);
+ regex_matcher_ =
+ absl::make_unique<RE2>(other.regex_matcher_->pattern(), options);
+ } else {
+ string_matcher_ = other.string_matcher_;
+ }
+ case_sensitive_ = other.case_sensitive_;
+ return *this;
+}
+
+StringMatcher::StringMatcher(StringMatcher&& other) noexcept
+ : type_(other.type_), case_sensitive_(other.case_sensitive_) {
+ if (type_ == Type::SAFE_REGEX) {
+ regex_matcher_ = std::move(other.regex_matcher_);
+ } else {
+ string_matcher_ = std::move(other.string_matcher_);
+ }
+}
+
+StringMatcher& StringMatcher::operator=(StringMatcher&& other) noexcept {
+ type_ = other.type_;
+ if (type_ == Type::SAFE_REGEX) {
+ regex_matcher_ = std::move(other.regex_matcher_);
+ } else {
+ string_matcher_ = std::move(other.string_matcher_);
+ }
+ case_sensitive_ = other.case_sensitive_;
+ return *this;
+}
+
+bool StringMatcher::operator==(const StringMatcher& other) const {
+ if (type_ != other.type_ || case_sensitive_ != other.case_sensitive_) {
+ return false;
+ }
+ if (type_ == Type::SAFE_REGEX) {
+ return regex_matcher_->pattern() == other.regex_matcher_->pattern();
+ } else {
+ return string_matcher_ == other.string_matcher_;
+ }
+}
+
+bool StringMatcher::Match(absl::string_view value) const {
+ switch (type_) {
+ case Type::EXACT:
+ return case_sensitive_ ? value == string_matcher_
+ : absl::EqualsIgnoreCase(value, string_matcher_);
+ case StringMatcher::Type::PREFIX:
+ return case_sensitive_
+ ? absl::StartsWith(value, string_matcher_)
+ : absl::StartsWithIgnoreCase(value, string_matcher_);
+ case StringMatcher::Type::SUFFIX:
+ return case_sensitive_ ? absl::EndsWith(value, string_matcher_)
+ : absl::EndsWithIgnoreCase(value, string_matcher_);
+ case StringMatcher::Type::CONTAINS:
+ return case_sensitive_
+ ? absl::StrContains(value, string_matcher_)
+ : absl::StrContains(absl::AsciiStrToLower(value),
+ absl::AsciiStrToLower(string_matcher_));
+ case StringMatcher::Type::SAFE_REGEX:
+ return RE2::FullMatch(std::string(value), *regex_matcher_);
+ default:
+ return false;
+ }
+}
+
+std::string StringMatcher::ToString() const {
+ switch (type_) {
+ case Type::EXACT:
+ return absl::StrFormat("StringMatcher{exact=%s%s}", string_matcher_,
+ case_sensitive_ ? "" : ", case_sensitive=false");
+ case Type::PREFIX:
+ return absl::StrFormat("StringMatcher{prefix=%s%s}", string_matcher_,
+ case_sensitive_ ? "" : ", case_sensitive=false");
+ case Type::SUFFIX:
+ return absl::StrFormat("StringMatcher{suffix=%s%s}", string_matcher_,
+ case_sensitive_ ? "" : ", case_sensitive=false");
+ case Type::CONTAINS:
+ return absl::StrFormat("StringMatcher{contains=%s%s}", string_matcher_,
+ case_sensitive_ ? "" : ", case_sensitive=false");
+ case Type::SAFE_REGEX:
+ return absl::StrFormat("StringMatcher{safe_regex=%s%s}",
+ regex_matcher_->pattern(),
+ case_sensitive_ ? "" : ", case_sensitive=false");
+ default:
+ return "";
+ }
+}
+
+//
+// HeaderMatcher
+//
+
+absl::StatusOr<HeaderMatcher> HeaderMatcher::Create(
+ const std::string& name, Type type, const std::string& matcher,
+ int64_t range_start, int64_t range_end, bool present_match,
+ bool invert_match) {
+ if (static_cast<int>(type) < 5) {
+ // Only for EXACT, PREFIX, SUFFIX, SAFE_REGEX and CONTAINS.
+ absl::StatusOr<StringMatcher> string_matcher =
+ StringMatcher::Create(static_cast<StringMatcher::Type>(type), matcher,
+ /*case_sensitive=*/true);
+ if (!string_matcher.ok()) {
+ return string_matcher.status();
+ }
+ return HeaderMatcher(name, type, std::move(string_matcher.value()),
+ invert_match);
+ } else if (type == Type::RANGE) {
+ if (range_start > range_end) {
+ return absl::InvalidArgumentError(
+ "Invalid range specifier specified: end cannot be smaller than "
+ "start.");
+ }
+ return HeaderMatcher(name, range_start, range_end, invert_match);
+ } else {
+ return HeaderMatcher(name, present_match, invert_match);
+ }
+}
+
+HeaderMatcher::HeaderMatcher(const std::string& name, Type type,
+ StringMatcher string_matcher, bool invert_match)
+ : name_(name),
+ type_(type),
+ matcher_(std::move(string_matcher)),
+ invert_match_(invert_match) {}
+
+HeaderMatcher::HeaderMatcher(const std::string& name, int64_t range_start,
+ int64_t range_end, bool invert_match)
+ : name_(name),
+ type_(Type::RANGE),
+ range_start_(range_start),
+ range_end_(range_end),
+ invert_match_(invert_match) {}
+
+HeaderMatcher::HeaderMatcher(const std::string& name, bool present_match,
+ bool invert_match)
+ : name_(name),
+ type_(Type::PRESENT),
+ present_match_(present_match),
+ invert_match_(invert_match) {}
+
+HeaderMatcher::HeaderMatcher(const HeaderMatcher& other)
+ : name_(other.name_),
+ type_(other.type_),
+ invert_match_(other.invert_match_) {
+ switch (type_) {
+ case Type::RANGE:
+ range_start_ = other.range_start_;
+ range_end_ = other.range_end_;
+ break;
+ case Type::PRESENT:
+ present_match_ = other.present_match_;
+ break;
+ default:
+ matcher_ = other.matcher_;
+ }
+}
+
+HeaderMatcher& HeaderMatcher::operator=(const HeaderMatcher& other) {
+ name_ = other.name_;
+ type_ = other.type_;
+ invert_match_ = other.invert_match_;
+ switch (type_) {
+ case Type::RANGE:
+ range_start_ = other.range_start_;
+ range_end_ = other.range_end_;
+ break;
+ case Type::PRESENT:
+ present_match_ = other.present_match_;
+ break;
+ default:
+ matcher_ = other.matcher_;
+ }
+ return *this;
+}
+
+HeaderMatcher::HeaderMatcher(HeaderMatcher&& other) noexcept
+ : name_(std::move(other.name_)),
+ type_(other.type_),
+ invert_match_(other.invert_match_) {
+ switch (type_) {
+ case Type::RANGE:
+ range_start_ = other.range_start_;
+ range_end_ = other.range_end_;
+ break;
+ case Type::PRESENT:
+ present_match_ = other.present_match_;
+ break;
+ default:
+ matcher_ = std::move(other.matcher_);
+ }
+}
+
+HeaderMatcher& HeaderMatcher::operator=(HeaderMatcher&& other) noexcept {
+ name_ = std::move(other.name_);
+ type_ = other.type_;
+ invert_match_ = other.invert_match_;
+ switch (type_) {
+ case Type::RANGE:
+ range_start_ = other.range_start_;
+ range_end_ = other.range_end_;
+ break;
+ case Type::PRESENT:
+ present_match_ = other.present_match_;
+ break;
+ default:
+ matcher_ = std::move(other.matcher_);
+ }
+ return *this;
+}
+
+bool HeaderMatcher::operator==(const HeaderMatcher& other) const {
+ if (name_ != other.name_) return false;
+ if (type_ != other.type_) return false;
+ if (invert_match_ != other.invert_match_) return false;
+ switch (type_) {
+ case Type::RANGE:
+ return range_start_ == other.range_start_ &&
+ range_end_ == other.range_end_;
+ case Type::PRESENT:
+ return present_match_ == other.present_match_;
+ default:
+ return matcher_ == other.matcher_;
+ }
+}
+
+bool HeaderMatcher::Match(
+ const absl::optional<absl::string_view>& value) const {
+ bool match;
+ if (type_ == Type::PRESENT) {
+ match = value.has_value() == present_match_;
+ } else if (!value.has_value()) {
+ // All other types fail to match if field is not present.
+ match = false;
+ } else if (type_ == Type::RANGE) {
+ int64_t int_value;
+ match = absl::SimpleAtoi(value.value(), &int_value) &&
+ int_value >= range_start_ && int_value < range_end_;
+ } else {
+ match = matcher_.Match(value.value());
+ }
+ return match != invert_match_;
+}
+
+std::string HeaderMatcher::ToString() const {
+ switch (type_) {
+ case Type::RANGE:
+ return absl::StrFormat("HeaderMatcher{%s %srange=[%d, %d]}", name_,
+ invert_match_ ? "not " : "", range_start_,
+ range_end_);
+ case Type::PRESENT:
+ return absl::StrFormat("HeaderMatcher{%s %spresent=%s}", name_,
+ invert_match_ ? "not " : "",
+ present_match_ ? "true" : "false");
+ case Type::EXACT:
+ case Type::PREFIX:
+ case Type::SUFFIX:
+ case Type::SAFE_REGEX:
+ case Type::CONTAINS:
+ return absl::StrFormat("HeaderMatcher{%s %s%s}", name_,
+ invert_match_ ? "not " : "", matcher_.ToString());
+ default:
+ return "";
+ }
+}
+
+} // namespace grpc_core
--- /dev/null
+// Copyright 2021 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.
+
+#ifndef GRPC_CORE_LIB_SECURITY_AUTHORIZATION_MATCHERS_H
+#define GRPC_CORE_LIB_SECURITY_AUTHORIZATION_MATCHERS_H
+
+#include <grpc/support/port_platform.h>
+
+#include <memory>
+#include <string>
+
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
+
+#include "re2/re2.h"
+
+namespace grpc_core {
+
+class StringMatcher {
+ public:
+ enum class Type {
+ EXACT, // value stored in string_matcher_ field
+ PREFIX, // value stored in string_matcher_ field
+ SUFFIX, // value stored in string_matcher_ field
+ SAFE_REGEX, // pattern stored in regex_matcher_ field
+ CONTAINS, // value stored in string_matcher_ field
+ };
+
+ // Creates StringMatcher instance. Returns error status on failure.
+ static absl::StatusOr<StringMatcher> Create(Type type,
+ const std::string& matcher,
+ bool case_sensitive = true);
+
+ StringMatcher() = default;
+ StringMatcher(const StringMatcher& other);
+ StringMatcher& operator=(const StringMatcher& other);
+ StringMatcher(StringMatcher&& other) noexcept;
+ StringMatcher& operator=(StringMatcher&& other) noexcept;
+ bool operator==(const StringMatcher& other) const;
+
+ bool Match(absl::string_view value) const;
+
+ std::string ToString() const;
+
+ Type type() const { return type_; }
+
+ // Valid for EXACT, PREFIX, SUFFIX and CONTAINS
+ const std::string& string_matcher() const { return string_matcher_; }
+
+ // Valid for SAFE_REGEX
+ RE2* regex_matcher() const { return regex_matcher_.get(); }
+
+ bool case_sensitive() const { return case_sensitive_; }
+
+ private:
+ StringMatcher(Type type, const std::string& matcher, bool case_sensitive);
+ StringMatcher(std::unique_ptr<RE2> regex_matcher, bool case_sensitive);
+
+ Type type_ = Type::EXACT;
+ std::string string_matcher_;
+ std::unique_ptr<RE2> regex_matcher_;
+ bool case_sensitive_ = true;
+};
+
+class HeaderMatcher {
+ public:
+ enum class Type {
+ EXACT, // value stored in StringMatcher field
+ PREFIX, // value stored in StringMatcher field
+ SUFFIX, // value stored in StringMatcher field
+ SAFE_REGEX, // value stored in StringMatcher field
+ CONTAINS, // value stored in StringMatcher field
+ RANGE, // uses range_start and range_end fields
+ PRESENT, // uses present_match field
+ };
+
+ // Make sure that the first five HeaderMatcher::Type enum values match up to
+ // the corresponding StringMatcher::Type enum values, so that it's safe to
+ // convert by casting when delegating to StringMatcher.
+ static_assert(static_cast<StringMatcher::Type>(Type::EXACT) ==
+ StringMatcher::Type::EXACT,
+ "");
+ static_assert(static_cast<StringMatcher::Type>(Type::PREFIX) ==
+ StringMatcher::Type::PREFIX,
+ "");
+ static_assert(static_cast<StringMatcher::Type>(Type::SUFFIX) ==
+ StringMatcher::Type::SUFFIX,
+ "");
+ static_assert(static_cast<StringMatcher::Type>(Type::SAFE_REGEX) ==
+ StringMatcher::Type::SAFE_REGEX,
+ "");
+ static_assert(static_cast<StringMatcher::Type>(Type::CONTAINS) ==
+ StringMatcher::Type::CONTAINS,
+ "");
+
+ // Creates HeaderMatcher instance. Returns error status on failure.
+ static absl::StatusOr<HeaderMatcher> Create(
+ const std::string& name, Type type, const std::string& matcher,
+ int64_t range_start = 0, int64_t range_end = 0,
+ bool present_match = false, bool invert_match = false);
+
+ HeaderMatcher() = default;
+ HeaderMatcher(const HeaderMatcher& other);
+ HeaderMatcher& operator=(const HeaderMatcher& other);
+ HeaderMatcher(HeaderMatcher&& other) noexcept;
+ HeaderMatcher& operator=(HeaderMatcher&& other) noexcept;
+ bool operator==(const HeaderMatcher& other) const;
+
+ const std::string& name() const { return name_; }
+
+ Type type() const { return type_; }
+
+ // Valid for EXACT, PREFIX, SUFFIX and CONTAINS
+ const std::string& string_matcher() const {
+ return matcher_.string_matcher();
+ }
+
+ // Valid for SAFE_REGEX
+ RE2* regex_matcher() const { return matcher_.regex_matcher(); }
+
+ bool Match(const absl::optional<absl::string_view>& value) const;
+
+ std::string ToString() const;
+
+ private:
+ // For StringMatcher.
+ HeaderMatcher(const std::string& name, Type type, StringMatcher matcher,
+ bool invert_match);
+ // For RangeMatcher.
+ HeaderMatcher(const std::string& name, int64_t range_start, int64_t range_end,
+ bool invert_match);
+ // For PresentMatcher.
+ HeaderMatcher(const std::string& name, bool present_match, bool invert_match);
+
+ std::string name_;
+ Type type_ = Type::EXACT;
+ StringMatcher matcher_;
+ int64_t range_start_;
+ int64_t range_end_;
+ bool present_match_;
+ bool invert_match_ = false;
+};
+
+} // namespace grpc_core
+
+#endif /* GRPC_CORE_LIB_SECURITY_AUTHORIZATION_MATCHERS_H */
\ No newline at end of file
Activation& operator=(const Activation&) = delete;
// Insert value into Activation.
- void InsertValue(absl::string_view name, const CelValue& value) {}
+ void InsertValue(absl::string_view /*name*/, const CelValue& /*value*/) {}
};
} // namespace mock_cel
// We rely on copy elision to avoid extra copying.
static CelValue CreateNull() { return CelValue(nullptr); }
- static CelValue CreateInt64(int64_t value) { return CreateNull(); }
+ static CelValue CreateInt64(int64_t /*value*/) { return CreateNull(); }
- static CelValue CreateUint64(uint64_t value) { return CreateNull(); }
+ static CelValue CreateUint64(uint64_t /*value*/) { return CreateNull(); }
- static CelValue CreateStringView(absl::string_view value) {
+ static CelValue CreateStringView(absl::string_view /*value*/) {
return CreateNull();
}
- static CelValue CreateString(const std::string* str) { return CreateNull(); }
+ static CelValue CreateString(const std::string* /*str*/) {
+ return CreateNull();
+ }
- static CelValue CreateMap(const CelMap* value) { return CreateNull(); }
+ static CelValue CreateMap(const CelMap* /*value*/) { return CreateNull(); }
private:
// Constructs CelValue wrapping value supplied as argument.
// Value type T should be supported by specification of ValueHolder.
template <class T>
- explicit CelValue(T value) {}
+ explicit CelValue(T /*value*/) {}
};
// CelMap implementation that uses STL map container as backing storage.
ContainerBackedMapImpl() = default;
static std::unique_ptr<CelMap> Create(
- absl::Span<std::pair<CelValue, CelValue>> key_values) {
+ absl::Span<std::pair<CelValue, CelValue>> /*key_values*/) {
return absl::make_unique<ContainerBackedMapImpl>();
}
};
}
grpc_core::RefCountedPtr<grpc_server_security_connector>
-grpc_alts_server_credentials::create_security_connector() {
+grpc_alts_server_credentials::create_security_connector(
+ const grpc_channel_args* /* args */) {
return grpc_alts_server_security_connector_create(this->Ref());
}
~grpc_alts_server_credentials() override;
grpc_core::RefCountedPtr<grpc_server_security_connector>
- create_security_connector() override;
+ create_security_connector(const grpc_channel_args* /* args */) override;
const grpc_alts_credentials_options* options() const { return options_; }
grpc_alts_credentials_options* mutable_options() { return options_; }
~grpc_server_credentials() override { DestroyProcessor(); }
+ // Ownership of \a args is not passed.
virtual grpc_core::RefCountedPtr<grpc_server_security_connector>
- create_security_connector() = 0;
+ create_security_connector(const grpc_channel_args* args) = 0;
const char* type() const { return type_; }
}
void AwsExternalAccountCredentials::RetrieveSubjectToken(
- HTTPRequestContext* ctx, const Options& options,
+ HTTPRequestContext* ctx, const Options& /*options*/,
std::function<void(std::string, grpc_error*)> cb) {
if (ctx == nullptr) {
FinishRetrieveSubjectToken(
std::string(ctx_->response.body, ctx_->response.body_length).c_str());
metadata_req_->response.hdrs = static_cast<grpc_http_header*>(
gpr_malloc(sizeof(grpc_http_header) * ctx_->response.hdr_count));
- for (int i = 0; i < ctx_->response.hdr_count; i++) {
+ for (size_t i = 0; i < ctx_->response.hdr_count; i++) {
metadata_req_->response.hdrs[i].key =
gpr_strdup(ctx_->response.hdrs[i].key);
metadata_req_->response.hdrs[i].value =
metadata_req_->response.body_length = body.length();
metadata_req_->response.hdrs = static_cast<grpc_http_header*>(
gpr_malloc(sizeof(grpc_http_header) * ctx_->response.hdr_count));
- for (int i = 0; i < ctx_->response.hdr_count; i++) {
+ for (size_t i = 0; i < ctx_->response.hdr_count; i++) {
metadata_req_->response.hdrs[i].key =
gpr_strdup(ctx_->response.hdrs[i].key);
metadata_req_->response.hdrs[i].value =
}
void FileExternalAccountCredentials::RetrieveSubjectToken(
- HTTPRequestContext* ctx, const Options& options,
+ HTTPRequestContext* /*ctx*/, const Options& /*options*/,
std::function<void(std::string, grpc_error*)> cb) {
struct SliceWrapper {
~SliceWrapper() { grpc_slice_unref_internal(slice); }
}
void UrlExternalAccountCredentials::RetrieveSubjectToken(
- HTTPRequestContext* ctx, const Options& options,
+ HTTPRequestContext* ctx, const Options& /*options*/,
std::function<void(std::string, grpc_error*)> cb) {
if (ctx == nullptr) {
FinishRetrieveSubjectToken(
~grpc_fake_server_credentials() override = default;
grpc_core::RefCountedPtr<grpc_server_security_connector>
- create_security_connector() override {
+ create_security_connector(const grpc_channel_args* /*args*/) override {
return grpc_fake_server_security_connector_create(this->Ref());
}
};
* means the detection is done via network test that is unreliable and the
* unreliable result should not be referred by successive calls. */
static int g_metadata_server_available = 0;
-static gpr_mu g_state_mu;
+static grpc_core::Mutex* g_state_mu;
/* Protect a metadata_server_detector instance that can be modified by more than
* one gRPC threads */
static gpr_mu* g_polling_mu;
static grpc_core::internal::grpc_gce_tenancy_checker g_gce_tenancy_checker =
grpc_alts_is_running_on_gcp;
-static void init_default_credentials(void) { gpr_mu_init(&g_state_mu); }
+static void init_default_credentials(void) {
+ g_state_mu = new grpc_core::Mutex();
+}
struct metadata_server_detector {
grpc_polling_entity pollent;
static void update_tenancy() {
gpr_once_init(&g_once, init_default_credentials);
- grpc_core::MutexLock lock(&g_state_mu);
+ grpc_core::MutexLock lock(g_state_mu);
/* Try a platform-provided hint for GCE. */
if (!g_metadata_server_available) {
}
static bool metadata_server_available() {
- grpc_core::MutexLock lock(&g_state_mu);
+ grpc_core::MutexLock lock(g_state_mu);
return static_cast<bool>(g_metadata_server_available);
}
void grpc_flush_cached_google_default_credentials(void) {
grpc_core::ExecCtx exec_ctx;
gpr_once_init(&g_once, init_default_credentials);
- gpr_mu_lock(&g_state_mu);
+ grpc_core::MutexLock lock(g_state_mu);
g_metadata_server_available = 0;
- gpr_mu_unlock(&g_state_mu);
}
} // namespace internal
InsecureServerCredentials()
: grpc_server_credentials(kCredentialsTypeInsecure) {}
- RefCountedPtr<grpc_server_security_connector> create_security_connector()
- override {
+ RefCountedPtr<grpc_server_security_connector> create_security_connector(
+ const grpc_channel_args* /* args */) override {
return MakeRefCounted<InsecureServerSecurityConnector>(Ref());
}
};
#include "src/core/lib/security/util/json_util.h"
#include "src/core/lib/slice/b64.h"
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
extern "C" {
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
}
-#pragma clang diagnostic pop
using grpc_core::Json;
#include <grpc/support/string_util.h>
#include <grpc/support/sync.h>
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
extern "C" {
#include <openssl/bn.h>
#include <openssl/pem.h>
#include <openssl/rsa.h>
}
-#pragma clang diagnostic pop
#include "src/core/lib/gpr/string.h"
#include "src/core/lib/gprpp/manual_constructor.h"
}
grpc_core::RefCountedPtr<grpc_server_security_connector>
-grpc_local_server_credentials::create_security_connector() {
+grpc_local_server_credentials::create_security_connector(
+ const grpc_channel_args* /* args */) {
return grpc_local_server_security_connector_create(this->Ref());
}
~grpc_local_server_credentials() override = default;
grpc_core::RefCountedPtr<grpc_server_security_connector>
- create_security_connector() override;
+ create_security_connector(const grpc_channel_args* /* args */) override;
grpc_local_connect_type connect_type() const { return connect_type_; }
gpr_free(config_.pem_root_certs);
}
grpc_core::RefCountedPtr<grpc_server_security_connector>
-grpc_ssl_server_credentials::create_security_connector() {
+grpc_ssl_server_credentials::create_security_connector(
+ const grpc_channel_args* /* args */) {
return grpc_ssl_server_security_connector_create(this->Ref());
}
~grpc_ssl_server_credentials() override;
grpc_core::RefCountedPtr<grpc_server_security_connector>
- create_security_connector() override;
+ create_security_connector(const grpc_channel_args* /* args */) override;
bool has_cert_config_fetcher() const {
return certificate_config_fetcher_.cb != nullptr;
TlsServerCredentials::~TlsServerCredentials() {}
grpc_core::RefCountedPtr<grpc_server_security_connector>
-TlsServerCredentials::create_security_connector() {
+TlsServerCredentials::create_security_connector(
+ const grpc_channel_args* /* args */) {
return grpc_core::TlsServerSecurityConnector::
CreateTlsServerSecurityConnector(this->Ref(), options_);
}
~TlsServerCredentials() override;
grpc_core::RefCountedPtr<grpc_server_security_connector>
- create_security_connector() override;
+ create_security_connector(const grpc_channel_args* /* args */) override;
grpc_tls_credentials_options* options() const { return options_.get(); }
#include "src/core/lib/security/credentials/xds/xds_credentials.h"
+#include "src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h"
#include "src/core/ext/xds/xds_certificate_provider.h"
#include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h"
#include "src/core/lib/security/credentials/tls/tls_credentials.h"
bool XdsVerifySubjectAlternativeNames(
const char* const* subject_alternative_names,
size_t subject_alternative_names_size,
- const std::vector<XdsApi::StringMatcher>& matchers) {
+ const std::vector<StringMatcher>& matchers) {
if (matchers.empty()) return true;
for (size_t i = 0; i < subject_alternative_names_size; ++i) {
for (const auto& matcher : matchers) {
- if (matcher.type() == XdsApi::StringMatcher::StringMatcherType::EXACT) {
+ if (matcher.type() == StringMatcher::Type::EXACT) {
// For EXACT match, use DNS rules for verifying SANs
// TODO(zhenlian): Right now, the SSL layer does not save the type of
// the SAN, so we are doing a DNS style verification for all SANs when
return false;
}
-int ServerAuthCheckSchedule(void* config_user_data,
- grpc_tls_server_authorization_check_arg* arg) {
- XdsCertificateProvider* xds_certificate_provider =
- static_cast<XdsCertificateProvider*>(config_user_data);
- if (XdsVerifySubjectAlternativeNames(
- arg->subject_alternative_names, arg->subject_alternative_names_size,
- xds_certificate_provider->subject_alternative_name_matchers())) {
- arg->success = 1;
- arg->status = GRPC_STATUS_OK;
- } else {
- arg->success = 0;
- arg->status = GRPC_STATUS_UNAUTHENTICATED;
- if (arg->error_details) {
- arg->error_details->set_error_details(
- "SANs from certificate did not match SANs from xDS control plane");
- }
+class ServerAuthCheck {
+ public:
+ ServerAuthCheck(
+ RefCountedPtr<XdsCertificateProvider> xds_certificate_provider,
+ std::string cluster_name)
+ : xds_certificate_provider_(std::move(xds_certificate_provider)),
+ cluster_name_(std::move(cluster_name)) {}
+
+ static int Schedule(void* config_user_data,
+ grpc_tls_server_authorization_check_arg* arg) {
+ return static_cast<ServerAuthCheck*>(config_user_data)->ScheduleImpl(arg);
}
- return 0; /* synchronous check */
-}
+ static void Destroy(void* config_user_data) {
+ delete static_cast<ServerAuthCheck*>(config_user_data);
+ }
-void ServerAuthCheckDestroy(void* config_user_data) {
- XdsCertificateProvider* xds_certificate_provider =
- static_cast<XdsCertificateProvider*>(config_user_data);
- xds_certificate_provider->Unref();
-}
+ private:
+ int ScheduleImpl(grpc_tls_server_authorization_check_arg* arg) {
+ if (XdsVerifySubjectAlternativeNames(
+ arg->subject_alternative_names, arg->subject_alternative_names_size,
+ xds_certificate_provider_->GetSanMatchers(cluster_name_))) {
+ arg->success = 1;
+ arg->status = GRPC_STATUS_OK;
+ } else {
+ arg->success = 0;
+ arg->status = GRPC_STATUS_UNAUTHENTICATED;
+ if (arg->error_details) {
+ arg->error_details->set_error_details(
+ "SANs from certificate did not match SANs from xDS control plane");
+ }
+ }
+ return 0; /* synchronous check */
+ }
+
+ RefCountedPtr<XdsCertificateProvider> xds_certificate_provider_;
+ std::string cluster_name_;
+};
} // namespace
bool TestOnlyXdsVerifySubjectAlternativeNames(
const char* const* subject_alternative_names,
size_t subject_alternative_names_size,
- const std::vector<XdsApi::StringMatcher>& matchers) {
+ const std::vector<StringMatcher>& matchers) {
return XdsVerifySubjectAlternativeNames(
subject_alternative_names, subject_alternative_names_size, matchers);
}
XdsCredentials::create_security_connector(
RefCountedPtr<grpc_call_credentials> call_creds, const char* target_name,
const grpc_channel_args* args, grpc_channel_args** new_args) {
- auto xds_certificate_provider =
- XdsCertificateProvider::GetFromChannelArgs(args);
+ struct ChannelArgsDeleter {
+ const grpc_channel_args* args;
+ bool owned;
+ ~ChannelArgsDeleter() {
+ if (owned) grpc_channel_args_destroy(args);
+ }
+ };
+ ChannelArgsDeleter temp_args{args, false};
// TODO(yashykt): This arg will no longer need to be added after b/173119596
// is fixed.
grpc_arg override_arg = grpc_channel_arg_string_create(
const_cast<char*>(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG),
const_cast<char*>(target_name));
const char* override_arg_name = GRPC_SSL_TARGET_NAME_OVERRIDE_ARG;
- const grpc_channel_args* temp_args = args;
if (grpc_channel_args_find(args, override_arg_name) == nullptr) {
- temp_args = grpc_channel_args_copy_and_add_and_remove(
+ temp_args.args = grpc_channel_args_copy_and_add_and_remove(
args, &override_arg_name, 1, &override_arg, 1);
+ temp_args.owned = true;
}
RefCountedPtr<grpc_channel_security_connector> security_connector;
+ auto xds_certificate_provider =
+ XdsCertificateProvider::GetFromChannelArgs(args);
if (xds_certificate_provider != nullptr) {
- auto tls_credentials_options =
- MakeRefCounted<grpc_tls_credentials_options>();
- tls_credentials_options->set_certificate_provider(xds_certificate_provider);
- if (xds_certificate_provider->ProvidesRootCerts()) {
- tls_credentials_options->set_watch_root_cert(true);
- }
- if (xds_certificate_provider->ProvidesIdentityCerts()) {
- tls_credentials_options->set_watch_identity_pair(true);
+ std::string cluster_name =
+ grpc_channel_args_find_string(args, GRPC_ARG_XDS_CLUSTER_NAME);
+ GPR_ASSERT(cluster_name.data() != nullptr);
+ const bool watch_root =
+ xds_certificate_provider->ProvidesRootCerts(cluster_name);
+ const bool watch_identity =
+ xds_certificate_provider->ProvidesIdentityCerts(cluster_name);
+ if (watch_root || watch_identity) {
+ auto tls_credentials_options =
+ MakeRefCounted<grpc_tls_credentials_options>();
+ tls_credentials_options->set_certificate_provider(
+ xds_certificate_provider);
+ if (watch_root) {
+ tls_credentials_options->set_watch_root_cert(true);
+ tls_credentials_options->set_root_cert_name(cluster_name);
+ }
+ if (watch_identity) {
+ tls_credentials_options->set_watch_identity_pair(true);
+ tls_credentials_options->set_identity_cert_name(cluster_name);
+ }
+ tls_credentials_options->set_server_verification_option(
+ GRPC_TLS_SKIP_HOSTNAME_VERIFICATION);
+ auto* server_auth_check = new ServerAuthCheck(xds_certificate_provider,
+ std::move(cluster_name));
+ tls_credentials_options->set_server_authorization_check_config(
+ MakeRefCounted<grpc_tls_server_authorization_check_config>(
+ server_auth_check, ServerAuthCheck::Schedule, nullptr,
+ ServerAuthCheck::Destroy));
+ // TODO(yashkt): Creating a new TlsCreds object each time we create a
+ // security connector means that the security connector's cmp() method
+ // returns unequal for each instance, which means that every time an LB
+ // policy updates, all the subchannels will be recreated. This is
+ // going to lead to a lot of connection churn. Instead, we should
+ // either (a) change the TLS security connector's cmp() method to be
+ // smarter somehow, so that it compares unequal only when the
+ // tls_credentials_options have changed, or (b) cache the TlsCreds
+ // objects in the XdsCredentials object so that we can reuse the
+ // same one when creating new security connectors, swapping out the
+ // TlsCreds object only when the tls_credentials_options change.
+ // Option (a) would probably be better, although it may require some
+ // structural changes to the security connector API.
+ auto tls_credentials =
+ MakeRefCounted<TlsCredentials>(std::move(tls_credentials_options));
+ return tls_credentials->create_security_connector(
+ std::move(call_creds), target_name, temp_args.args, new_args);
}
- tls_credentials_options->set_server_verification_option(
- GRPC_TLS_SKIP_HOSTNAME_VERIFICATION);
- tls_credentials_options->set_server_authorization_check_config(
- MakeRefCounted<grpc_tls_server_authorization_check_config>(
- xds_certificate_provider->Ref().release(), ServerAuthCheckSchedule,
- nullptr, ServerAuthCheckDestroy));
- auto tls_credentials =
- MakeRefCounted<TlsCredentials>(std::move(tls_credentials_options));
- security_connector = tls_credentials->create_security_connector(
- std::move(call_creds), target_name, temp_args, new_args);
- } else {
- GPR_ASSERT(fallback_credentials_ != nullptr);
- security_connector = fallback_credentials_->create_security_connector(
- std::move(call_creds), target_name, temp_args, new_args);
}
- if (temp_args != args) {
- grpc_channel_args_destroy(temp_args);
- }
- return security_connector;
+ GPR_ASSERT(fallback_credentials_ != nullptr);
+ return fallback_credentials_->create_security_connector(
+ std::move(call_creds), target_name, temp_args.args, new_args);
}
//
//
RefCountedPtr<grpc_server_security_connector>
-XdsServerCredentials::create_security_connector() {
- // TODO(yashkt): Fill this
- return fallback_credentials_->create_security_connector();
+XdsServerCredentials::create_security_connector(const grpc_channel_args* args) {
+ auto xds_certificate_provider =
+ XdsCertificateProvider::GetFromChannelArgs(args);
+ // Identity certs are a must for TLS.
+ if (xds_certificate_provider != nullptr &&
+ xds_certificate_provider->ProvidesIdentityCerts("")) {
+ auto tls_credentials_options =
+ MakeRefCounted<grpc_tls_credentials_options>();
+ tls_credentials_options->set_watch_identity_pair(true);
+ tls_credentials_options->set_certificate_provider(xds_certificate_provider);
+ if (xds_certificate_provider->ProvidesRootCerts("")) {
+ tls_credentials_options->set_watch_root_cert(true);
+ if (xds_certificate_provider->GetRequireClientCertificate("")) {
+ tls_credentials_options->set_cert_request_type(
+ GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
+ } else {
+ tls_credentials_options->set_cert_request_type(
+ GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY);
+ }
+ } else {
+ // Do not request client certificate if there is no way to verify.
+ tls_credentials_options->set_cert_request_type(
+ GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE);
+ }
+ auto tls_credentials = MakeRefCounted<TlsServerCredentials>(
+ std::move(tls_credentials_options));
+ return tls_credentials->create_security_connector(args);
+ }
+ return fallback_credentials_->create_security_connector(args);
}
} // namespace grpc_core
: grpc_server_credentials(kCredentialsTypeXds),
fallback_credentials_(std::move(fallback_credentials)) {}
- RefCountedPtr<grpc_server_security_connector> create_security_connector()
- override;
+ RefCountedPtr<grpc_server_security_connector> create_security_connector(
+ const grpc_channel_args* /* args */) override;
private:
RefCountedPtr<grpc_server_credentials> fallback_credentials_;
bool TestOnlyXdsVerifySubjectAlternativeNames(
const char* const* subject_alternative_names,
size_t subject_alternative_names_size,
- const std::vector<XdsApi::StringMatcher>& matchers);
+ const std::vector<StringMatcher>& matchers);
} // namespace grpc_core
// check_call_host and cancel_check_call_host are no-ops since we want to
// provide an insecure channel.
bool InsecureChannelSecurityConnector::check_call_host(
- absl::string_view host, grpc_auth_context* auth_context,
- grpc_closure* on_call_host_checked, grpc_error** error) {
+ absl::string_view /*host*/, grpc_auth_context* /*auth_context*/,
+ grpc_closure* /*on_call_host_checked*/, grpc_error** error) {
*error = GRPC_ERROR_NONE;
return true;
}
void InsecureChannelSecurityConnector::cancel_check_call_host(
- grpc_closure* on_call_host_checked, grpc_error* error) {
+ grpc_closure* /*on_call_host_checked*/, grpc_error* error) {
GRPC_ERROR_UNREF(error);
}
}
void InsecureChannelSecurityConnector::check_peer(
- tsi_peer peer, grpc_endpoint* ep,
+ tsi_peer peer, grpc_endpoint* /*ep*/,
RefCountedPtr<grpc_auth_context>* auth_context,
grpc_closure* on_peer_checked) {
*auth_context = MakeAuthContext();
}
void InsecureServerSecurityConnector::check_peer(
- tsi_peer peer, grpc_endpoint* ep,
+ tsi_peer peer, grpc_endpoint* /*ep*/,
grpc_core::RefCountedPtr<grpc_auth_context>* auth_context,
grpc_closure* on_peer_checked) {
*auth_context = MakeAuthContext();
const char* root_certs;
const tsi_ssl_root_certs_store* root_store;
if (pem_root_certs == nullptr) {
+ gpr_log(GPR_INFO,
+ "No root certificates specified; use ones stored in system default "
+ "locations instead");
// Use default root certificates.
root_certs = grpc_core::DefaultSslRootStore::GetPemRootCerts();
if (root_certs == nullptr) {
if (options_->watch_identity_pair()) {
watched_identity_cert_name = options_->identity_cert_name();
}
- distributor->WatchTlsCertificates(std::move(watcher_ptr),
- watched_root_cert_name,
- watched_identity_cert_name);
+ // We will use the root certs stored in system default locations if not
+ // watching root certs on the client side. We will handle this case
+ // differently here, because "watching a default roots without the identity
+ // certs" is a valid case(and hence we will need to call
+ // OnCertificatesChanged), but it requires nothing from the provider, and
+ // hence no need to register the watcher.
+ bool use_default_roots = !options_->watch_root_cert();
+ if (use_default_roots && !options_->watch_identity_pair()) {
+ watcher_ptr->OnCertificatesChanged(absl::nullopt, absl::nullopt);
+ } else {
+ distributor->WatchTlsCertificates(std::move(watcher_ptr),
+ watched_root_cert_name,
+ watched_identity_cert_name);
+ }
}
TlsChannelSecurityConnector::~TlsChannelSecurityConnector() {
// Cancel all the watchers.
grpc_tls_certificate_distributor* distributor =
options_->certificate_distributor();
- distributor->CancelTlsCertificatesWatch(certificate_watcher_);
+ if (distributor != nullptr) {
+ distributor->CancelTlsCertificatesWatch(certificate_watcher_);
+ }
if (client_handshaker_factory_ != nullptr) {
tsi_ssl_client_handshaker_factory_unref(client_handshaker_factory_);
}
if (key_cert_pairs.has_value()) {
security_connector_->pem_key_cert_pair_list_ = std::move(key_cert_pairs);
}
- bool root_being_watched = security_connector_->options_->watch_root_cert();
- bool root_has_value = security_connector_->pem_root_certs_.has_value();
- bool identity_being_watched =
- security_connector_->options_->watch_identity_pair();
- bool identity_has_value =
+ const bool root_ready = !security_connector_->options_->watch_root_cert() ||
+ security_connector_->pem_root_certs_.has_value();
+ const bool identity_ready =
+ !security_connector_->options_->watch_identity_pair() ||
security_connector_->pem_key_cert_pair_list_.has_value();
- if ((root_being_watched && root_has_value && identity_being_watched &&
- identity_has_value) ||
- (root_being_watched && root_has_value && !identity_being_watched) ||
- (!root_being_watched && identity_being_watched && identity_has_value)) {
+ if (root_ready && identity_ready) {
if (security_connector_->UpdateHandshakerFactoryLocked() !=
GRPC_SECURITY_OK) {
gpr_log(GPR_ERROR, "Update handshaker factory failed.");
if (pem_key_cert_pair_list_.has_value()) {
pem_key_cert_pair = ConvertToTsiPemKeyCertPair(*pem_key_cert_pair_list_);
}
+ bool use_default_roots = !options_->watch_root_cert();
grpc_security_status status = grpc_ssl_tsi_client_handshaker_factory_init(
pem_key_cert_pair,
- pem_root_certs.empty() ? nullptr : pem_root_certs.c_str(),
+ pem_root_certs.empty() || use_default_roots ? nullptr
+ : pem_root_certs.c_str(),
skip_server_certificate_verification,
grpc_get_tsi_tls_version(options_->min_tls_version()),
grpc_get_tsi_tls_version(options_->max_tls_version()), ssl_session_cache_,
if (options_->watch_identity_pair()) {
watched_identity_cert_name = options_->identity_cert_name();
}
+ // Server side won't use default system roots at any time.
distributor->WatchTlsCertificates(std::move(watcher_ptr),
watched_root_cert_name,
watched_identity_cert_name);
tsi_handshaker* handshaker_;
RefCountedPtr<grpc_security_connector> connector_;
- gpr_mu mu_;
+ Mutex mu_;
bool is_shutdown_ = false;
// Endpoint and read buffer to destroy after a shutdown.
max_frame_size_ = grpc_channel_arg_get_integer(
arg, {0, 0, std::numeric_limits<int>::max()});
}
- gpr_mu_init(&mu_);
grpc_slice_buffer_init(&outgoing_);
GRPC_CLOSURE_INIT(&on_peer_checked_, &SecurityHandshaker::OnPeerCheckedFn,
this, grpc_schedule_on_exec_ctx);
}
SecurityHandshaker::~SecurityHandshaker() {
- gpr_mu_destroy(&mu_);
tsi_handshaker_destroy(handshaker_);
tsi_handshaker_result_destroy(handshaker_result_);
if (endpoint_to_destroy_ != nullptr) {
InternedSliceRefcount::~InternedSliceRefcount() {
slice_shard* shard = &g_shards[SHARD_IDX(this->hash)];
- MutexLock lock(&shard->mu);
+ MutexLockForGprMu lock(&shard->mu);
InternedSliceRefcount** prev_next;
InternedSliceRefcount* cur;
for (prev_next = &shard->strs[TABLE_IDX(this->hash, shard->capacity)],
#define MAX_PLUGINS 128
static gpr_once g_basic_init = GPR_ONCE_INIT;
-static gpr_mu g_init_mu;
+static grpc_core::Mutex* g_init_mu;
static int g_initializations;
-static gpr_cv* g_shutting_down_cv;
+static grpc_core::CondVar* g_shutting_down_cv;
static bool g_shutting_down;
static void do_basic_init(void) {
gpr_log_verbosity_init();
- gpr_mu_init(&g_init_mu);
- g_shutting_down_cv = static_cast<gpr_cv*>(malloc(sizeof(gpr_cv)));
- gpr_cv_init(g_shutting_down_cv);
+ g_init_mu = new grpc_core::Mutex();
+ g_shutting_down_cv = new grpc_core::CondVar();
g_shutting_down = false;
grpc_register_built_in_plugins();
grpc_cq_global_init();
int i;
gpr_once_init(&g_basic_init, do_basic_init);
- grpc_core::MutexLock lock(&g_init_mu);
+ grpc_core::MutexLock lock(g_init_mu);
if (++g_initializations == 1) {
if (g_shutting_down) {
g_shutting_down = false;
- gpr_cv_broadcast(g_shutting_down_cv);
+ g_shutting_down_cv->SignalAll();
}
grpc_core::Fork::GlobalInit();
grpc_fork_handlers_auto_register();
grpc_core::ExecCtx::GlobalShutdown();
grpc_core::ApplicationCallbackExecCtx::GlobalShutdown();
g_shutting_down = false;
- gpr_cv_broadcast(g_shutting_down_cv);
+ g_shutting_down_cv->SignalAll();
// Absolute last action will be to delete static metadata context.
grpc_destroy_static_metadata_ctx();
}
void grpc_shutdown_internal(void* /*ignored*/) {
GRPC_API_TRACE("grpc_shutdown_internal", 0, ());
- grpc_core::MutexLock lock(&g_init_mu);
+ grpc_core::MutexLock lock(g_init_mu);
// We have released lock from the shutdown thread and it is possible that
// another grpc_init has been called, and do nothing if that is the case.
if (--g_initializations != 0) {
void grpc_shutdown(void) {
GRPC_API_TRACE("grpc_shutdown(void)", 0, ());
- grpc_core::MutexLock lock(&g_init_mu);
+ grpc_core::MutexLock lock(g_init_mu);
if (--g_initializations == 0) {
grpc_core::ApplicationCallbackExecCtx* acec =
void grpc_shutdown_blocking(void) {
GRPC_API_TRACE("grpc_shutdown_blocking(void)", 0, ());
- grpc_core::MutexLock lock(&g_init_mu);
+ grpc_core::MutexLock lock(g_init_mu);
if (--g_initializations == 0) {
g_shutting_down = true;
grpc_shutdown_internal_locked();
int grpc_is_initialized(void) {
int r;
gpr_once_init(&g_basic_init, do_basic_init);
- grpc_core::MutexLock lock(&g_init_mu);
+ grpc_core::MutexLock lock(g_init_mu);
r = g_initializations > 0;
return r;
}
void grpc_maybe_wait_for_async_shutdown(void) {
gpr_once_init(&g_basic_init, do_basic_init);
- grpc_core::MutexLock lock(&g_init_mu);
+ grpc_core::MutexLock lock(g_init_mu);
while (g_shutting_down) {
- gpr_cv_wait(g_shutting_down_cv, &g_init_mu,
- gpr_inf_future(GPR_CLOCK_REALTIME));
+ g_shutting_down_cv->Wait(g_init_mu);
}
}
}
RefCountedPtr<channelz::ServerNode> CreateChannelzNode(
- Server* server, const grpc_channel_args* args) {
+ const grpc_channel_args* args) {
RefCountedPtr<channelz::ServerNode> channelz_node;
if (grpc_channel_args_find_bool(args, GRPC_ARG_ENABLE_CHANNELZ,
GRPC_ENABLE_CHANNELZ_DEFAULT)) {
Server::Server(const grpc_channel_args* args)
: channel_args_(grpc_channel_args_copy(args)),
default_resource_user_(CreateDefaultResourceUser(args)),
- channelz_node_(CreateChannelzNode(this, args)) {}
+ channelz_node_(CreateChannelzNode(args)) {}
Server::~Server() {
grpc_channel_args_destroy(channel_args_);
{
// Wait for startup to be finished. Locks mu_global.
MutexLock lock(&mu_global_);
- starting_cv_.WaitUntil(&mu_global_, [this] { return !starting_; });
+ WaitUntil(&starting_cv_, &mu_global_, [this] { return !starting_; });
// Stay locked, and gather up some stuff to do.
GPR_ASSERT(grpc_cq_begin_op(cq, tag));
if (shutdown_published_) {
class WatcherInterface {
public:
virtual ~WatcherInterface() = default;
+ // Ownership of \a args is transferred.
virtual void UpdateConfig(grpc_channel_args* args) = 0;
};
virtual ~grpc_server_config_fetcher() = default;
+ // Ownership of \a args is transferred.
virtual void StartWatch(std::string listening_address,
+ grpc_channel_args* args,
std::unique_ptr<WatcherInterface> watcher) = 0;
virtual void CancelWatch(WatcherInterface* watcher) = 0;
virtual grpc_pollset_set* interested_parties() = 0;
#include <grpc/grpc.h>
-const char* grpc_version_string(void) { return "14.0.0"; }
+const char* grpc_version_string(void) { return "15.0.0"; }
-const char* grpc_g_stands_for(void) { return "gecko"; }
+const char* grpc_g_stands_for(void) { return "gummybear"; }
if (shard->count != 0) {
gpr_log(GPR_ERROR, "WARNING: %" PRIuPTR " metadata elements were leaked",
shard->count);
- for (int i = 0; i < shard->capacity; i++) {
+ for (size_t i = 0; i < shard->capacity; i++) {
for (InternedMetadata* md = shard->elems[i].next; md;
md = md->bucket_next()) {
char* key_str = grpc_slice_to_c_string(md->key());
grpc_core::ReleasableMutexLock lock(&ud->mu_user_data);
if (ud->destroy_user_data.Load(grpc_core::MemoryOrder::RELAXED)) {
/* user data can only be set once */
- lock.Unlock();
+ lock.Release();
if (destroy_func != nullptr) {
destroy_func(data);
}
void grpc_mdelem_on_final_unref(grpc_mdelem_data_storage storage, void* ptr,
uint32_t hash DEBUG_ARGS) {
+#ifndef NDEBUG
+ (void)file;
+ (void)line;
+#endif
switch (storage) {
case GRPC_MDELEM_STORAGE_EXTERNAL:
case GRPC_MDELEM_STORAGE_STATIC:
void grpc_lb_policy_xds_cluster_manager_shutdown(void);
void grpc_resolver_xds_init(void);
void grpc_resolver_xds_shutdown(void);
+namespace grpc_core {
+void GoogleCloud2ProdResolverInit();
+void GoogleCloud2ProdResolverShutdown();
+}
#endif
void grpc_register_built_in_plugins(void) {
grpc_lb_policy_xds_cluster_manager_shutdown);
grpc_register_plugin(grpc_resolver_xds_init,
grpc_resolver_xds_shutdown);
+ grpc_register_plugin(grpc_core::GoogleCloud2ProdResolverInit,
+ grpc_core::GoogleCloud2ProdResolverShutdown);
#endif
}
grpc_closure on_handshaker_service_resp_recv;
/* Buffers containing information to be sent (or received) to (or from) the
* handshaker service. */
- grpc_byte_buffer* send_buffer;
- grpc_byte_buffer* recv_buffer;
- grpc_status_code status;
+ grpc_byte_buffer* send_buffer = nullptr;
+ grpc_byte_buffer* recv_buffer = nullptr;
+ grpc_status_code status = GRPC_STATUS_OK;
/* Initial metadata to be received from handshaker service. */
grpc_metadata_array recv_initial_metadata;
/* A callback function provided by an application to be invoked when response
/** callback for receiving handshake call status */
grpc_closure on_status_received;
/** gRPC status code of handshake call */
- grpc_status_code handshake_status_code;
+ grpc_status_code handshake_status_code = GRPC_STATUS_OK;
/** gRPC status details of handshake call */
grpc_slice handshake_status_details;
/* mu synchronizes all fields below including their internal fields. */
- gpr_mu mu;
+ grpc_core::Mutex mu;
/* indicates if the handshaker call's RECV_STATUS_ON_CLIENT op is done. */
- bool receive_status_finished;
+ bool receive_status_finished = false;
/* if non-null, contains arguments to complete a TSI next callback. */
- recv_message_result* pending_recv_message_result;
+ recv_message_result* pending_recv_message_result = nullptr;
/* Maximum frame size used by frame protector. */
size_t max_frame_size;
} alts_grpc_handshaker_client;
grpc_alts_credentials_options_destroy(client->options);
gpr_free(client->buffer);
grpc_slice_unref_internal(client->handshake_status_details);
- gpr_mu_destroy(&client->mu);
- gpr_free(client);
+ delete client;
}
}
gpr_log(GPR_ERROR, "Invalid arguments to alts_handshaker_client_create()");
return nullptr;
}
- alts_grpc_handshaker_client* client =
- static_cast<alts_grpc_handshaker_client*>(gpr_zalloc(sizeof(*client)));
- gpr_mu_init(&client->mu);
+ alts_grpc_handshaker_client* client = new alts_grpc_handshaker_client();
+ memset(&client->base, 0, sizeof(client->base));
+ client->base.vtable =
+ vtable_for_testing == nullptr ? &vtable : vtable_for_testing;
gpr_ref_init(&client->refs, 1);
- client->grpc_caller = grpc_call_start_batch_and_execute;
client->handshaker = handshaker;
+ client->grpc_caller = grpc_call_start_batch_and_execute;
+ grpc_metadata_array_init(&client->recv_initial_metadata);
client->cb = cb;
client->user_data = user_data;
- client->send_buffer = nullptr;
- client->recv_buffer = nullptr;
client->options = grpc_alts_credentials_options_copy(options);
client->target_name = grpc_slice_copy(target_name);
- client->recv_bytes = grpc_empty_slice();
- grpc_metadata_array_init(&client->recv_initial_metadata);
client->is_client = is_client;
- client->max_frame_size = max_frame_size;
+ client->recv_bytes = grpc_empty_slice();
client->buffer_size = TSI_ALTS_INITIAL_BUFFER_SIZE;
client->buffer = static_cast<unsigned char*>(gpr_zalloc(client->buffer_size));
+ client->handshake_status_details = grpc_empty_slice();
+ client->max_frame_size = max_frame_size;
grpc_slice slice = grpc_slice_from_copied_string(handshaker_service_url);
client->call =
strcmp(handshaker_service_url, ALTS_HANDSHAKER_SERVICE_URL_FOR_TESTING) ==
channel, nullptr, GRPC_PROPAGATE_DEFAULTS, interested_parties,
grpc_slice_from_static_string(ALTS_SERVICE_METHOD), &slice,
GRPC_MILLIS_INF_FUTURE, nullptr);
- client->base.vtable =
- vtable_for_testing == nullptr ? &vtable : vtable_for_testing;
GRPC_CLOSURE_INIT(&client->on_handshaker_service_resp_recv, grpc_cb, client,
grpc_schedule_on_exec_ctx);
GRPC_CLOSURE_INIT(&client->on_status_received, on_status_received, client,
tsi_handshaker base;
grpc_slice target_name;
bool is_client;
- bool has_sent_start_message;
- bool has_created_handshaker_client;
+ bool has_sent_start_message = false;
+ bool has_created_handshaker_client = false;
char* handshaker_service_url;
grpc_pollset_set* interested_parties;
grpc_alts_credentials_options* options;
- alts_handshaker_client_vtable* client_vtable_for_testing;
- grpc_channel* channel;
+ alts_handshaker_client_vtable* client_vtable_for_testing = nullptr;
+ grpc_channel* channel = nullptr;
bool use_dedicated_cq;
// mu synchronizes all fields below. Note these are the
// only fields that can be concurrently accessed (due to
// potential concurrency of tsi_handshaker_shutdown and
// tsi_handshaker_next).
- gpr_mu mu;
- alts_handshaker_client* client;
+ grpc_core::Mutex mu;
+ alts_handshaker_client* client = nullptr;
// shutdown effectively follows base.handshake_shutdown,
// but is synchronized by the mutex of this object.
- bool shutdown;
+ bool shutdown = false;
// Maximum frame size used by frame protector.
size_t max_frame_size;
};
grpc_channel_destroy_internal(handshaker->channel);
}
gpr_free(handshaker->handshaker_service_url);
- gpr_mu_destroy(&handshaker->mu);
- gpr_free(handshaker);
+ delete handshaker;
}
static const tsi_handshaker_vtable handshaker_vtable = {
gpr_log(GPR_ERROR, "Invalid arguments to alts_tsi_handshaker_create()");
return TSI_INVALID_ARGUMENT;
}
- alts_tsi_handshaker* handshaker =
- static_cast<alts_tsi_handshaker*>(gpr_zalloc(sizeof(*handshaker)));
- gpr_mu_init(&handshaker->mu);
- handshaker->use_dedicated_cq = interested_parties == nullptr;
- handshaker->client = nullptr;
- handshaker->is_client = is_client;
- handshaker->has_sent_start_message = false;
+ bool use_dedicated_cq = interested_parties == nullptr;
+ alts_tsi_handshaker* handshaker = new alts_tsi_handshaker();
+ memset(&handshaker->base, 0, sizeof(handshaker->base));
+ handshaker->base.vtable =
+ use_dedicated_cq ? &handshaker_vtable_dedicated : &handshaker_vtable;
handshaker->target_name = target_name == nullptr
? grpc_empty_slice()
: grpc_slice_from_static_string(target_name);
- handshaker->interested_parties = interested_parties;
- handshaker->has_created_handshaker_client = false;
+ handshaker->is_client = is_client;
handshaker->handshaker_service_url = gpr_strdup(handshaker_service_url);
+ handshaker->interested_parties = interested_parties;
handshaker->options = grpc_alts_credentials_options_copy(options);
+ handshaker->use_dedicated_cq = use_dedicated_cq;
handshaker->max_frame_size = user_specified_max_frame_size != 0
? user_specified_max_frame_size
: kTsiAltsMaxFrameSize;
- handshaker->base.vtable = handshaker->use_dedicated_cq
- ? &handshaker_vtable_dedicated
- : &handshaker_vtable;
*self = &handshaker->base;
return TSI_OK;
}
size_t unused_bytes_size;
};
static tsi_result fake_handshaker_result_extract_peer(
- const tsi_handshaker_result* self, tsi_peer* peer) {
+ const tsi_handshaker_result* /*self*/, tsi_peer* peer) {
/* Construct a tsi_peer with 1 property: certificate type, security_level. */
tsi_result result = tsi_construct_peer(2, peer);
if (result != TSI_OK) return result;
#include <grpc/slice.h>
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
extern "C" {
#include <openssl/ssl.h>
}
-#pragma clang diagnostic pop
#include "src/core/lib/gprpp/ref_counted.h"
SslSessionLRUCache::SslSessionLRUCache(size_t capacity) : capacity_(capacity) {
GPR_ASSERT(capacity > 0);
- gpr_mu_init(&lock_);
entry_by_key_ = grpc_avl_create(&cache_avl_vtable);
}
node = next;
}
grpc_avl_unref(entry_by_key_, nullptr);
- gpr_mu_destroy(&lock_);
}
size_t SslSessionLRUCache::Size() {
#include <grpc/slice.h>
#include <grpc/support/sync.h>
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
extern "C" {
#include <openssl/ssl.h>
}
-#pragma clang diagnostic pop
#include "src/core/lib/avl/avl.h"
#include "src/core/lib/gprpp/memory.h"
#include "src/core/lib/gprpp/ref_counted.h"
+#include "src/core/lib/gprpp/sync.h"
#include "src/core/tsi/ssl/session_cache/ssl_session.h"
/// Cache for SSL sessions for sessions resumption.
void PushFront(Node* node);
void AssertInvariants();
- gpr_mu lock_;
+ grpc_core::Mutex lock_;
size_t capacity_;
Node* use_order_list_head_ = nullptr;
#include "absl/strings/match.h"
#include "absl/strings/string_view.h"
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
extern "C" {
#include <openssl/bio.h>
#include <openssl/crypto.h> /* For OPENSSL_free */
#include <openssl/x509.h>
#include <openssl/x509v3.h>
}
-#pragma clang diagnostic pop
#include "src/core/lib/gpr/useful.h"
#include "src/core/tsi/ssl/session_cache/ssl_session_cache.h"
#include "absl/strings/string_view.h"
#include "src/core/tsi/transport_security_interface.h"
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wmodule-import-in-extern-c"
extern "C" {
#include <openssl/x509.h>
}
-#pragma clang diagnostic pop
/* Value for the TSI_CERTIFICATE_TYPE_PEER_PROPERTY property for X509 certs. */
#define TSI_X509_CERTIFICATE_TYPE "X509"
grpc_google_default_credentials_create(nullptr));
}
-namespace experimental {
-
std::shared_ptr<CallCredentials> ExternalAccountCredentials(
const grpc::string& json_string, const std::vector<grpc::string>& scopes) {
grpc::GrpcLibraryCodegen init; // To call grpc_init().
json_string.c_str(), absl::StrJoin(scopes, ",").c_str()));
}
-} // namespace experimental
-
// Builds SSL Credentials given SSL specific options
std::shared_ptr<ChannelCredentials> SslCredentials(
const SslCredentialsOptions& options) {
grpc_tls_server_authorization_check_config_release(c_config_);
}
-TlsCredentialsOptions::TlsCredentialsOptions(
- std::shared_ptr<CertificateProviderInterface> certificate_provider)
- : certificate_provider_(std::move(certificate_provider)) {
+TlsCredentialsOptions::TlsCredentialsOptions() {
c_credentials_options_ = grpc_tls_credentials_options_create();
+}
+
+void TlsCredentialsOptions::set_certificate_provider(
+ std::shared_ptr<CertificateProviderInterface> certificate_provider) {
+ certificate_provider_ = std::move(certificate_provider);
if (certificate_provider_ != nullptr) {
grpc_tls_credentials_options_set_certificate_provider(
c_credentials_options_, certificate_provider_->c_provider());
#include <grpcpp/grpcpp.h>
namespace grpc {
-std::string Version() { return "1.35.0"; }
+std::string Version() { return "1.36.0"; }
} // namespace grpc
namespace grpc {
-grpc_error* CensusChannelData::Init(grpc_channel_element* elem,
- grpc_channel_element_args* args) {
+grpc_error* CensusChannelData::Init(grpc_channel_element* /*elem*/,
+ grpc_channel_element_args* /*args*/) {
return GRPC_ERROR_NONE;
}
return GRPC_ERROR_NONE;
}
-void CensusClientCallData::Destroy(grpc_call_element* elem,
+void CensusClientCallData::Destroy(grpc_call_element* /*elem*/,
const grpc_call_final_info* final_info,
- grpc_closure* then_call_closure) {
+ grpc_closure* /*then_call_closure*/) {
const uint64_t request_size = GetOutgoingDataSize(final_info);
const uint64_t response_size = GetIncomingDataSize(final_info);
double latency_ms = absl::ToDoubleMilliseconds(absl::Now() - start_time_);
using ::opencensus::trace::Span;
using ::opencensus::trace::SpanContext;
-void GenerateServerContext(absl::string_view tracing, absl::string_view stats,
- absl::string_view primary_role,
- absl::string_view method, CensusContext* context) {
+void GenerateServerContext(absl::string_view tracing, absl::string_view method,
+ CensusContext* context) {
// Destruct the current CensusContext to free the Span memory before
// overwriting it below.
context->~CensusContext();
tracing_buf_size);
}
-size_t StatsContextSerialize(size_t max_tags_len, grpc_slice* tags) {
+size_t StatsContextSerialize(size_t /*max_tags_len*/, grpc_slice* /*tags*/) {
// TODO(unknown): Add implementation. Waiting on stats tagging to be added.
return 0;
}
// Deserialize the incoming SpanContext and generate a new server context based
// on that. This new span will never be a root span. This should only be called
// with a blank CensusContext as it overwrites it.
-void GenerateServerContext(absl::string_view tracing, absl::string_view stats,
- absl::string_view primary_role,
- absl::string_view method, CensusContext* context);
+void GenerateServerContext(absl::string_view tracing, absl::string_view method,
+ CensusContext* context);
// Creates a new client context that is by default a new root context.
// If the current context is the default context then the newly created
size_t tracing_str_len = GRPC_SLICE_IS_EMPTY(sml.tracing_slice)
? 0
: GRPC_SLICE_LENGTH(sml.tracing_slice);
- const char* census_str = GRPC_SLICE_IS_EMPTY(sml.census_proto)
- ? ""
- : reinterpret_cast<const char*>(
- GRPC_SLICE_START_PTR(sml.census_proto));
- size_t census_str_len = GRPC_SLICE_IS_EMPTY(sml.census_proto)
- ? 0
- : GRPC_SLICE_LENGTH(sml.census_proto);
-
GenerateServerContext(absl::string_view(tracing_str, tracing_str_len),
- absl::string_view(census_str, census_str_len),
- /*primary_role*/ "", calld->qualified_method_,
- &calld->context_);
-
+ calld->qualified_method_, &calld->context_);
grpc_slice_unref_internal(sml.tracing_slice);
grpc_slice_unref_internal(sml.census_proto);
grpc_slice_unref_internal(sml.path);
return GRPC_ERROR_NONE;
}
-void CensusServerCallData::Destroy(grpc_call_element* elem,
+void CensusServerCallData::Destroy(grpc_call_element* /*elem*/,
const grpc_call_final_info* final_info,
- grpc_closure* then_call_closure) {
+ grpc_closure* /*then_call_closure*/) {
const uint64_t request_size = GetOutgoingDataSize(final_info);
const uint64_t response_size = GetIncomingDataSize(final_info);
double elapsed_time_ms = absl::ToDoubleMilliseconds(elapsed_time_);
if (!callbacks_.empty()) {
auto cb = callbacks_.front();
callbacks_.pop();
- lock.Unlock();
+ lock.Release();
cb();
} else if (shutdown_) {
break;
DynamicThreadPool::~DynamicThreadPool() {
grpc_core::MutexLock lock(&mu_);
shutdown_ = true;
- cv_.Broadcast();
+ cv_.SignalAll();
while (nthreads_ != 0) {
shutdown_cv_.Wait(&mu_);
}
#include <grpc/impl/codegen/port_platform.h>
+#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <chrono>
GPR_ASSERT(lb_id >= 0);
// Convert to padded hex string for a 32-bit LB ID. E.g, "0000ca5b".
char buf[kLbIdLength + 1];
- snprintf(buf, sizeof(buf), "%08lx", lb_id);
+ snprintf(buf, sizeof(buf), "%08" PRIx64, lb_id);
std::string lb_id_str(buf, kLbIdLength);
// The client may send requests with LB ID that has never been allocated
// by this load reporter. Those IDs are tracked and will be skipped when
double cpu_limit = newest->cpu_limit - oldest->cpu_limit;
std::chrono::duration<double> duration_seconds =
newest->end_time - oldest->end_time;
- lock.Unlock();
+ lock.Release();
::grpc::lb::v1::LoadBalancingFeedback feedback;
feedback.set_server_utilization(static_cast<float>(cpu_usage / cpu_limit));
feedback.set_calls_per_second(
#include <grpc/support/port_platform.h>
+#include <inttypes.h>
+
#include "absl/memory/memory.h"
#include "src/cpp/server/load_reporter/load_reporter_async_service_impl.h"
{
grpc_core::ReleasableMutexLock lock(&service_->cq_shutdown_mu_);
if (service_->shutdown_) {
- lock.Unlock();
+ lock.Release();
Shutdown(std::move(self), "OnRequestDelivered");
return;
}
load_report_interval_ms_ =
static_cast<unsigned long>(load_report_interval.seconds() * 1000 +
load_report_interval.nanos() / 1000);
- gpr_log(
- GPR_INFO,
- "[LRS %p] Initial request received. Start load reporting (load "
- "balanced host: %s, interval: %lu ms, lb_id_: %s, handler: %p)...",
- service_, load_balanced_hostname_.c_str(), load_report_interval_ms_,
- lb_id_.c_str(), this);
+ gpr_log(GPR_INFO,
+ "[LRS %p] Initial request received. Start load reporting (load "
+ "balanced host: %s, interval: %" PRIu64
+ " ms, lb_id_: %s, handler: %p)...",
+ service_, load_balanced_hostname_.c_str(),
+ load_report_interval_ms_, lb_id_.c_str(), this);
SendReport(self, true /* ok */);
// Expect this read to fail.
{
grpc_core::ReleasableMutexLock lock(&service_->cq_shutdown_mu_);
if (service_->shutdown_) {
- lock.Unlock();
+ lock.Release();
Shutdown(std::move(self), "OnReadDone");
return;
}
{
grpc_core::ReleasableMutexLock lock(&service_->cq_shutdown_mu_);
if (service_->shutdown_) {
- lock.Unlock();
+ lock.Release();
Shutdown(std::move(self), "ScheduleNextReport");
return;
}
{
grpc_core::ReleasableMutexLock lock(&service_->cq_shutdown_mu_);
if (service_->shutdown_) {
- lock.Unlock();
+ lock.Release();
Shutdown(std::move(self), "SendReport");
return;
}
void LoadReporterAsyncServiceImpl::ReportLoadHandler::OnFinishDone(
// NOLINTNEXTLINE(performance-unnecessary-value-param)
- std::shared_ptr<ReportLoadHandler> self, bool ok) {
+ std::shared_ptr<ReportLoadHandler> /*self*/, bool ok) {
if (ok) {
gpr_log(GPR_INFO,
"[LRS %p] Load reporting finished (lb_id_: %s, handler: %p).",
}
void LoadReportingServiceServerBuilderPlugin::Finish(
- grpc::ServerInitializer* si) {
+ grpc::ServerInitializer* /*si*/) {
service_->StartThread();
service_.reset();
}
// Starts the load reporter service.
void Finish(ServerInitializer* si) override;
- void ChangeArguments(const std::string& name, void* value) override {}
- void UpdateChannelArguments(grpc::ChannelArguments* args) override {}
+ void ChangeArguments(const std::string& /*name*/, void* /*value*/) override {}
+ void UpdateChannelArguments(grpc::ChannelArguments* /*args*/) override {}
bool has_sync_methods() const override;
bool has_async_methods() const override;
}
#endif
+ServerBuilder& ServerBuilder::experimental_type::SetContextAllocator(
+ std::unique_ptr<grpc::ContextAllocator> context_allocator) {
+ builder_->context_allocator_ = std::move(context_allocator);
+ return *builder_;
+}
+
std::unique_ptr<grpc::experimental::ExternalConnectionAcceptor>
ServerBuilder::experimental_type::AddExternalConnectionAcceptor(
experimental_type::ExternalConnectionType type,
return nullptr;
}
+#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+ server->RegisterContextAllocator(std::move(context_allocator_));
+#else
+ server->experimental_registration()->RegisterContextAllocator(
+ std::move(context_allocator_));
+#endif
+
for (const auto& value : services_) {
if (!server->RegisterService(value->host.get(), value->service)) {
return nullptr;
method->method_type() ==
grpc::internal::RpcMethod::SERVER_STREAMING),
cq_(cq),
- tag_(this) {
+ tag_(this),
+ ctx_(server_->context_allocator() != nullptr
+ ? server_->context_allocator()->NewCallbackServerContext()
+ : nullptr) {
CommonSetup(server, data);
data->deadline = &deadline_;
data->optional_payload = has_request_payload_ ? &request_payload_ : nullptr;
has_request_payload_(false),
call_details_(new grpc_call_details),
cq_(cq),
- tag_(this) {
+ tag_(this),
+ ctx_(server_->context_allocator() != nullptr
+ ? server_->context_allocator()
+ ->NewGenericCallbackServerContext()
+ : nullptr) {
CommonSetup(server, data);
grpc_call_details_init(call_details_);
data->details = call_details_;
if (has_request_payload_ && request_payload_) {
grpc_byte_buffer_destroy(request_payload_);
}
+ if (server_->context_allocator() == nullptr || ctx_alloc_by_default_) {
+ delete ctx_;
+ }
server_->UnrefWithPossibleNotify();
}
}
// Bind the call, deadline, and metadata from what we got
- req_->ctx_.set_call(req_->call_);
- req_->ctx_.cq_ = req_->cq_;
- req_->ctx_.BindDeadlineAndMetadata(req_->deadline_,
- &req_->request_metadata_);
+ req_->ctx_->set_call(req_->call_);
+ req_->ctx_->cq_ = req_->cq_;
+ req_->ctx_->BindDeadlineAndMetadata(req_->deadline_,
+ &req_->request_metadata_);
req_->request_metadata_.count = 0;
// Create a C++ Call to control the underlying core call
grpc::internal::Call(
req_->call_, req_->server_, req_->cq_,
req_->server_->max_receive_message_size(),
- req_->ctx_.set_server_rpc_info(
+ req_->ctx_->set_server_rpc_info(
req_->method_name(),
(req_->method_ != nullptr)
? req_->method_->method_type()
grpc::experimental::InterceptionHookPoints::
POST_RECV_INITIAL_METADATA);
req_->interceptor_methods_.SetRecvInitialMetadata(
- &req_->ctx_.client_metadata_);
+ &req_->ctx_->client_metadata_);
if (req_->has_request_payload_) {
// Set interception point for RECV MESSAGE
? req_->method_->handler()
: req_->server_->generic_handler_.get();
handler->RunHandler(grpc::internal::MethodHandler::HandlerParameter(
- call_, &req_->ctx_, req_->request_, req_->request_status_,
+ call_, req_->ctx_, req_->request_, req_->request_status_,
req_->handler_data_, [this] { delete req_; }));
}
};
data->tag = &tag_;
data->call = &call_;
data->initial_metadata = &request_metadata_;
+ if (ctx_ == nullptr) {
+ // TODO(ddyihai): allocate the context with grpc_call_arena_alloc.
+ ctx_ = new ServerContextType();
+ ctx_alloc_by_default_ = true;
+ }
+ ctx_->set_context_allocator(server->context_allocator());
}
Server* const server_;
gpr_timespec deadline_;
grpc_metadata_array request_metadata_;
grpc::CompletionQueue* const cq_;
+ bool ctx_alloc_by_default_ = false;
CallbackCallTag tag_;
- ServerContextType ctx_;
+ ServerContextType* ctx_ = nullptr;
grpc::internal::InterceptorBatchMethodsImpl interceptor_methods_;
};
if (*status) {
deadline_ = call_details_->deadline;
// TODO(yangg) remove the copy here
- ctx_.method_ = grpc::StringFromCopiedSlice(call_details_->method);
- ctx_.host_ = grpc::StringFromCopiedSlice(call_details_->host);
+ ctx_->method_ = grpc::StringFromCopiedSlice(call_details_->method);
+ ctx_->host_ = grpc::StringFromCopiedSlice(call_details_->host);
}
grpc_slice_unref(call_details_->method);
grpc_slice_unref(call_details_->host);
template <>
const char* Server::CallbackRequest<
grpc::GenericCallbackServerContext>::method_name() const {
- return ctx_.method().c_str();
+ return ctx_->method().c_str();
}
// Implementation of ThreadManager. Each instance of SyncRequestThreadManager
#include <grpcpp/security/server_credentials.h>
+#include <grpcpp/impl/grpc_library.h>
+
namespace grpc {
+static internal::GrpcLibraryInitializer g_gli_initializer;
+ServerCredentials::ServerCredentials() { g_gli_initializer.summon(); }
+
ServerCredentials::~ServerCredentials() {}
} // namespace grpc
bool ok;
WorkStatus work_status = PollForWork(&tag, &ok);
- grpc_core::ReleasableMutexLock lock(&mu_);
+ grpc_core::LockableAndReleasableMutexLock lock(&mu_);
// Reduce the number of pollers by 1 and check what happened with the poll
num_pollers_--;
bool done = false;
max_active_threads_sofar_ = num_threads_;
}
// Drop lock before spawning thread to avoid contention
- lock.Unlock();
+ lock.Release();
WorkerThread* worker = new WorkerThread(this);
if (worker->created()) {
worker->Start();
// There is still at least some thread polling, so we can go on
// even though we are below the number of pollers that we would
// like to have (min_pollers_)
- lock.Unlock();
+ lock.Release();
} else {
// There are no pollers to spare and we couldn't allocate
// a new thread, so resources are exhausted!
- lock.Unlock();
+ lock.Release();
resource_exhausted = true;
}
} else {
// There are a sufficient number of pollers available so we can do
// the work and continue polling with our existing poller threads
- lock.Unlock();
+ lock.Release();
}
// Lock is always released at this point - do the application work
// or return resource exhausted if there is new work but we couldn't
*/
#include <grpcpp/support/error_details.h>
-
-#include "src/proto/grpc/status/status.pb.h"
-
-namespace grpc {
-
-grpc::Status ExtractErrorDetails(const grpc::Status& from,
- ::google::rpc::Status* to) {
- if (to == nullptr) {
- return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "");
- }
- if (!to->ParseFromString(from.error_details())) {
- return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT, "");
- }
- return grpc::Status::OK;
-}
-
-grpc::Status SetErrorDetails(const ::google::rpc::Status& from,
- grpc::Status* to) {
- if (to == nullptr) {
- return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, "");
- }
- grpc::StatusCode code = grpc::StatusCode::UNKNOWN;
- if (from.code() >= grpc::StatusCode::OK &&
- from.code() <= grpc::StatusCode::UNAUTHENTICATED) {
- code = static_cast<grpc::StatusCode>(from.code());
- }
- *to = grpc::Status(code, from.message(), from.SerializeAsString());
- return grpc::Status::OK;
-}
-
-} // namespace grpc
/// <summary>
/// Current <c>AssemblyFileVersion</c> of gRPC C# assemblies
/// </summary>
- public const string CurrentAssemblyFileVersion = "2.35.0.0";
+ public const string CurrentAssemblyFileVersion = "2.36.0.0";
/// <summary>
/// Current version of gRPC C#
/// </summary>
- public const string CurrentVersion = "2.35.0";
+ public const string CurrentVersion = "2.36.0";
}
}
/// </summary>
internal sealed class NativeExtension
{
+ // Enviroment variable can be used to force loading the native extension from given location.
+ private const string CsharpExtOverrideLocationEnvVarName = "GRPC_CSHARP_EXT_OVERRIDE_LOCATION";
static readonly ILogger Logger = GrpcEnvironment.Logger.ForType<NativeExtension>();
static readonly object staticLock = new object();
static volatile NativeExtension instance;
}
/// <summary>
- /// Detects which configuration of native extension to load and load it.
+ /// Detects which configuration of native extension to load and explicitly loads the dynamic library.
+ /// The explicit load makes sure that we can detect any loading problems early on.
/// </summary>
- private static NativeMethods LoadNativeMethodsLegacyNetFramework()
+ private static NativeMethods LoadNativeMethodsUsingExplicitLoad()
{
- // TODO: allow customizing path to native extension (possibly through exposing a GrpcEnvironment property).
- // See https://github.com/grpc/grpc/pull/7303 for one option.
+ // NOTE: a side effect of searching the native extension's library file relatively to the assembly location is that when Grpc.Core assembly
+ // is loaded via reflection from a different app's context, the native extension is still loaded correctly
+ // (while if we used [DllImport], the native extension won't be on the other app's search path for shared libraries).
var assemblyDirectory = GetAssemblyDirectory();
// With "classic" VS projects, the native libraries get copied using a .targets rule to the build output folder
// alongside the compiled assembly.
+ // With dotnet SDK projects targeting net45 framework, the native libraries (just the required ones)
+ // are similarly copied to the built output folder, through the magic of Microsoft.NETCore.Platforms.
var classicPath = Path.Combine(assemblyDirectory, GetNativeLibraryFilename());
+ // With dotnet SDK project targeting netcoreappX.Y, projects will use Grpc.Core assembly directly in the location where it got restored
+ // by nuget. We locate the native libraries based on known structure of Grpc.Core nuget package.
+ // When "dotnet publish" is used, the runtimes directory is copied next to the published assemblies.
+ string runtimesDirectory = string.Format("runtimes/{0}/native", GetRuntimeIdString());
+ var netCorePublishedAppStylePath = Path.Combine(assemblyDirectory, runtimesDirectory, GetNativeLibraryFilename());
+ var netCoreAppStylePath = Path.Combine(assemblyDirectory, "../..", runtimesDirectory, GetNativeLibraryFilename());
+
// Look for the native library in all possible locations in given order.
- string[] paths = new[] { classicPath };
+ string[] paths = new[] { classicPath, netCorePublishedAppStylePath, netCoreAppStylePath};
- // TODO(jtattermusch): the UnmanagedLibrary mechanism for loading the native extension while avoiding
- // direct use of DllImport is quite complicated and is currently only needed to cover some niche scenarios
- // (such legacy .NET Framework projects that use assembly shadowing) - everything else can be covered
- // by using the [DllImport]. We should investigate the possibility of eliminating UnmanagedLibrary completely
- // in the future.
+ // The UnmanagedLibrary mechanism for loading the native extension while avoiding
+ // direct use of DllImport is quite complicated but it is currently needed to ensure:
+ // 1.) the native extension is loaded eagerly (needed to avoid startup issues)
+ // 2.) less common scenarios (such as loading Grpc.Core.dll by reflection) still work
+ // 3.) loading native extension from an arbitrary location when set by an enviroment variable
+ // TODO(jtattermusch): revisit the possibility of eliminating UnmanagedLibrary completely in the future.
return new NativeMethods(new UnmanagedLibrary(paths));
}
/// <summary>
+ /// Loads native methods using the <c>[DllImport(LIBRARY_NAME)]</c> attributes.
+ /// Note that this way of loading the native extension is "lazy" and doesn't
+ /// detect any "missing library" problems until we actually try to invoke the native methods
+ /// (which could be too late and could cause weird hangs at startup)
+ /// </summary>
+ private static NativeMethods LoadNativeMethodsUsingDllImports()
+ {
+ // While in theory, we could just use [DllImport("grpc_csharp_ext")] for all the platforms
+ // and operating systems, the native libraries in the nuget package
+ // need to be laid out in a way that still allows things to work well under
+ // the legacy .NET Framework (where native libraries are a concept unknown to the runtime).
+ // Therefore, we use several flavors of the DllImport attribute
+ // (e.g. the ".x86" vs ".x64" suffix) and we choose the one we want at runtime.
+ // The classes with the list of DllImport'd methods are code generated,
+ // so having more than just one doesn't really bother us.
+
+ // on Windows, the DllImport("grpc_csharp_ext.x64") doesn't work
+ // but DllImport("grpc_csharp_ext.x64.dll") does, so we need a special case for that.
+ // See https://github.com/dotnet/coreclr/pull/17505 (fixed in .NET Core 3.1+)
+ bool useDllSuffix = PlatformApis.IsWindows;
+ if (PlatformApis.Is64Bit)
+ {
+ if (useDllSuffix)
+ {
+ return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x64_dll());
+ }
+ return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x64());
+ }
+ else
+ {
+ if (useDllSuffix)
+ {
+ return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x86_dll());
+ }
+ return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x86());
+ }
+ }
+
+ /// <summary>
/// Loads native extension and return native methods delegates.
/// </summary>
private static NativeMethods LoadNativeMethods()
{
return LoadNativeMethodsXamarin();
}
- if (PlatformApis.IsNetCore)
+
+ // Override location of grpc_csharp_ext native library with an environment variable
+ // Use at your own risk! By doing this you take all the responsibility that the dynamic library
+ // is of the correct version (needs to match the Grpc.Core assembly exactly) and of the correct platform/architecture.
+ var nativeExtPathFromEnv = System.Environment.GetEnvironmentVariable(CsharpExtOverrideLocationEnvVarName);
+ if (!string.IsNullOrEmpty(nativeExtPathFromEnv))
{
- // On .NET Core, native libraries are a supported feature and the SDK makes
- // sure that the native library is made available in the right location and that
- // they will be discoverable by the [DllImport] default loading mechanism,
- // even in some of the more exotic situations such as single file apps.
- //
- // While in theory, we could just [DllImport("grpc_csharp_ext")] for all the platforms
- // and operating systems, the native libraries in the nuget package
- // need to be laid out in a way that still allows things to work well under
- // the legacy .NET Framework (where native libraries are a concept unknown to the runtime).
- // Therefore, we use several flavors of the DllImport attribute
- // (e.g. the ".x86" vs ".x64" suffix) and we choose the one we want at runtime.
- // The classes with the list of DllImport'd methods are code generated,
- // so having more than just one doesn't really bother us.
+ return new NativeMethods(new UnmanagedLibrary(new string[] { nativeExtPathFromEnv }));
+ }
- // on Windows, the DllImport("grpc_csharp_ext.x64") doesn't work for some reason,
- // but DllImport("grpc_csharp_ext.x64.dll") does, so we need a special case for that.
- bool useDllSuffix = PlatformApis.IsWindows;
- if (PlatformApis.Is64Bit)
- {
- if (useDllSuffix)
- {
- return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x64_dll());
- }
- return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x64());
- }
- else
- {
- if (useDllSuffix)
- {
- return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x86_dll());
- }
- return new NativeMethods(new NativeMethods.DllImportsFromSharedLib_x86());
- }
+ if (IsNet5SingleFileApp())
+ {
+ // Ideally we'd want to always load the native extension explicitly
+ // (to detect any potential problems early on and to avoid hard-to-debug startup issues)
+ // but the mechanism we normally use doesn't work when running
+ // as a single file app (see https://github.com/grpc/grpc/pull/24744).
+ // Therefore in this case we simply rely
+ // on the automatic [DllImport] loading logic to do the right thing.
+ return LoadNativeMethodsUsingDllImports();
}
- return LoadNativeMethodsLegacyNetFramework();
+ return LoadNativeMethodsUsingExplicitLoad();
}
/// <summary>
// Assembly.EscapedCodeBase does not exist under CoreCLR, but assemblies imported from a nuget package
// don't seem to be shadowed by DNX-based projects at all.
var assemblyLocation = assembly.Location;
- if (!string.IsNullOrEmpty(assemblyLocation))
+ if (string.IsNullOrEmpty(assemblyLocation))
{
- return Path.GetDirectoryName(assemblyLocation);
+ // In .NET5 single-file deployments, assembly.Location won't be available
+ // and we can use it for detecting whether we are running as a single file app.
+ // Also see https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file#other-considerations
+ return null;
}
- // In .NET5 single-file deployments, assembly.Location won't be available
- // Also see https://docs.microsoft.com/en-us/dotnet/core/deploying/single-file#other-considerations
- return AppContext.BaseDirectory;
+ return Path.GetDirectoryName(assemblyLocation);
#else
// If assembly is shadowed (e.g. in a webapp), EscapedCodeBase is pointing
// to the original location of the assembly, and Location is pointing
#endif
}
+ private static bool IsNet5SingleFileApp()
+ {
+ // Use a heuristic that GetAssemblyDirectory() will return null for single file apps.
+ return PlatformApis.IsNet5OrHigher && GetAssemblyDirectory() == null;
+ }
+
#if !NETSTANDARD
private static bool IsFileUri(string uri)
{
static readonly bool isMacOSX;
static readonly bool isWindows;
static readonly bool isMono;
+ static readonly bool isNet5OrHigher;
static readonly bool isNetCore;
static readonly string unityApplicationPlatform;
static readonly bool isXamarin;
isLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
isMacOSX = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);
isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
- isNetCore =
#if NETSTANDARD2_0
- Environment.Version.Major >= 5 ||
+ isNet5OrHigher = Environment.Version.Major >= 5;
+#else
+ // assume that on .NET 5+, the netstandard2.0 TFM is going to be selected.
+ isNet5OrHigher = false;
#endif
- RuntimeInformation.FrameworkDescription.StartsWith(".NET Core");
+ isNetCore = isNet5OrHigher || RuntimeInformation.FrameworkDescription.StartsWith(".NET Core");
#else
var platform = Environment.OSVersion.Platform;
isMacOSX = (platform == PlatformID.Unix && GetUname() == "Darwin");
isLinux = (platform == PlatformID.Unix && !isMacOSX);
isWindows = (platform == PlatformID.Win32NT || platform == PlatformID.Win32S || platform == PlatformID.Win32Windows);
+ isNet5OrHigher = false;
isNetCore = false;
#endif
isMono = Type.GetType("Mono.Runtime") != null;
public static bool IsXamarinAndroid => isXamarinAndroid;
/// <summary>
- /// true if running on .NET Core (CoreCLR), false otherwise.
+ /// true if running on .NET 5+, false otherwise.
+ /// </summary>
+ public static bool IsNet5OrHigher => isNet5OrHigher;
+
+ /// <summary>
+ /// true if running on .NET Core (CoreCLR) or NET 5+, false otherwise.
/// </summary>
public static bool IsNetCore => isNetCore;
<!-- This file is generated -->
<Project>
<PropertyGroup>
- <GrpcCsharpVersion>2.35.0</GrpcCsharpVersion>
+ <GrpcCsharpVersion>2.36.0</GrpcCsharpVersion>
<GoogleProtobufVersion>3.14.0</GoogleProtobufVersion>
</PropertyGroup>
</Project>
const grpc_op* ops,
size_t nops, void* tag,
void* reserved) {
+ (void)call;
+ (void)ops;
+ (void)nops;
+ (void)tag;
+ (void)reserved;
return GRPC_CALL_OK;
}
grpc_call* call, grpcsharp_batch_context* ctx,
grpc_slice_buffer* send_buffer, uint32_t write_flags,
grpc_metadata_array* initial_metadata, uint32_t initial_metadata_flags) {
+ (void)call;
+ (void)write_flags;
+ (void)initial_metadata_flags;
// prepare as if we were performing a normal RPC.
grpc_byte_buffer* send_message =
grpcsharp_create_byte_buffer_from_stolen_slices(send_buffer);
grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX],
size_t* num_creds_md, grpc_status_code* status,
const char** error_details) {
+ (void)creds_md;
+ (void)num_creds_md;
+ (void)status;
+ (void)error_details;
// the "context" object and its contents are only guaranteed to live until
// this handler returns (which could result in use-after-free for async
// handling of the callback), so the C# counterpart of this handler
# exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed
# before them.
s.name = '!ProtoCompiler-gRPCCppPlugin'
- v = '1.35.0'
+ v = '1.36.0'
s.version = v
s.summary = 'The gRPC ProtoC plugin generates C++ files from .proto services.'
s.description = <<-DESC
# exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed
# before them.
s.name = '!ProtoCompiler-gRPCPlugin'
- v = '1.35.0'
+ v = '1.36.0'
s.version = v
s.summary = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.'
s.description = <<-DESC
Pod::Spec.new do |s|
s.name = 'BoringSSL-GRPC'
- version = '0.0.14'
+ version = '0.0.16'
s.version = version
s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.'
# Adapted from the homepage:
s.source = {
:git => 'https://github.com/google/boringssl.git',
- :commit => "29c6e0e27268f5a43e039cd2ed4e849d6b736fc1",
+ :commit => "067cfd92f4d7da0edfa073b096d090b98a83b860",
}
s.ios.deployment_target = '9.0'
# the correct location in BoringSSL.
base64 -D <<EOF | gunzip > src/include/openssl/boringssl_prefix_symbols.h
H4sICAAAAAAC/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAKydXXPbuJZo3+dXuO683Kk6NRM7nbT7
- vim20tG0Y/tIck9nXliUSNk8oUiFoOy4f/0FSIrEx94g94arTs10LK61SRDEF0Hgv/7r7DEt0iqu0+Rs
- 89r/I9qUVVY8CpFHhyrdZT+jpzRO0uo/xdNZWZx9an5drW7OtuV+n9X/7+zit+3H9F168evFx8vdh/iX
- 9+m7979tk4s0+SW9/OW35OPm1/cfd9vzf/u3//qvs6vy8Fplj0/12f/d/sfZxbvzy3+c/V6Wj3l6tii2
- /ykPUUfdp9U+EyKT8ery7CjSf8hoh9d/nO3LJNvJ/x8XyX+V1VmSibrKNsc6PaufMnEmyl39Elfp2U7+
- GBevynU4VodSpGcvWS0voGr+f3msz3ZpeiaRp7RK1dVXcSET4h9nh6p8zhKZJPVTXMv/k57Fm/I5VaZt
- f+5FWWfbVJ1FG/cwnO/pp8MhjauzrDiL81yRWSpOV7f+Mj9b3X1e/89sOT9brM7ul3d/Lq7n12f/Z7aS
- //4/Z7Pb6+ag2cP6y93y7HqxurqZLb6uzmY3N2eSWs5u14v5Srn+Z7H+crac/z5bSuROUtI3uG+vbh6u
- F7e/N+Di6/3NQkYZBGd3n5Xj63x59UX+ZfZpcbNYf2vCf16sb+er1X9Kx9nt3dn8z/nt+mz1RXm0M/s0
- P7tZzD7dzM8+y3/Nbr8p3ep+frWY3fxDnvdyfrX+h1Sc/ksedHV3u5r/80Hq5DFn17Ovs9/ViTT06Z/N
- hX2ZrVd3Mu5SXt7q4WatLuPz8u7r2c3dSp352cNqLmPM1jNFyzSUp7z6h+Tm8gSX6rxn8n9X68XdrfJJ
- QIZeL2fqPG7nv98sfp/fXs0Ve9cA67ulPPZh1TH/OJstFysV9O5hreg75Wyy8N3t7bw5pk19lR7yXJqz
- mC9lQnydNeLP5t34zyb/f7pbSqd8fKLZ9XV0v5x/Xvx1dohFnYqz+qU8k1mvqLNdllZCZh6Z+csilTeh
- VllMZuq9UH9QoqxWT6vKceXubB9vq/Is/XmIiyYTyv9ltTiLq8fjXvrE2SaVcNoEkk/vf/7bvyfyyS5S
- 8HT+b/yPs81/gD9FC3npy/YAr0M/8Cw++/d/P4vU/9n820At7qJdJEsZ+ByGP7Z/+McA/IfhEGlNtXTI
- 4Lle36yibZ7JpIr2qSwekqk6l7SsDB3oEWn1nFYcnUFaVlUWRpvjbiezG8cN8GaE5/Pogp+yLg3YmVrU
- x05pl3bsISnhT4dHmafrbJ+qmo3m1UjH+iRruDxlik3YcbMSAbn6kHvmv2OqrMiKrM7i/HQlUXLsSl5q
- IFw1xJ0vl1FexkmkDKp1I5tiUwNB7GC+u5/fqh/UOVCKTJsbjPfzr1GVdvFWsrmg6sSJVogFzJusDLJb
- vBnhpZK1KFfvwJA74PRBwRBD/fFqcS9bLlGSim2VHShZEqZBuyof4qMs54ssYeh1HPVvVGuF51Yo6t1m
- B9m+DzjzQYDGSLLHVNQBMQYBGoPt9ji//4yKeJ8yxR3ttbPPuoVR9z7+GckiW/Dyu2XAo2RFaJTBgEYJ
- uAXe9D9Uu4Ab0NEee1mX2zKPAiL0BjRKtduGpM8JR/3PcX7kyhsWNwflG1+eyUQUy3qNYe5IzLrJy+33
- rrzj2XUDGEXUskUYVwn3phq8FeHu630UJ0m0LfeHKm2GYojNwRENEG9XpSlwpCBHxERATJk/3tHTzyBh
- 65tcCOJBImYJK0CWID5uskCpsv5L5YN30fYplqX4Nq1qktnFQf95mP98zN/8YtyROH9kBAI9SMS2m3o1
- Y4U5wbA7/VlXcViSOQ44kmgvkxOgQ13v9imV5eOhyp7VKPv39JVqdwRAjLa9Kq/tsSqPB3IEEwf8eRpX
- WuoJcgRbgMWw7xMzkqPB4u3LJOWFUCRmLZt+FfPcO9h1p0W8ydOo3IqDqhQPuezoU0NADjSSyB6LtCsF
- 1NCFBPYHwQwJy9DYdS7U/SuKlNzcxCRurF1+FE+nR5d8YSYN2GX9TnZKxjU1lbhKuWyXbWUpQLXaPBZB
- PS88tyJ9Vt7DbPNIhENcxXuWuyExa1viMkpsCwf97YMgavV+hq7XaMTe5/pou2EF0AVIjKbaECx7iyLe
- U3MgyjNRs/SGAY4i/xQfc9kljYV44aaSI5kYKzqKtEriOn6ToL0Njp7+jLihOhT1FumLbDYk6U+mvOex
- CIGtAVACx8qKXRlt4zzfxNvvnDiGAI4hC4O8fAyKYingOGqgqykhuA+QIcBjNMM5rGEPTILEkrcuPJYt
- QWIxWoQnDjYyW4MaCnt/HDP1SvvpWCflCytJTAMcpXmfEj9RR58cGrZ3rSeZn2U3h532rgWORnyjCaCI
- NxeylJHHbL+3jyjrZrsWOJrMvtnuNagUsRTeOEl6qJ8CgjS8NwL3tmu462/eiHZH5OU2Zj2DoMSNVaSy
- Z1PvD9FyRR4A0VnI/EIXvrieKt2Xzyl3gMOkXbv6IYq3W3mnqWoN9Xqjx7JMAuQN749QpUX6WNYZo4OF
- aJB4bTG1O+Y5K86AY/5N9JTRG0s6i5lL2SnY8m5yx/rN/NusC0ZihN5owINEbDojze0S2d+8YKbCE6c5
- cMOO0eIev2qrB/hb3OPvCpmAEL0BicJ+KDxPhJoAnPKsLYp4i+N+Q3wlZ6KIV4TnSDElR4qwHCnGcqQI
- y5FiLEeK4BwpJuTIrlXJyz8nGHLX77oJmtGhLBnVjMkjEVjjhcIzXtj+dhq8ETx1jyP+U9uXPf4GW8Bo
- 5+w0OvekkfztWD1zSp0e9XpZwwY2j0RgjdUOJGIV2WOcP/ISpGP9Zn6S6AIkRti7DkCBxHmLnH8+MedH
- smtZvkTH4ntRvqgXx4du9IVzk3AZFjsw2hS/SHPVCOTUDrYBjtK+fWfpO9Tj5d7/0fve/B44RIF5kIjN
- 0G5cJJy3644AjcF/nyLG36eIYdYps6TRccQf9F5FTHivoh0TknkNAxLlWFXqINUG4oYxFVgcmdX3XT7k
- RdEEcIzgN1Fi2pso8aZvogTxTZR+fPdYH+L6SYTE1T1IxFI0JbksZ5sBYl7a2hI4VhpX+Wvzvqybf8Cp
- ygELEo33Vk/43uqpH3dxLlI1N6Tqqt00ibqPZ5taixNwzAmfyWOVxhILSEvTAEfJHgtZl6kG1Pn7SL0G
- eazihFUzwiYkasjbRjH+tlGEv20UU942itC3jWL8baN4i7eNYtrbxtNhIpWtgV0VP6oPabmxDAkSK/TN
- ppj2ZlMw32wK9M1m84sIy146Px4hiqvH0CjKAUcq1Lu3NhWDWvaQZyyiiOLkWU3PEmkSHNaSwbGbCYBV
- Kg5lIViZwhAgMXjvvYXvvbdoPiLpp8JyJvujFiSa+N63SAOyOqDB43Ufp4bGszRIvG6hDE6MFoW9P47Z
- NuD2aDjqD5j9ICbMfhBBsx/EyOyH9vda9TzLQrb4xFN88eFjVO70/o/gRR2zYmfTtadlG1c+2cd9yotu
- W+Bop8JxmJXKLPlAERYzdLaJmDjbRD9OdfnLopYFdEi0weKPph785CnlznXxqJC40LxudlMQt+HRs+JR
- fZhSVrJHsW9WLxLc0IAKiVvVB1Xd7rI85UXTBUiMusq2wcNCrgWO1k07Uh8LBhTbrgWLxs6d3txojoOH
- 9B1hExpVNb/a+lZ9VsZtqoKiqTFDmgu4zR+9juujCL3aXjIlFq+SsB3eSMMMvLBohmdiRPEm8YQ32lEN
- xsjyJyDUSYHEkWV28sTSN6TPGpbNTQUeJ93yz1+xuLkSMVcsUa83OGl0BxKpOvKqoQaEnfzBdd+oetcK
- fYOGAWzyRmXNmRWjc2aPqsu9o3pbCrDJZ/i+7QX/QX9xZtJj9mi2uj0PC9EoRuOo9lRgHKWA4yxXs7AE
- MwQTYrCTzbVMicZNPNcCRwv4hNHCR/3slLMd45Ha18fctINN41HfIh4eSXX92kUp69foKaOPgYMSM1a3
- uFWkFljtXwcNr78oEUdUcFztTds2PqjmPSeka4GjUb8G1jnMWO6jzWtN64C6NGxvv70lLwwD4B4/b2gE
- UXjisIe7cYsn2iENSDMFj7j1Z1gEBTJMY1HbscSweK3DE+lthpMmKj3n0fal2DFbHPVz3t4DuNfP+jYX
- c+CRaBMWTRK37tXayBV1QhdswKP0y5ExXr76PHjEroueZ7u0mXdErVrHXL7I+5QfaZ/6zcSxPADH/YE3
- x3tPnmIRWrhZCjwOv0gZaNieifZVC7cNo/NwBOJ3iBoG+5qZxLyio0O93pBWhaVA44SU4WKsDBdvVDqJ
- yaXTMHrPjePLoSKgBBLeEkiElUBirAQSsi+RJ9FGfe1UPOap6tmwAgEeOGJd8lv1J9ZvjnZlFXCzAQ0c
- jz5eZZKmlf6BMfRdccD6ft61/QLW9fOu6acWl4sPhzxrvz5XGbamrA7uc7iRWOv4edbwUz+pUYbus4Hj
- 5l/pthYqB8lWOG2gekRlxc3VQWqR625FdFIkGx5xR3kZGKAxQFGaXno3KKyq6Lymx3EdUKT69ZCy00qD
- R9zMtLINZpR2JsZTRkqcHrJcaoJMuxQfyTZgli9k/ceRtR/pZwmcX8jajiPrOvLWWMTWV2SvrehZV5Gx
- oAG4jsH2WNdPVXl8fGrWS81T2gg3gJv+JM3TR7VnV7St0mZINc5VC4LUgkYlVqyy2cRDdme+ky5C5yyj
- rM4Znx1pmOlrx1z7Ob3b+qda5SttdkFSfT5KkDEXFLkZ7W0bF7Q7AOCoX327oOpqcpGMOaxIgauJjq8k
- +mariBJWEA1ePXTCyqFpVcl2L3P7DQe23D8PZdVM4VA13V4+rJV8SEkBQIMZhfouwn0H0W8bqCa3NEvA
- U3wubdvrd/onsrSHzKUBu/4aTDUuBDmCY4Ci8KpV/7qn7ZLuw2cG/SI09FQCLUA09vuTsfcmvPVbsbVb
- h/cMoT0mvwmLyn0vM+V9zHBMV41367G3c1KY4UAVFteeB8OM6WiAeN2XC1X64yiLeVnoE1cDQSVgrJBp
- 2ogCivMmb7ZIb7QemwUo6Gu+6ZxjjLpX/EThCXN9zFkhFgp42ynPm1f6li8AjvoZdxCfjc1cVxldUzls
- PeWxtZS13yvZ8i/3THkLA+7uE336NASX9tiHDS7YIQYFHmfYqJUZpReAMZ5TYlNX5zAjdXMVk3Stpy/3
- GSP2AO76nb4PNYIjAGKoJjzZqyDARX+HhL7/136I/vrw7rdotb5bzpvZWFnykxkCMIFRWbMN/LMMusW7
- 9yISx4Pq1NDVGuy6d+SnZQc8J/IfmXhK6a6Oc43stQFGViFvfn4m1ysScT19xy3KU/IzZsCum72ewMjK
- 5cGrlk9YsTx4tfIJK5VzVimHVyhv1+U89fuiuvyeFtFGPopq6IDTKxuxudEZo7nouujNTJxTJ4q+8B6A
- e/zMBqvNIxG4hYoBY+5jnocmkeVAIjXfcNeycSeaIakmCwhWPNCERFWdo7g+VunQxWTFBDxQxDZ781qo
- Jg3YWVvQmCRg1aZlk70a6zeTp7aBAjcG/7v/sR0PmiWEN1lJdSoGMLFWDvDtmdD/JtSIRrFNWeITDLjp
- DaIKahGJdKuemmF17GbojNeE87mgyO14r/F1NT0kIIFitaNLrH6vAaNu9Uke49k3aczO6dkNpM/ajIbz
- 1Q0O+Vk9dHQUSzzFlRpD4w22mDRqZ6xL69KQnVf64eUeUNl1O5STY6CmaVFV54CVgTyuaZFZTwTiASJy
- V4x49K8Woc0Ejx/TSHynzdQFcMDPfp3q0rD9WGQ/6EO0AwlatS/++1dQjBCQZiweJwe7BjdKwMK6o/v+
- hOz549/vJ2CvH+8+P9qP9MlxDgy6OXUO2mt/YbQuX8DW5Qu9rfYCtdVeZJGVshuUJm3a1TcLoW9hMYcZ
- KSuYX40aoOPUFi0lSjXSscq+OVWnEMsjokSWFiRPizgeJWcNN9isY25bdERlC7kuoJpVi1UcBDURPCYn
- asCasC7t2o3xMd4kDo/GjKdaQsdDQhyxGijTlmebKq5eyZlZ5yyj2mhteNVI7bcBOOBv5161k+EEWW/Q
- pn0fP2bbfjSnXz6tJuV+VGLHUgvLxnlUygeFOrzgwKabu48dvocd8bsx53ux4rg3O/+k++bSpv2QpqQm
- lDreNjS3iyZpEMtTlVu1p08z0HkoRc2bguvRwPHaQkq9gDtlOPpnQWMuJ/JzlqTtKVJrbAc23e2ioTKP
- 91cd7fLs8ammvqXyioCYzchanj6nOTnKgALetoHFE2usaa6IhUbllBPMDfTQ/fK0HzhPFIDbfmG/2v8X
- cdY/ojDjdEuRDrMqKREc2HarxcRl5Lz9JIamNlnb3D6tVUr9oMAkbStnhzBsd7CAncG8u4I1P1IH/XsI
- cAXtsTRlZ7HmmBfOGb9AZ3zOukfnyD3i7EyG7koWsiOZfzey5lfoaxhyCEgCxCK/S8d2POPudobvdBa0
- y9nIDmeBu5uN7mwWvqvZlB3NBG/Oq8DmvDb7f7V7BauxPur5Gixg5u195t33TP1IL3EiqLzhbAyF7mgW
- tPvXyM5fATtyeXfjCtuJa2wXrub3bntiVuYyYMDN3Q9rZC+s8P2Tpuyd1BxT7MpqmzaDPs34hogfyakE
- SoBY9Nmd6MoggjxjUQAzFt9mx6Opux0F7XQ0ssuR+vlfyffz8+ilrL7HVXksyKlj824E9lzEkX2Ngvc0
- mrCfUfBeRhP2MQrew2jC/kWcvYvgfYtC9izy71cUulfR+D5FzRH1kSytj66H/TnfyM4/zF1/0B1/wnf7
- mbLTzxvs8jNph5832N1n0s4+zF190B19+u149KVO6V/KeTRIPN7tRncO6n8MmZKKSsBYzLk6Y7sT8Xcm
- 8u1K1P42DKVxylybhyK85Z5HnP2OBH2uo4DmOgrerDSBzUoL3zNoyn5BzTFPaaINbcvjdhm5ugIlUCxe
- /sdz/tt8SEvZbeiNdhqavMtQ0A5DI7sLtXsCMXqGSI8wbJeiKTsUvc2+PlP39NE2OXlSL9CoswIhHo0Q
- MjtNTJ2dJoJnp4kJs9MC95cZ3VuGt68MtqdM4H4yo3vJcPeRwfeQYe4fg+4dE7pvzPieMc0R7kdg5MIM
- cgCRqDvTILvS8HakwXajeZudaKbuQhOyA41/9xkRMtNS+GdaCvp8RgHNZ2S1NOBWBrl+BOpG9SfG6l06
- hxvJyyg6sOmuS/VymD/TBuLNCPzdhnw7DQXuMjS6w1Dg7kKjOwsF7So0sqNQ+G5CU3YSCt9FaMoOQgG7
- B3l3DgrdNWh8x6DQfXvG9+wJ3q9nwl49an5H9JTmeam629XraVUlYhjQYUZijCGDo8YvMS0R1PGWQU2g
- IikUYDieL96fBiLIg1kO65hZSsTVjSiylAY7mNc3K97FO6DppMsgC+uCHdB0qp2nos1xt5MZkmEGcMP/
- fB6ds1PUhV03T4rZuCnswrb7IiQVLvypcMGUYraAVLjwp0JAGnhTgCOETQHXjlx5cpFF2j4BU50Whvoo
- s1wAdPBmFwnnPC0M9VHOE0AHr6z1r5bf7td30aeHz5/ny6Yr326jtzsW26kxRjRj8dT6sm8Qr9d44iVp
- emhOjB2qN3iiqEnwxTHP2UFOAl+M456vP+495sNRPLHVCva4xfRvCyDWYyYt8gjThn21XN/L4+/W86u1
- em7kf35e3Mw593ZMNS0u6X57LJOiEfOAT2PGUzMiF/df+jJif6A++ZgCi6Pm6NYpL0DLoubjgak9HjCn
- /FPCkyoSs3IyrUujdlrWNEDMSc2AJolZqYWEjRreZmnE29nXOTsrIwZvFEbdjCl8cTh1MqZA4nDqYoBG
- 7MQHyQQxJ2HhfAdEnIRPJG0ON1IfdhdG3IfywE+FE4y5aY+8CSLOZt5xyIOpC7AYhIWtHNB1hj1+Y08e
- N3Pg+YJW+p8Q18PNWniuEk/ZjnxnGsh1UWuOARpcs6sr2QmLruerq+Xifk3dFhzBvf7pH+iDsNdNKLlg
- WrPPV9HV19nVZF93vGnYbrZRWmyr1+nbBFqY5dttzi8uWUqDtKx1xbUapGlNUrKuQ0xPut1wTk3DLB/D
- BXlK9r0oPfdCNIuKNz9Qvh8CUNfbBeR4NdT0HouXKj5QlQOF2aJDnCTTJ1SBsOnmnCd8lgHniJ/h6vY8
- mt1+o5SPA2J5Pi3W0Wqtjm837CMZbRh3k6oKgMXNj83HejVX3uG4n6/2WSnVj4viXsIQFYB6vSGpLOBU
- /nrPzh4GinqpZ6yBqJN863TStt7d3cxnt+Tz7DHLN799+Dpfztbza3qSWixufiTmMRPFvRlb60sH6u0y
- Udwr+KkgfKlQl9GnW665gS33Z2Ym+4zmst/ntzLezeJ/59frhewKxsm/SGaAH4lAr5pAw0gU8iMDCUZi
- EG+Ci4/4qdkd4EciHCrCFB3cMBKF+ngB/HgE4hTHEQ0cj1vDubjXz8tXWG1n/szMU2itt5h94KaKiaJe
- YmroIOqkpoJB2tbb9fx39Q5of6A5Bw4xEl7r2BxipN8jDUSc1CaExiHGjCfMMB/5bg8cYhTMaxboNaui
- 5yiL0o+/cMUdjvjpTRGDtKy3Dzc39MzUU5CNeNM7BjJRb/cJslx3n/57frVW6ykRJvq6JGwlp53GwUZi
- +vUUbKOm4YDZvqv1vO863l7PP5NPFBD4YlCLYRv2uakFsg373PQcYdM+e0ii+9ObnFMs2OemFrM2bLnv
- 5d/Xs083c26SQ4KRGMSEd/ERPzX5AR6LEJA+3pRhp4knNfjp4E0BygeqAGp5V/N/Psxvr+acAV+Lxcxc
- K2Bc805zjZxhm93atImThGa1YJ97m6dxQSynIYEvBrXJa8Owm1pzoXXW6QfCjBabg42URcRsDjHy7lSC
- 3R9ykYWX5MNLhXfsC+9h1N1vJbyPxXdmCMMBR8rT4nH6d7guCVuphS5a53Q/0IejdNDjjKbvBwyxfnO0
- O4TIJQ77Ba+UEVj5ohbfZQrfoUa1L/3t4prp7WjcHvp0iElPh31UFIvtW0RTHjii7FQ/rD9fcoJ0KOKl
- Nlg0DjdyH/QTa5nXH8+5xbWJol5iq0UHUSc1DQzStjLf46zR9zislzfIGxvmaxr03UzzQ5LtdnSdoiAb
- PeMg73Q4L3LgtzesVzbIexrmyxn0jQzrNQzy7iXkhYv/LUvzqyzeHtMireI8+ztN1GpY9Aiuw4707X5O
- bm+fIMhFz48nCrJR+xcnCHKRc2QHQS7BOS8Bn5da8ZwlO7dsD7eLP+fLFf/tHCQYiUEsMFx8xE+9aQBv
- R1hfsaoIjUOM9IrCIDHr/tAshRfVPHWPI356LtFAxJnxzjXDzpGcCwYOMdKrFINErNRiQeNwI6d6cXHH
- //mSXUyYLG4mZwONxK30zKCjlvfPxWoRMA7u4l4/MUFs2OumJotDW3baZtMaYnna9kctuz9qQVKSz0Qx
- 7/N7nvT5vWOso3JD2YfKwixfVqf7KLnISLYThLgo6ww4IOYkDttoHGikZxyNA41HzgkewbNTWzlwbknL
- IUZyuaGDiDO7SFhKySFGagmhcZCRd9HYFbMuF7lWtcAG6znpQMzJeU5aDjIW8i+8yz6RoJVzk5E7fIiJ
- 7dmegmxqoWW6TVGYLdrWP3lGRULWY8G75paDjLSVS23OMu433XqR5DdaBolZC762ALxtpSjT+29aOaFx
- llG2vfdZnT2n9MLHRFEv9fExSNt6rKO0pI2fdwxgYrRMBszy1fHjBfXDl44BTGL6tso6Y5vS/SFv1lOk
- 3lqDxKzUG6uDmvNh/UUev/4WLW4/30XdR7SkM0YNY1EI9wvhxyJQ0ggTQDH+mH9bXDNTaWBxMydlTiRu
- ZaVGjw7eT7PV4iq6uruVXa3Z4nZNyy8w7bNPTw2I9ZkJKQLCmntxF8WHQ7ONVZanlCX9AdT09js2besq
- p1gN0HLmaVxFuzyevsmnhUG+dtFVplWDLbdaTKbZtLg5hGQ2UctLTU43FeVfmu5ys+ENccFaVIDEaHfb
- fjzGVVzUacoKYzmASMTNsW3ONCblabdHim+gTFta7igaebjJq1V3SK/RDchy5YSVZHrAclS0u2iVk91f
- ojjPqRbFmKZmrhFhKpTOuKbpS+0PBGA5kC0H15IVWU31KMY17dUgDCONThxsPExvbFqY61Mr6Mj8On1K
- lAO6TmaZbqGYV5Z7YvpS3BDrmqm7NNicY6ReuHW1T+nP5LgnZeYOMT3qBhWkvNwStqUm13wnxjSpbNhs
- AFbQUkjnbGP9RC4WewhwURp4GgOYmkW6SB8MASjmJd4OA0SciWxIVOUrS9uxiJn6QBgg4pQde55TgYiz
- Imxc6ICIk7Rgv0u61pLeItEw00fM7E4+V5XAJiujQ5xVRFHPuUZGA1DDXB+tbdESgIWwR4bOAKYD2XNw
- LapM3Bx3VFWHuT5Rbr+n5ERvKdv2k+j5aRuO+01akZ9HDQN96omSdQhD2ZGmldHxAfs8h5KUIeThFq+m
- Y5AyQktYlroiVysnxjIROzoHp59DLdzdMp2addw80+5IK4pzqqaBABdnlMcAbaegPa4NYDleeGf1gpyT
- 4JTdAi65BbHcFk6pLchltgBKbLXryZ4mkYDtoJeuAixbmzZcTthF24AAl0z6Zk9Qah5wYMStOgIHwlq0
- IIy42V7YSe2pC3A0Q5BHMwQwmtH8jdqD7iHAdSCLDq6FOjIiwJER0Q1IEFsvGgb70nKn+vnHquBoB9q1
- F4SpFDrjmvpxCHIOGUiPlTgyIrwjI8Ov4pBuszjnqTsYc5M7SBbqejmjOQIdzem7Yt0uWKSX+ajAivFU
- HvMkkj0iTkrbMOgmZ7kBQ3zEFys6BxrpGUHjbGN7J+VvNGGPWb6C3sY+MaapTgWjYB8o03ZUW2uTzqol
- TMszdfzs2R07e+Yk0TOcRi+MjtUL2LMiZykgL7WPLvGVSQ9BLk6T2yQ162306WZxe91+q188p4QWkYvC
- XlL2sDjYmBXPcZ4llKFRkEbtzGTIPKlAGSszMcN3tf4rSqdvAjIQjoV4W06I4yF8YDYQjoWWPB3hWEQd
- V9SzaRjD9Pv89upTM5eBoBogwCVIadQzhunr3e26OWHKFEObg43ErGBwsJF2O3UM9alCRtSUjzhRAR5j
- V1bRvkyO+VFwo2gKOA4tM+gY6oty1ddPmNqONuzxRkSZiF7KimLVKNOWkCyJQ5NPpENMj9hebAqKpQEM
- xyYraI4WMB3yLxnJ0QCAg7h9gM0BxkNMtx1ix7TdbFjnNnC2MUm3NJUEbMcTYZ7CCbAdecq6sB6zfftD
- RjNJwHA0c9kIiuZ410BZxl9nABOxOhkg00WYwHBrfkvf/ptaZpwQ00OrbJ06dlseC1XAvkR/p1WpEkyQ
- dA5t2GUep5VGLWA6smeKIHu2aWo6nxDTc6TcbePLNPnvtHiKi22aRPssz9UrvLgp5KpsL1v69WvTASbo
- p+jM+D+Occ5qoFikaf1JSRN5tEETn0Ln+dtV5V42ZIr6sdyn1StJZZCG9XFLySryaJM+fXmq7kUakYpz
- h7XMdVTttu8/XHzsDjj/8P4jSQ8JnBjH6YsyD4RjIT5xJ8TwyLqNVna0gOEgDejf2mP5t6qtKMs0Yot4
- gGxXkT7G6ksimuxE2baS1GhtAcdREE9GArbjUL5c0CSKcCz0J0ajYNsulqWWGlvkaTXc9hMzONTnkH9T
- lSbNogjDkqe0h6Q53jSQdmzsAcBxTpacG5Z9XIknWduQZiWYmOUT36ktmp4xTWVC7CN2BGSJfhyz6V+g
- 2pxjpNXCHQFZLpo6ke5qOcjIFPp9rGYMLMBjEJ9vh3XMzdCroJ5yR2G2aJOrCc0Jz3qiUXuZcM0lkPPJ
- 5cwAIa5zluwcs7GeS4NFzAFixLs/5kSdJCALrwHtwo6b2Cg4IY5H/KiIGklAlpqucfOdOG6omuMGsrCy
- RM85RkZx5ZZSh4zWlGgB00HLl3aelFmKeiUdYnhog/v2mH5RyOSh8Op410B9AgbIdB331CbMCQE91AQ2
- ONf4KtvHVJtiDBOtE2L3QA6xqnFU4y86FmrlD1J9CNCmnTtG4xmNIa1MdzreNVAmvQ2I6RHpMSmjKia9
- sdUozKb+z2PKc7asYSaeoHNmrFPynEv7Z1q30uBMI7VlVLmtoorcIqqA1hBxu9yBcCyMoQ4dc3y0cSkB
- jEsJ+riUgMalaC0SuzVCbIk4rRBaC8RufagWBDUNOsTw1GVkbeFKMLow6O72ZGOIO9K2spq6BmcYj7QB
- gaM9GnCkvUA62m+QjrSscLTzwnOcH1Ni3dszhok4jGWNYfWH7I7Fts7KInoilEAgDdlFmu9odbiLat6H
- z9HX+ddumZLJSoNybaRXIhrjmh6r8oVqUgxsavcJ4vha0rVSmugD4nrURz/VMznROsz07dM95S1fT5gW
- UVdES0s4lnwb10SNQgAP4Q3xgDiegn5ZBXRdRZ4WVE+uf5t49elTMxxKGSbWGdgUbcoy5+gaEHGSNjl1
- ScRabmvymtGoAIuRJe170prwtStuQKIc+Ql0RFKI1CU1INclDvE2pboayHUdzz9STRIBPd0+VbJLJ3/6
- Ob2761GAcfKUYc6ha78g32OJgJ7ga3cVQJz3F2Tv+wvQw0hDBQEu+nNyhJ4P+UfGOSkIcF2SRZeQJfim
- XvrvKXGfRA0xPZQvKE/HW4aM+CGQAdkusY2rJNo+ZXlC82mg6ZT/kU3/un0gIAtl5WOTsmyUlcV6AHC0
- FYfq1E9fNw2ETTdlksnpeNcQkXP+QJk2QvuqO9zkiW1qDTE9lG7h6XjdsOqaV2mleuFJWk2XOSjkzepu
- ZeOnWFBGvXADEEW1guQp0FpRLmua1VpRcVaIbtblK6U4gWjbfnilNqN0yrTRysyVU2aumtlhcfFKbO+b
- HG6M0jzdE1YRw3g4gsqBoVFsBxCJkzJwqtB7QhaIOLnXP3rdUbY/5Nk2o3eIcAcWidZZsUnEeuRrj4iX
- /PD2kOvKY1GTGnoG5vrKgxqlI87yAuERNysbu4axKLzO+JhpLCov00AONxKpp9ojoIffsEcVYJw8ZZjz
- FHBdkBPV6qn2fwy+dn9PtTuI0lPtEdDDSEO7p7qiTiHXENDDOCe7p9r9mVyAQWVXSE8VM5hRaH2JldOX
- WKlJws3n41YTlSSFFWYcUi9jZfcyVu2aNOrjEoqlh0zXIU2/tydbx6QrNUDTKb5nB4pKHW8Z6unvYE7H
- 2wbKu4SB0Czz5XrxeXE1W8/v724WV4s5bW8CjPdHIORhkPbbCe+OEFzzf51dkT9aNyDARUpgHQJclIvV
- GMv0OSsID1pPWJYFpXA6AZZjSVnWbyAsy8OBsriGhmieu9vP0Z+zmwfS3qMmZdmar+pTQbv/Nog487Jb
- KZEl7mnL3s5+y7Ppb8UtTPMtb6LrxWod3d+Rd0CBWNxMyIQOiVspmcBFde+3+/Vd9Onh8+f5Uh5xd0NM
- ChD3+kmnDtGYPc7z6ZtbASjmJY0JOSRm5SezL4WbUVZZtfLMJxqzU1pRNog52dnBkxOahUPUy1x2SugG
- LAptvS+IdcxfH9bzv8gvgAAWMZMa7DaIONVyJ6QF7WDaZ6e9g4JxxH8sws5f4/0R+NegC5wYsqH4Tdbw
- 1FdhEIy6GblGR1HvsWnkRBt1eYIZwHA4kVbr2XpxFZhRYcmEWJxbjlj80fiZGNNMihd8fd6cvf6ynM+u
- F9fR9lhVlMF4GMf9zULE3VZr3CC6wx+pOO7TKtuGBOoU/jiHMitqwltIXOHE2W625xeXavWT6vVAvS8m
- jLnTIsDdwa57t1E/n3PtFo75L8P8o+cfZEfdT7H8X3Txjqo9ca6xbYmotnWzWTm9FQ0Y3Ch1FZAmBjzi
- Vv8kjF/jCidOs6UbL4l01PE+bvcqeEyuFQYQc/KefRMecbPSG1JgcXh5xoRH3CHX4M8z3UGsZp/BYuam
- L/g9feW5TzRml9XL9IWyABTzUkbUbdB1qi0FXts2SrsBGLed4DF5o3Y7eb1FWFvljdueaHhQwwNG5BV7
- GolZyXspIjjo35XV99MSWFlZMEJYBjBKk3qUtakhFjWrmWABt9hWgHHqp2bPHHksYUAfxl3/U6zmX9L7
- pgPoONXMuFjsicKOcm1t44jcpuo5x9gUq+JVUL4wBlDX22z7s8vUdpNZnEebI2WSrsfhRMqzTRVXr5z7
- pqOOd98M4XK0Gula0z3hu0cDclyqROGVdhrpWo/7iDN+0nOOsQzpZZT+XkZZbKmFmUIcz6HMX8/fv/vA
- a/9YNG5n5CaDxc1H2itBkHbtVRoJ+Xhvyp+sU7dwx18ljHKnhRCXWhGlzg55eknZf8ijcOOku3bZV9kl
- iNThzRJ5pMneYyI8ZlZsuVEk6njVmIz6gCSkdQY6wEhv0/IVhJaveLuWr6C0fMUbtXzF5JavYLd8hafl
- 22zwlYScvUaD9sB2o5jSbhRh7UYx1m7kNZ+wllP39yjbRfFznOXxJk95akPhxKlzcS5LaGoZecI033oZ
- XS8//U5b6dykANtpPWCy8AQCTlIdpkOAS33zQ5gAaWKa7ym+Ui1z4sCOQQ226/nqNFT1fqpLZ0xTut28
- pzbbbM4xMoWIL0kv1CA9S2qxjvl9gPm9x1zQ78+JMU0F8/wK9NxUWUcYotMQ0BMdi+1TStn6BIRddykb
- HIe4ymryqQ6kZv0SNZEmu7rjXUN0OG5ICWhxprHcH46yeUP0DZRho0wP6g43+H59dtrp6Bjsk3cj3qd1
- WgnCgmKowIpRv4seSU4FuA7qNbeI6zlQLQfA8YN8RRIBPFX2zLmwEwcYyZlfx1zfD6rph+2gtolNCrKR
- R4EB1PCelu8ecjHB7MKGmzAVrj3apIlrb2qI4Wmny7Kuz0YNr6A/mQJ6MgX9qRLQUyVY+U0g+a3p2jTf
- yhBlLWS6CHvadocbPG1iYg/ojuYeCso+MjqjmRbL+dX6bvlttV5Sd6+EWNw8vavgkriV8ki6qO5d3d/M
- vq3nf62JaWBysJFy7ToF20jXbGCGr5twHt3Ovs6p1+ywuJl07RaJW2lpYKOgl5kE6NWzLhy5Zt7lYlfa
- jIMdKC8uQVhzr2bRakEsPTTGNXU1MVXWYa6PkoAD4nqaGpRqaiDT1XZT1ArRcX2sSEYLNb1JGaJ2aceu
- fiEqFeJ4ntMq270STS1kuWTleP2FJGoI00LNuW6uZXXoLA4x8rp0qMGOQurU9QRgIV+503o8/fVA9hwg
- yw/6dZmt0P6v1M6dDUJOYvfO4gDjD7Lrh2MhN7lNDPTRO3kAa5oDunkgjdjl3WM80gCO+I+bPNuy9T1t
- 2ol1nVPPsTuYAAuaeanqwKCblaI2a5oFo2wTYNkmGKWSAEslwXtSBfakUqt1t04ndYq7400DsVvcE6aF
- 3rAAWhWM7rUODa75FW/k2eZwY7TLDoKrbWDDzWjJmxRsK4m7u0AsZFa1GN2pKMwWVTxfVKFGwTSCV0zs
- GTkg7PxJ+XbYASEnoRYyIMhF6nVZGOQTrFwjkFxTl9y8fSJtK7GfZUCAi1YkWpjto58YdFaU2mIgbAvn
- wtyrin7/3O21KNssT9N363JJx1pkoj5cXPzCM1s0Yv/wMcTe06D97yD735h9efdwT9nxXmcAE6Ga1hnA
- RKv2NAhwtd3ktgdeVmSriWP+siKsZAugsFc2EXbxlnnWPYy5j9VzqvIIT36ivXbK2CaCI/4kfeTkkQFF
- vOwbid7H9sEjLE7tkoBV9cc3ryHJ7BiQKPx8YtCAvUkx0rtYAAW84rSS6i6f/pkbTCN2fnFi0Ii9+Z5c
- fSSitt1Vmx/tymrPigSajKh/zL91Y820/osFIk5ST8vkHKO84ZnMSk0/RKTbavqCY6jAjUGqwTrCsRBr
- rxPieDhD2QDq9XJuu8MDEVSlWZXk5BxA2MkYs0JwxE8et4JpyN48h9Rn2WFBc1psm+JKMMw9C5tpg1su
- iVnJg9EI7vgzEZWH+MeR+gj2nGOU9/OC8NmNSTm207Axq+qGBWgM/uPiHTvvjiENLZwIyMJuyYA8GIHc
- eTJBx9kOVbNP2sYRP33wH8ExPzt/eN4CdEdwW2EOC5q5ZanwlqUioCwV3rJUsMtS4SlLm9Yko5rtOdDI
- zxUWDdu5VawJj7ijeKd+lPdadhWyIiaNC07zOWdAe3FiQIbr63z95e66Xf4gS/Mkql8PlAIG5I0I7RQi
- wla3OgOYmq+dqO1eG4W8pLGpnoFMhJWgDQhwJZucrJIMZDrSr8/ucdBnzRkQ4Gp2InGyO3EIYEwFxM1U
- N7Umx2gxyCeiWH0hrD5fr+l338Rhv+xSN5U4R35iAfP+SM9hkgFMtDYaMF+x/2u5rS+a8QSyrycBa/P3
- i+1mQ7b2JGqVcZlWSQJW8XbPhaA8F22bZX+oUiHS5E1i4zokfl3yHySLNyJ0TeAsuSgI65U7IOgUtfwt
- YThb0HA2eykds7zOuqeW0pxwYc19ffHhw/lvqo1xiLPpA4omhvpOw13Tv1VEBW4M0jtIjXFNxDeIBqXb
- Fvez5fobeSq9AyLO6XPJLQzxUUpni9OMt78vbonXOyCOR2XW9hUtsc8M46B/GWJf4u5mR4TTk5YWj/In
- QYwAKZw4lPvWE46lSh9lUaP2AczzpkTO05p6C0GHE0mE3VMxdk9FyD0V2D1dLqPV7M95sxYyMX+7qOlV
- S7ukVVVWtB65Q/qsO752Z3rbPlLzM8WpYZBPvMqMs+dqddq0t5dB26DK5nBjVHCdUWFamzVh258Exalz
- lvFYbNmX78Cmuxn3pt6qHkJcUa7+xBE2pM9KfrAA3PUX6c/hqGaZO2oI12BGkX9k30KbtcyqZvm0uOPk
- OZsFzOo/uGaNBczL2e01W63DgLtZraNk203c9DfbwJEfmYHCbOSHxkK9XvJjA/FAhGbnVl5iDKjXy0sW
- ix+PwEsgSGLFKg+qk7qPq+8k+4BZvkpNvWhCkrK1zuHGaLvhSiXq8e4ObO/uYHmPnBx3BPNalcaiLNgF
- M4Db/n35rGp1wtJcNgcauyXWuGIdt/2iLivWKWug6RQxJw0GyrLJ2pb6OJ0YzfTnfTSbz66bPRBjws4t
- Dog4ibtIQSxiJvVYbBBxqibM9BXhARTxUtaQc0CPM3rJ6qcoyap0S1kBfMyDRKT0yy0OMZaHlHfSCvQ4
- o8e4fiLMNEV4JIJICV+m2KDHGYltXNfM09YFSIw6fiR9AAOwiJmykq0DAk71Spi2jg2AAl71JY8s+Ksn
- Tkmnw4ibm8IaC5gLtfo0Nz102HR/Uh/lrMs/CFMFDMq0XS3uv8yXzU1ttkGjffyCCdAY2+xAfMAdGHfT
- 6yyXxu2Ud+UuinvrKud6JYp6uzUfKW1CTIDGoM0IAljcTGwlWCjqbV69Hw60/hKuQONQWw4WinufGQUK
- xKMReGU4KEBj7MuEe3cVinqJLR2TxK1ZwrVmCWqtKLuDQyxqFuF5XEzJ4+qgkBKg570RgvOjKfHGOsRJ
- wi8wNQMYJah+HalbufcBT/+QksZfygTd0ZE7ySxZ0FKF9+y7zz292QO1dZq/fc6KOCesteSSkHVBrbB6
- CrOxTrEDIecDadcTmzON1+lW3vFPsUg//kIx6hxoVE8pQ6gwyNfcMbqvwSAf9S4PFGSj3xGdg4zJDblc
- MEDHqVqwnAfGQkEvIzFPGOrjnSb41HS/sW7SAFrO7DEVtItuCMhCz9sDhvr+uvvMVEoStVLvikFCVnLW
- 6SnMxjpFON80P60os9gMCrMx73ePYl5eWp5IzMp4bCwWMnOtuPFP2hxBi8ONzLulwbibd8cGFjdz01en
- Tfu8YNXrGgb5yKmrYZCPmqIDBdnoqahzkJFRrxug4+TW6xYKehmJCdfr2g+80wTL5+431k3C6vUv93/M
- uWOoNouY05+HsqpZ4hZFvNSRNgNEnNz3DaAAiUF9h2aAiJP6hssAUWd9PEQb2eWJquhnM8WcGcLxjEcU
- bxRRkCOqT2GbXRrfKnQv9J7DQXx/i2TWNaPxxNvEE9R4b5HEoM88g6/XAW+3HBh0M0rNr565EqffiG+c
- NAz1Eeshk4Stzb6cHGkDgs5u002GtCNBK/Wd0lds3slX3uyQr9jckO6HfcKw7RPQRXwT8hWZ8dH9nfyu
- QudAI+vdgc3CZt4Tjj7bpM/MTczxscsgT/nDSUU49dSnJu338QylCTtuxjWDV8u4G+6duP80jwRpJ0WT
- smx/XK0uL2S19I1k6ynbNv920fxIs50o18aaZWCAiDOh1Xg6hxipJbQBIs52DarvtNkyLu2zVyKOyjg9
- RHm8SXN+HNODR2wO3D/uzolVBuYYidScUmCkzjESifH+FXOMRRIiEnFeE2d9+TyeiP2ONSHJqEuQWMRa
- X+dwY5QlXGmUYWcq3ui5EZOfm2bFoG27+pOa28QNZ0gmxHpMi+Gz/OCghs0TXSWJLLXU4aSlREc80yIe
- jpv05+EtYramkaghJaGYVBKKNygJxaSSULxBSSgmlYRCK8G61A68MsNEiPoGt8/VTY8fUg3gugnx3yrw
- eMTg+keM1z+xEMRXhhqG+qLr1YzpVCjubRca46pbGrcv+We9BM+6GUpk1B8dBxk51QJSB1BWJNMY2MRZ
- 3xHGIb8ayQoJYPJAhCSl9yw1DjeSx5scGHSr5Z8ZVoWhPu6p9ixubiZZprS5dBAPROgmvJPNHYcbecmh
- w4Cb1VdG+slN73P6PpU2hxoZpeAJxJzMcltjMfOSe7ZL7GzPmWl6jqbpOTdNz/E0PQ9I03Nvmp5z0/Tc
- l6Z1LtSzoSYH0Fbe81rgaFEVv7BWfvU4fJHoq8DiCiAOowEBth3oq4k7JGBtG9BkZYuhPl7hq7GAeZ/J
- tlrxGNKQcBVAHM54DjyWowZjQvMy4PBF4udlVwHEOQ2HkO0n0OPk5RmDhuzNuhDtRox0uQbj7vbOcOUt
- jdub28GVNzDgFtxaTeC1mgio1YS3VhPcWk3gtZp4k1pNTKzVmnVHiW/RDBBycnr+SL+/6QSznr+eBK1/
- M67YeQPZ/JmVekjKEVdHNzHA90yeDqxhqI93PzQWN1fpVk2U48o7fNQfdAW6w4zEmteOzGjnzGWHZ7Gf
- /kqc7KNhro8+3RSbCc+cX47OLOfNKcdmkw9/J6aeAUJOegris9LVwpjtaghRnGcxqTlhs645IX/lM1CW
- Ta3TFKciOr+4jLabbSSe4qaWIskxycRYUbY/yLZHRl0jaJJw/BzUPqNvcMWdxhdvu482+TGty5I21R63
- TI0WXb5NvOjSF7Guoqd9fEoNfkTT44n4uN2zo0jWb5ZdnCJplnkJiTFYRqKJgMzf8SMRZO48vwiK0Rgm
- RHkfHOU9FuW3C/5db1nErJ7f4BLQlkyMFVwC+oTj5xBSArqa8XjvL395i3idxhfvDUokwOOJyM2bHes3
- B5ZIjmUkmgjIjP4S6XQEv0QyDBOivA+OApVI26dY/u/iXXQo89fz9+8+kKM4BiBKIs8kTdL3YcUTaJka
- LaiAGjUCZ1Ec85x/rQYN2H+G37ifo3eubx3S3D2G+OqK5asr2JcS1uQ1MdhHLgDR1lj7Q7ljnZ/EAJ9s
- AHDuR4shPsb9aDHYx7kfLQb7OPcDbie1P3DuR4u5vq4up/o6DPHR70eHwT7G/egw2Me4H0jboP2BcT86
- zPQxPpEDv41ThT3xnnaI6yGmfYcAHtqaUx0Cet4zRO9hEyeZThxi5CRYx4FG5im6Z6i2mFWVMkV2YkxT
- s614Mzq2eSVtYQywHjPtTbyFut527I13xjrrMdPPWENxb7n5F9crUdP7FIumAHqKq+QlrkgpYbOm+bTx
- dxs6ivPHssrqJ1JRizngSMwX9f4dyvUDWK/nXdqyJ6Tl1OThNv+Bxn9w+KZdTpQ0jGlqt/IOud+wAYrC
- vNe+3caHn1n32WZNc7W9iH55Ry28B8q1MVSA5xeaw8p71Hzj5hk1enPxC9EhCddCG0uCRo3a8SuiRRKO
- 5QNtBKUlIEtEv6qOMm2qc696+s1U7H1Myjg2C5u7Z1a99q0Sjt4QwDHa305HiuNBLXGTsqIhKixus4UK
- 4/si2KBF+Ws9v72eXzcbuD+sZr8TdyeEca+f8MoXgr1uytw7kB7snxf3K9LKtD0AOCLCUgwGNLh+n9/O
- l7ObSO2auiLdJJfErNNvjc1hRsINcUDYSfluxeYQI+GbeJtDjNzb47k77bT1Um2VckvoMHgUvjjPcX4M
- iNHgiJ+XydA8xs1inhzWTH5kORsSsYo+8Qvu/TMVvjj8+yc892/18Gm9nPOyt87iZnrmGEjcysgiGjp4
- v/xxPXmlWnWsSaol8eIioQg6xPHUVbytiaKG0UxfZ1eTDfJYk+SsoGVzkJGwepYBIS7CdDCbA4yUbG9A
- gIsytdGAABche+sMYCKtGWVSlo00VXAgLMuCmkoLN4WI0wJ1xjLRJgNqiOWhzGvuAc2xXK3UJ6Lx9Cev
- JyxLWlAtDWFZHtMirYhjIQ5oOflDXghu+bkDLSBsu8v89b18WJ/T6WunOiDo3B9zhlBSg22xWj3IQ6Pr
- xWod3d8tbtekcg3Bvf7pzzAIe92Esg+mB/vX68lDL/JQg6MVdz1gOiiF3el407Cu4kLsympP0fSQ6aIV
- dgOhWz5Mxz8YHDU9P7jp+YGYnh+c9PzASc8PcHp+IKfnBzc95+svd9eUT08GwrEcC7qnYQZT0124urtd
- rZcz+TCtou1TOn3BdZj22CmlFAh73NMzCoB6vITSCWI1s/zlMy0JesK2NOuS0TaxdUDQSdrM2uZsY15O
- X8Z7ICBLtMlKuklRto1yO0+A5pivV1ez+3m0uv9DNupIN9NFUS8hL9sg6qRcuEPC1kW0+fiLapQShlgx
- 3heh/bKSH6HlsQjcm7jw3MNF81TI1iWhWYrxWAReJlmgeWTBzSILXw4RgekgRtOB8hGsS2JW2gedEKuZ
- 79aLq7k8lJbXDAqyEXKAxkAmyp3XocF19+m/o+1GXBDmq2iI5aENSmmI5dnTHHubJy2xPhCmJaFdSWJf
- hfyPRGXVLFGzGQTFZaGod/Maou5o0968Q6DshGpApou2aeVAWJaCmjlbwrTIP1xsNxuKpkNcT15QNXnh
- WggzuTTE9Qjy2QjrbKSWmsQd4nrqnzXVIxHTI8h3XAB3XGqpmg5xPcR71SGa535+qw5S3/3GeT5MbxLR
- tiwmdwZHNG68zTHL1Ypo7Rq4ghrHwl1/U3yLlOrtMMRHKHdNDPZVpNrbJQGrTOvskWxsKMB2OMrCuNme
- hawcUNfLuWr4eh/3dbYnu1oKs8k8/C+eUZGoNcl2O6ZWoa73KRZP7y+oypZybVn8/mIbH6J7qrAHAad6
- YdIsfViSrQPqetueuCoBZAGwL5NjTi9AIIcbaS/LsnJLdbcUZiO95QNQwJvuE/oj2lKurSiZxUgPuk7Z
- iOUkZIe5PlFX21iklOa4Q4JWRjq2FGjLt3HN0CkM8U1/E25hoK/gJ2LhS8WCl4wFlo4FYXFtC3N9dZmX
- L9PXKbIwzbf+Ml9SJ58ZEOQi1Y0GBdkIBY3GQCZCf96ANNchLeAm4mQxasCjtB/bsEN0OO5v5+qy/R3u
- +p9lVMJYvIWhvqg47plOhQ7e+/nXaLa6PVdl9OSejAEhLsrAvAMCzheZQ1KysKEwG+sUe9K0/vXh3W/R
- 4vbzHTkhTdJnpZ6vS2N2VnIAuOnfvNapYJ25SZpW+Z/RVj5zm3j6+0ibs43fZYtsV9JsLWOZykhtMDu9
- VjIg06XG+dUs/6vFvSyHm4SmWAHc9B8q2RClrJxoQKaLmufdnN7c6+svtLVYHRByrmb37QdZf0x/0wDT
- sD26f/hEWNYUQGEvNylOJGCdXwUkhQ6Dbm5C9CRgVTvo/Uo2NhRiu2TZLjGbPHzxZ/OZCfUBxRxQJF7C
- 4qnKzwXePLAMetaWI8+a+r2ZlceVn2DYzU3lpe85VnUk2aggxBXNHv5i+RSIOa+WNzynBDHncv5PnlOC
- gJPYfoBbDqe/8usZHcbcQc+AY8CjcPOrieP+kCTy1EHq96B6yBagMUISyFcnqd959VJPeqyXbOulzxpY
- TyEeLCI/4f2pHpZrRvPMMvjZXU54doPqMVuAxwi5C8ux8oFVr51Aj5NVv+mwz82p53TY5+bUdzpsusmD
- HcA4R9sp51R1JglauQ8KgCN+Rva1WcTMThC4Vmt/5FZpLg3b2cmB1GTtj+RqTMMw3yXPd4n6QhLWEkyI
- QdkU2CtBY/GrYlQCxmJmGE9uCbkR3nuwDCtPlmPlCbfKdWnEzk7tpbe0olazA4XZqBWsSaJWYtVqkqiV
- WKmapM8a3c7/h29WNGQndlKRUfP+zwF1N95P1X4Pe+ZGeqrGQeynw9dXNY4ISihfvR7SXYUNeJSgZPLW
- 86wuq4X6vJd876XXG5rwE+p/4DBeGwAReWOGtgUm9cu1QwMy2EjuCr1Ro/doGV5eLaeUV2FtBX//3Dgm
- 6G4sR0tFXtsB7qObv/HaEHgv3fqd1ZbA++nW76w2xUhP3fid17awDVoU+XifX0T3n+Zqtslks0E5NtoH
- LAbkuChTnTTE8ag31t9lmRkXSbRNq+mTcTDeidAs7UC0Noxj6vahIyx26ICm84O8VX9cf76IKEv3OKDH
- Ga2+zM7Z4oa27YdNemFsZ0/TOzjo5+zYjuCm/9docyySPFUlBimrGSDiVPkv22Vb+bzw3LrAjkF94H4F
- nrdfm8eFfuknCrKp0oxnPJGYlZ+ckAGKEhZhzK72Tg6LYBvsKJRvXQfCtqiZPWpHcMrneS6JWkm7GEIs
- Zu6e8jThyXsc9z+neXng+zsc86t7wZW3rN88K5J52CW4HjOi1QEhl1EQ749Aqw5c2m8nzJNGcNvf1XQ0
- awfZri7D0lwdZLtOq2n1DwFn9fMJKjtuu87WG0T1iJyYqn2oviUmRjhhoE/wfML03d0srr7RHx0TA32E
- B0WHQBflsTAo2/bPh9kN82oNFPVSr1oDUSf56nXStrLXP0Jwr5+aGugqSMDP5FTBV0Lqfv86u79XJP20
- NRKzctJaR1Ev92R950pPW43UrMu7v2Syz5frtnpq1kdfLe5uaYnhtUyJRkgij2NKJErC+SR2rC6V6cmm
- gYiTmjg9hvjISTBwg3E5u72O5KFpPLlW1hDLQxi/Oh1vGZoPQ0iOhoAs0UtWP6kQmVrzTG0DROj0jGis
- eMRFB3TGMqWPtBSUx9uGIt7kabQrq+/RsRDxLo02x90upSzvNiqyYu4yeSBlYXSTsmxtd7hIon1aP5W0
- 9LBYy9x8TK7Ckpw9ZdkO5fTtz3rAdoj0mJSMbK+DllOkKS3RFOA4+PdAeO+BqOP6SLvWFtE8V5PXepWH
- GlxzcoQeiIZoHv01E2WVJwc0nad3SlSlzhnG/43O3138opZNUGvRR/HzzwuCF6ANe3S/WkX3s+XsK619
- C6Cod3qd6YCok1BvuqRpVZ8HH75vxbnslMq//qR4bdY0b7Lp70dOx1uGPCvUfkHR9K+TLcz0NUu8ynLw
- QDqvgYJslCdRh0wXceRFQ2zPLj7mNbXMc0jTShzL0RDTs8vjR1LSN4DlID6m7rOpr/pOWJgfQD1eaiZz
- YNtdv4u2VR3RZhEBKOBNyLoEsuwP53SRhEDXD47rB+RKyaIUsOzibV1W9ITvOMCY/dgfyDoFAS5iIXRi
- AFNB9hSAhX5h0FX9IFt+OBb5lNJ6TSYG+mQdGskahlp0mKxpzkRUHuIfR1Jm7SHTFbAbLIIjfvLmFTBt
- 2olNG6c9oxKYXvsNlGnrNixsWjrN9Ijobja/j/aPO1L55NGMxVNtt/BwJ8tYtOZdWmCs1jEp0sUbRLrA
- IxVlkXIjKBY2t024N8gNoGg8Jv8euZaJ0S7eJJpzp5j7GIMw6GaVUPjuOs2vlM35esBxNKfNaPVbKOxl
- tNctFPY2bdOq3BMHe1ADHqUuw2LUpS9CTd1XBYQtd5tfOLfUIEEr54YaJGgNuJ2QAI3BupkubvoFv0ck
- fD0iwWztC7S1LxgtdAG20AWvPSuw9ixlRtbpeNcQHYQg14EGCDir+IWsk4xt+julWf626vzjgbLf0UCY
- Ftp+DAMBWQKahaAAjMG5oxYKeol3daAGG2WOsDkjWP2LtrHXQFgWytZePWA5yJt7mZRlo23vpSGG5+Li
- F4JCHm3T5PTtGcdETOMT4njIKTNApuvDR4rkw0ebpqfNiXFM1LTpEMfDyYMGhxs/5eX2u+B6W9qx0+9l
- Dxmu95eUfC6PtmnyvewZx0S8lyfE8ZDTZoAM14fzC4JEHm3TEe1J6QjIQk5lgwONxNTWMdBHTnUTdJyc
- K4avlnGl4FVyygiDc4ysNHPSa3H/Zbb6EhFqrJ7QLPezP+YX5N21LQz0EQYyTcqx9e+G9uKRqNRRx6tW
- Sk1Vc42s1UjNSpqCZc++av9NXYzapAbbevmwWkfruz/mt9HVzWJ+u24G9Qi9MNzgjbJJH7MiyoQ4xsU2
- DQhmiibErNIk3R8ou2pOUHnjyr9n4uktLtYyTYn6JpfruPyRCSUEgnv9hBIDpr12NQogqirwGdAscDS1
- y/V8GfK0mQZvFO4d0XCvX2XIkAAN743AvOcD7bWrjJ3uAwK0ggkxKF17r8QbS+W+fVrHaigrMHvZqtG4
- Ac+Oa4GjSbb9D26+NgRwjHbH2n40+5QEnGiICo6b/jykVbZPizp6PudEMwTjMWQjZb8JjdNIpsR6Lg/V
- Ljxao4HjcbMEnhP0KUccs87DEZiFm1GqPazmy3bbVlISWBjom94/MiDQRbhUk9Js68+XaprI5PUaesBy
- HI5EhwIGx18XHz6cT16XpT3aplWeOMRZRbOcKMfWvQ1q3jV1xQ3RDBi0KB/e/fbne/VVjfrEv339T9mS
- EuPBCGr1lJAIBg9GIHzDYlKYLYrzLBY8Z8ui5jyb/rk9gKJebuqOpmz7ayS+h8glDvqJX+G4JGhNLjKG
- UVKgjVIKWxjokwUYQycpzEZZGs0lQWt2wTFKCrRx8yaeL9tMxbvungXNpOkuNocbo92BK5Uo6H1u5iwW
- DG1HOtZuvztZY4h0SxlpwHgngiwQzhmZ64RBPvWpUZHElfripU4LNSwm6HrIAkaTaXdMGf6Gw43Rpixz
- rraBR9wR+Ql0eE8E+jNjsB7zcfsUV2x3Qzv2pgBgFOs95xiHTMMqQGzc8auyml6rdRRo4z3hGglba8o3
- qw4IOtnPhwl73PQbZrCOuZ1QyWjpDaDj7FKdk211FPDW0bb+SVY2FGjj1PY95xqbjMG67IE0rdHs5ve7
- JeVDRZOCbJSNak0KtCVHji05wjZq4mkY6KOs1mNhoI9zI7D7QBiXMCnQJnhXKrArbQZhE55RgrZzvV4u
- Pj2s59FqvianogWj7m15LLjqhsXNpBVPQXjEHW1eo9vFdVCIzjEh0t2n/w6OJB0TItU/6+BI0oFGIpc/
- Oola6eWQgaLe9mtIwqA+xvsjlJt/yZo0JEZr8EehbP+K8WgEdhnhKR/IJa5OolZZ4J2H3NOe90cIuqea
- wYrSrFw0e/iLnuUNErMSb6PGYUbqTdRBzEnuCVmo7V3cfmak54mCbE3PI3ss4vpYMbQGDvmp96llIBP5
- /nQQ5GraEmWS7bI0oUt12rYvb+grjbokZqWm5sBhRnKqaiDg/Dpff7m75l29xuJmzvkOKOCNk+RdVKXP
- 5XdqVrBg2H2uRjao430ODLvVrxyt4gBj+/GmOGZ1uiFrdRhyE/uGHQOYkjRP1UeLjEsfUMib7XZ0o4RA
- F2VJaQuDfEd66rmtUPVX1oOJPJFNW0u2otUC4GSnDnvcIq2yOGfbWxzz80bLIR6LkMeipk19xngsQiFP
- IiTCwGMRmK0DB4f90XL+590f82uO/MQiZk4R0XG4kdOddnG/n9qJdnG/f1tldbblPVa2wxOJPmri0B47
- 8V2AzSLmZvZmxRK3KOINKwhGy4FmIRN6X9GhEXtYITNaxgxlBPV9NmxAohC/M4BYwMxokoOt8X1cb5/I
- qoYCbJxmMtw+ZnRhTxRmI84EMEDA2YxBBDxgFo9FCHgILB6OwFzIz6NA4rQFFWnlW4xHIvBLIzFSGomA
- 51h4n2PKwggGhLiorxQNEHKWjFa2ggAXbYkDCwN8tMUOLMzy9euck99OGiRmDXgrgjgmRKI26BAHGona
- PzRI1EruK2Ir71s/NltTcZqgsMIbh1wIubjXzxg8hwRoDO4j4HsCqG0DZOcB6zcRflfFlLsqwu6qGLur
- IvSuCuyu8saFsTFh1ugtMnJ7c3f3x8O9KmXIs75tFjXLvz2mFb01CRrQKF3bhDFshDjQSOJIzyQODdu3
- dcU6d8XBRsruATaHGKn5WONg41MsZLMvqzjWEwubKZt02hxspD53Awb7xNOxTsqXgiM9sZa5mYk8v10v
- F3NyS8piMfO3gMYUJpkSi9qcwiRTYlGnmWASPBa18WaiuJf8hFosbmY1rADeH4FRCYMGPErGtvueCWrZ
- YKK4V6Ts0xVp7fUG3U0xejdF8N0U3ru5uF3Pl7ezG9YN1WDI3bwuLerqlW7uUa+XXXjahtEorGLTNoxG
- YRWYtgGKQn2FfIIg1+lNMO/G6jRop7/+1TjQyKkjkNqhTWf6yxkbhty8OgerbdpJicTXMQaJWLk3vkcx
- b7PMP/uJtg2jUVhPtG3AotTMt52QYCwG+0Jq9J1nc4jqF9DFisJsUZknPKMiISun0oLrKlbLA2lzlEWa
- ZwXjYe5AyEnv/A8Y6iNs5+OSPiv1LZUNQ25WG85tvcncPr9qv69WX+TVskyiDdpAAjhGU5KqP3D8PYy6
- 6XO9LRY2Z8lP7hgNaICjVGldZelzGhgK0IzEo78rBg1wlPYtD6OBAPBWhHu1Ez25jdBTkI1a5p0g29Vu
- Mnt7d80pphzatj984l35wMFG4kIKGob63rVL5DO1HQ3bM9bJZsi5ku98j8E+wUtLgaWlCEpLgafl8v5u
- Naeu+KJziJGxEonNImby15I66HHS5zA4tM8uwvTC729eNSRcfUv77UHn3ws8Meh1hEN77AGJ402ZujoK
- /lk3NGKnFyE9ZxnVik+894UGiVmJJbHGYUZqaayDgLP5+CGu64os7UmfldOvhQRjMaj9WkgwFoM64AYJ
- 4BjcCfIuPuonT/yEFUCc9sMUxpZjuAGI0g0JsnKsxkJm+mDigEE+Yg3fMYCpT3rWzTNowM4q+JAyL+A7
- BheH/edRuo+znOPuUNjLy1In0OPkFoEWPxKBUwBavC8CvQHi4ojfyJ+CFcNUjMUJjIH5D8cNp9AbUMTL
- n7MPGrAo7XgIvaEPCZAYnPnEFguYGU0ssHXFaVjBbSr6uEZPYTbq4KsOos7dgencQbWUCH+WxZRnWfCf
- NeF71kToUyDGnwIR8BQI71NAnlV/ghAXeVa9DgLOuqQPbmscYGTMhR8wx9d838j/jhwS4DHIX0xaLGJm
- frHt4pif3KLtOcTIaHsOIOIM+eIYcfgiqUUJtrFa9O6a+sWSx+OL2M6XvT3uN2nFj6db8GjszAR/32v9
- ymsaQ4rxOPQGMqQYj8Oamu/xjETkNMwBw0gU6jfAAI9EyHgnn2FnTG/F9RxiVPXuGzzkrsYTL/gRtyVW
- rNXid3rZe4IAF/m9wwmCXXuOaw+4iLmrRQAPNVd1jG1a3y3nzU50nDdADo3a6XfWQFFvU2+QFyEB+JEI
- T3FWBIVQgpEYx6pS+8JsiR+A4Jpp8RjLHnhN/qj0l6KQYDRGkwLE7gJqGYlW5tn2Nar5OdzW+OOJuqyC
- IjUCfwxZ/apXXcRVsTCJL9Z56LN1Pv5snQfn8fMJeTv0QsavY3i2gwo8Q+ONl1ZVGZBqLT8eQXbzDvVT
- aJzW4o/2k/61A2gYiyIr2naebVioXjMS7yCLjqzuipCgkIYJjUr+qM5EUS+5TaOTqPVwrA6lUGvVP8nm
- J/fELQsarZm8IytfwYzT8/4IIfWoGK9Hm8+x+aXMCff7A8pLMVpeakuiBMToDCNR+KVXz3sjhJTDYrQc
- FsElo5hQMqpjdnn8GPBctLw3QveUBsToDN4odbYPCaFwv588SwngvRHaIedouwmI0jvQSF37T+0utP3O
- jGQ40Eh/p1XJDKBQ0KtGtpll4AnFvaxOXkei1rwsv7O68AMMupm9d7Tnrq0GzykOdBz3c2vIkV5m2+WQ
- 95Z55h3scfPaDj2LmblfKkACNIa6Nmbm1nHc38zHCghw4kciNN29JChIqxiJMwy/BsUaNHg89vieRqP2
- dlEm7l3paK+d3YU3BWiMtvgLebINxWgc9lOuG9AojDfRNjzi5rUdHkfbDXkZq7qozc2cJDIFYAxePxPr
- YzbdKVmDZipgnAcNnqEuLPI5u54bYMwdUpqLsdJcBJbmYrQ0F+GluZhSmou3Kc3F1NJcBJXmYqQ015cS
- PcT1k2DGMByeSLy+s7/fHNLX9PczRVBdJ0bqOhFa14nxuk6E13ViSl0ngus6MaGuC+vzj/X3Q/ri/n64
- CKmjhb+ODu3fj/ftGWvI6qDlXC8fVuRd7AcKtHHKR4MEreQ5BQOG+ugTOy0WMzO+MbRY1Eyf4WOxqJle
- alssaqY/xxYLmqlf/fUUZmONWTu0Zf9zxtj95QQBLuJLlD+hFbbUH6nt8I6xTfPl4vO36H62nH1td2Vi
- vAjDJKOx6nhDXF8TcYxEOo+eSmIGhhW+OKrwqxgPISbxxaJnSJv22clFtUOP2ekFN6wYjXNI0+oNYp00
- I/EYhTusGItDb/rDirE4gbkZq1mMgzivliGBLwZjcB/gfRHIxbEF+9xqtIEvV/SYnfERJuIYjRRWEveK
- 0TjZITBKdpgQI4rFNjiOkozGCivFesVonKbqzlIRGOukGYkXWpKJKSWZCC/JxJSSTB2k8uYbxOo1Y/E4
- HXhMMhaL/OoeNIxGIXc2YIUvTtNoZHV0cY0Vj/3tmeebs+anKm0+SWQsDOzikL9JPLZep107+fsj+Au5
- ZscEejN1wEAfuZodMMvXzK7i7wvr4qCfMZKkg45ThYu/E4c9Bgz0bWOGbRuDLnobReNAI7ktMmCgj9jm
- OEGIi9y20EHYSX+X43mDE7ZCzNjqMN3vjOrNIEErvYrRONtIXF7bXVlb/qWfVk6uYm0YcLOcgIv5PTL6
- HTJjhR5wdR7qd8zu98tNCUEfVBkwyyf/K9F2xInlvxg766AWJBpngpLF2mZqigBp0YyfxMf6qZR99FfO
- 6znQ4I8iixPq+D1o8Edh3FPQAEVhfvHu/9K9HTcr69mu5tyDE4lYP6U76tdVJgp52/U9ok1Wi5pxygYO
- +dmf5o59dR+wdpZ33az2x25dEm4+N3koQr0R6hTi/JFuH1jIfKQuJdNTro0zcIWuHNb8UG7Fga5TlGuL
- tIVpqU6dBczN9KCs2JVkb08C1tO8k+aYuEpjst0xjEWhblwGCSbEiNLiOTiOkozFIu8YBxqmRAm/pJPF
- E+3UPg+5TZoDiMT5egb/mjDoG8KRLwc566fA66YErJfiXSclYH0U77oooeuhjK+Dwl//xLfuCXe9E3yd
- k37pwCRNmtrzKOLHlCO3FFicZuk0+oAywAMRuDuaP3p3M1e/8pPGlyLcpqun5cpvuPrarc3MzTwtyM6O
- g4z0NfLQtSgfQ9akefSvRRO2xuXY+pZBa1uOrGvJXdMSX89SLWPDzrR7T67d87PtHs+3ezXoE8XJv2jO
- HrN8zrgFeawMNIxGIW9eBSvgOCrfcK/jxHrM3HPv4RE3eRsuSGDHoFXYzkwNWT5lCf1tzoCBPvLbnAGz
- fM1HMafvMegNfBdH/QFu1Ms/ZfhsqRNd3LktqrMsU5q+rK4OWs5DXIk02lXlPtocdztiaevQtr1dX6h5
- CUATayDszNPnND+NgyUpx24pfHHU74w2NuKAIzW/a6tAcSLZjtFI9EmriGMs0o9jnGe7TFb3YdEGDxxR
- rWVFH3+3YY+7OYvmjrIjDIqxOKxJRahlLNpR1uJvFNJQeeK2jwb7ybIddiRyUQmWkZyVx5FVx7mbPeL7
- PLLWMEfWL+9G/RkvGA3SsnYzZ5op2iSpDlrOdl4ep4dgkIiV0UMwUdfLGq/D17gRAaMQwjsKIbjjBQIf
- LxDs8QLhGS9groCPrn4ftOLsyEqzQavqj6yoz11NH19Jn7yKPrCCPmv1fGTl/GFkIzkSu5AminrpNYXF
- 2mbtdpG7vTbsc5M7vg49Zid3fUGDE+VwKCu1xlI/2kqM4fBWBNaYDDIic/oztRGgcbax3c9BbcVAMw6c
- bWwmkNIrWY2zjIx5kuAMScY3x+CXxqfvg6nLY2kcbuzW8xS1fJgfuXpDYsaKa94egzqHGxlvxADc7ye+
- GQNwv5+4ryCAO37mLnkm6VibDo5qk/FSxcYhP+eU4T3YtB94mcS7/5r1OysxvDmEv/OaA5vu5/ecefUD
- 5dh4szwN0HEy3pwPFGZjZAMH9rmJmcCBfW7OW3TYgEYhZzSbHczxRRb9Pr+dL2c30e3s63yq1eZM4+Je
- wsv5akXR9RDiim6vWDrJmcbsQFhUowc0xyaL6lS2SDZxEh2LFzXPtk73srEXV5PbEF6JP9ZLVRaPshHz
- mAlCB3jcBETd5uVG9hSj6vwdOY7Ges3nAeZzr/kiwHzhNb8PML/3mn8JMP/iNX8IMH/wmS/54kuf9ze+
- 9zefN/7JF8c/febNgW/eHLzmgHPeeM95G2Dees1JxjcnmdcccM6J95xFwDkL3zn/3O/5RaiC/e7zEPf5
- iDvoxM/Hzjzs1MfO/SLIfjFifx9kfz9i/yXI/suI/UOQ/YPfHpTsI6kelOgjaR6U5CMpHpTgI+n9McT9
- 0e/+NcT9q999GeK+9Lt/C3FDLYimsy6bze1KTklWpdv6NAeXHMsnA2I3q2GERXQVQJy6ivfqzXWRkv0D
- Cni7HkeV1seqIKsNGreLOp4+8ArCPnd54KtLvXWXivOLy8ftXmTPkfxH9H3yTAYA9XqjtNhGP88D9J0B
- iZKkW5Zbcogx3W6akJu8nD4hCzdgUeTve/EY/fyFF6LHx/yXYf5LxP892bHEkjOMFx8+cvOhjXq99HyI
- GJAotHxocIiRmw8RAxaFkw8hfMx/Gea/RPy0fGhwhjHa1lVTPxFmSliY6Xt6ibabrbqA6vVQU5Qm6Vrr
- 6v3F6df23gqqHlA4cWTOZJx5Rzm2Li8yjBrpWnlGxNau99UmCjEbuDRoPyU5z67Rpr0o+bnNZiFzYI5D
- JUAsRq7TOcDITRM8PQLyCcQjEZh5BeKNCF0B+NSsL/aRtGUkTOP2IPmYWzb0X5+nv+XCeChC91P0VFYF
- 4f0GwhsRiiySBzGyuQlCTnpGN0HNKYrzKCmjOJm8tpiGWB5VhVPmmhsQ4CLlKR0CXFVK2rTZ5gCjiJ/p
- OgXZrp/RdvqHxRrierKLLdUjEcvzmMqcHOfZ32nSTNiqy6jek7SgwYmitlops20qi7A83dbTd9fEeCDC
- LkvzJDrUdHdPWtasTvfRttxv5F/omd2hLXuV7pqX5urhb0Zsmp49ZWfFEQ0WT1UjZZHyonSw5RaBd1iM
- 3uFjvWXmUIMcrJs0PUb7MpGFiJoJnEbPcUVZ9gzjtQhZ2Y3CCdksou4rC9OmfZdE4qk85s0I1vQ5AgBq
- etV6gDInqWmmKtm6E1B/ipOEdAV+kxlV/UhPo4FybWoGvfxvqq7DNF8RxWqBouNGPtCFqEn5BGBNc5JE
- L2U1fYUjnTFM2/LwSlYNkOFKZIOHc60GZxjTnwd53wmqFjAcu6wW8oEjX6TBmUb1Bee+LOrHcp8SHiGH
- 9FkjsY/znO9ueSPCY1w/pdUHgrMjDItMkiouHlNygpqg6RRq7bSmSCdbLdT2Vmke19lzmr+qLw9I+RKg
- Dfu/4m25yQjCFjAc+XbPemYMzjSmQkT1U1zomWFJUYMCJAb1dlmkYd1ned5MbJHNH1LjHmI95lq2Pik7
- AKICK0aRyUcuesmS6UvN25xpLJN2P2lG/nBY0Ey9ewbnGGXhG21i2ay5YJ8ypADjqKxJLiJd2HF3LbN3
- 7ePOD4N6sIjsJHN4NAK1/HNY1CzSbZXWQQF0hRMnF0/ZTm2ezUwjh0ciBAbw+PfHPKRyxxROHG5702FB
- M6e86DnHeDz/yD5Xg7XM8lEr3pF8DWFaZGKzSkidc4yqax//QtS1EOy65LguARfjLuicY1RpSpQpBPQw
- Gq426njJD+CJcUycHOLmjlLmmaL5FFo1O8vNc1YehWx1yht2KIVscRAijLrMyEUzzsHqzzisYT6UL7S7
- 1gKGo1L9fl5/w0Zdb1fnNMdQxTprmtPkuE1l0mxJzoHCbKoDdchjrrbHLb/I/makrYaZvq6mJQt1DjCe
- 0rv5B9lr0JCdd7rA2YptXNe0XH9CTE8zpEk+Lx2zfDW7h+Kwjpl+muA5/qguf8psWqtdECmFswnaTnqt
- O0Cw65LjugRc9FrX4BwjtVbrGcdEvqMnxjb9ZN/Sn+g9ZbRE4VaoUXeRUw+gDfuR23k/4j33I7eBf8Rb
- 9y/kYdYXZ5y1VN/wC6HW8juozaryXfNSabIT4YcI24ssmq1uz6NPi3W0WivBVDmAAt7F7Xr++3xJlnYc
- YLz79N/zqzVZ2GKab7NpuhRqJLKYPG/RpFzbcSsuok1K1XUY4Kt371nCjgONlwzbpWlSL2vVXyPCOsk2
- pxubnd3I90KnXBv5XhgY4CPfC5MDjZcMm34vnmL5v4tmeb3X8/fvPkTlgXBHQNpnF+n0+gamNbuaFFM2
- M2S2ueq/pYWaODS5xMT4IUKiHv6rK/WJ+PV8dbVc3K8Xd7dT/TBt2XllZ+IrO4cfv95ztScSst7d3cxn
- t3RnywHG+e3D1/lytp5fk6UDCni75QcW/zu/Xi+mr1yA8XgEZiobNGBfzD4wzT0JWWk1aoLWqP0vtw83
- N2SdggAXrXZOsNp5+OFqPWc/XToMuO/l39ezTzf0nNWTPivzpC0eiLCa//Nhfns1j2a338h6HQbda6Z2
- jRjXH8+ZKdGTkJVTICClwPrbPcMlIcD1cLv4c75cscsUi4cirK9YF99xoPHzJfd0exTw/rlYLfjPgUFb
- 9of1Fwmuv8lC7fNdV0mTAkACLMYf82+La569QS3vsS7v202V/pg+89wlTeun2WpxFV3d3crkmsnyg5Qa
- Dmy6r+bL9eLz4krW0vd3N4urxZxkB3DLv7yJrherdXR/Rz1zCzW9118OcRXvBUV4YmBTRJjCZnOWcbGU
- 9d3d8hv94bBQ27u6v5l9W8//WtOcPeb4usQl6joKs5GWogJQy7ua8R4pA/Q4yTfehn3u6ctmQ6xrPm7y
- bMtIiBPnGIm7IJoUZmMkqUaiVnJiDqDrXC1+p9ok4ngYxdAJMl3zK8ZZ9ZDtulcR0pqwG4LNOUbWQ6hz
- uJGaX2zWY6blGQu1vYyHpYcQF/3S0Sdl+Il60dhzMr9e3M+W62/UAl3nLONf6/nt9fxatZ6ih9Xsd5rX
- oU07Zy3EBF0L0f5lxVVabZfFavUgCWb969Km/Xa+Xl3N7ufR6v6P2RXFbJK4dcGVLizn3XohG5DzzyTf
- CTJdd+sv8yX1tveQ6br/42o1feWpgYAs1Md7oEAb7cHuIdf1K9XzK+DgXNyv8LVd8isDAPf76Yl46akV
- mt/VwM6fTamk+pxkvYmP+lkp5CrG4zBSyjFAUVjnj5wx5xyds1J912/kW9dTkO2fD7MbnvFEWtbl3V/f
- mg53m7JNXbgivvJAJVCs9mzo+pazjOSGE9Rq4jWZsPYSq7GEtJR4rWOsbRxQGPrKQXYR6Cn9OB1SpDe6
- 5Pb0l3hPfxnS01/6e/rLgJ7+0tvTXzJ7+ku0p6//wkkGnfWY6YmgoY43ul+tItmRmH1dEbUaCVjJZdES
- GfFYskc8lp4RjyV3xGOJj3g8rGRLt2k6U4QDZdrUqvQUjzreNUSzm9/vllRPS2G2FU+3gnzr9XLx6WE9
- pytPJGR9+Ivue/gLMDW1OEd3AiGnbBXQfRKCXMsbump5A5vI7WoDRJzEZ1bnECPtedUwwMdq4Jmkz7ri
- a6Gnhdr37iHEFc1v18tvLGOLAl56wa9hgI+wt5bOwCZeDj+BiJOTwzsOMTJyeIuBvj/v/qBNLNI5wEgc
- Pj8xgOnPGb30kgxg4twDOP0ZaW+ku4ijZq2WfTr9YwYDMl3N5tnRgf6mAWAHc7qNfv/cfXBM2OnFwmBf
- ssk5PonBvl2ap/tue/LXevqWxj6HL9L+mPNDSNjnFj8qvlvCPnddhqbPyQBHeazK4yGSf86m71WJ8b4I
- lBUWYNpnb5ZnOlbT10DzKOA46gyiQ5Wqzxo5QXQejsDMoWjeVFN/1eoGTGnD+sz19omvljDuDkhmDff4
- m55z2CXoDieSfBhqtdvmtkxS9cVdHldq3RjqQ4xpnHgi2x/yZjva6Ge0LcsqyYq4pt55xIJFCyzBEYs/
- GrM0BB1YpIASETD4ozwyyy1Y4o/FKIEd3h9BvMXViLGradbwYF5Jy6JmEcWqpFZ3rn5lRjAcnkhlEZJW
- mgCLcSizom5WT+OFGHh/BH6+Gnh/BJUl5FMbdmNAlTeuiNIfxzgPCNcZjCjxTv1XtzpXXJBjgDwUof06
- m25uOcgoE+4Ulq7VYNNN7VbpjGHaZI/FsSnfm4Ke4LNIxNrWwCxtixregMraW0Orps+xTqOX29lnilPD
- DF9badK6kz0DmKj5XaMAG6v54W1ztD8W6SNZKBnIJMtptdhttI/Fd7pTpwE7+SHXMch33NBlxw1gUs2s
- Jv+TfT2JWFl3G2z1qZaT/iDJgoWsRx2jkcjlCS4xYzXtqCJ9oahPjGF6isWTSrmmnREd3l/+Ev3cq3V5
- 4w/nF5EQL8coqeJd/e5XQqjpUvBcun6QzfHPwy80zoE5CID2/ftKXJ5GW00SrC484iZ3eDGFEefwPX2l
- 1t89Y5qaFlpTLB8LlVZVKkRKqXcQAxClWWGL+vzZqNdLHXsB+bEItPsJC/wx6LkdU4zEacZTgsI0hilR
- whMOHf059TKItbKOgb769AAOpb9g+CENEI9Ry5qg6WzvPyNVDNBwqlXRyqZ51LSOyI8yyBsRujtNa/gO
- EORqGrHUZfwRHPKzGsMOi5rpi/ahAihGVjy/C4phCcAYgrR/hQNCTnOlVLra5KEItM7IAEGudo0+uq7l
- ICP5sTY40EjqhAwQ5GIUZRaJWENuObKKJXKAytj8UgNVmXHbcTER77qhK0ogmzXN7XhY+EPu83givklS
- TjPqZ9G+vfn74sPHKH7+edGvlUjooaAKJA51JVwQRtykIsjkEKNsf4SdsS7wxFBrBQbFOAmQGG3Dh9RM
- gOgxO7l/6JF4YyWlbNuGxGkFSIxTHv7ACtDTI/Zfg+zY8xWUk4BclFx8+HD+G2MA3AZdJ71TboODUy0k
- 9tgMlshSaKrPgCBXszQZ3dZgkE/tP0nXKQqyCSHS93Rdg1k+eb41OeVOEOSip9yAQT5yyvUUZKOn3ICZ
- vmbUjJhwJwYwkZNtoAAbNdF6CHCRk2ygBlt2EQes6QfTlp23ph2AAl7i6m02BxhpK65ZGOCjrUhjYbpv
- y10dEUABLzklt2hKJkE5KhnJUQk/HRJfOiTMVSJdErLSVom0OcDIeaIS3xOVBK0SifF4BGYqI6tE9r+T
- V4l0SchKfToS39NBXSXSgAAXtcxKsDIr4a8SCcKAm7xKpEv6rMyTRleJ7I/grBIJwqB7zdSuESN5lUiX
- hKycAgEpBSirRBoQ4GKuEonxUATaKpE2Bxqpq0QCKOBlrRIJ05Y9ZJVIVIDFIK0SCaCml72eIwib7oD1
- HBHc8vPWcwRQ00tdz1FnYBPluyubs4y89RwB1PaS13O0MMdHXE/KpDAb6dtOALW8nFUeHNDjJN94fJUH
- 9+fpn+BBrGumrvJgc46R+JGrSWE2RpKCqxtYv5ETE1rd4PQT4dNPDXE8jGLIXc9R/Zm8nqMB2S76eo42
- 5xhZDyG8nqP9CzW/4Os5Or/S8gy6nmP7I+NhAdZzNP5Mv3T0SeGs52hzlpGxnqPNWUb2eo4wbdo56zna
- HG5ccZVW24W/niNMm3beeo4uiVsXXOnCclLXczQg00Vez9GATBdtPceBgCzUxxtaz1H7O+3BBtZzPP35
- V6rnV8DBubhf4WvTVkxcFLuSYwYU43HoCeoavFECr2T0KsKuYPTsiywJvYJOMR4n7EpaAxCFt9Ymgo/6
- WanlW2sTO4iRWp61NodjWOePnDHnHJ2zIq+1aVKQjbrWpkta1tC1Nr0SKBZtrU2bs4zkRi3UouU1Z7G2
- LKshi7RieT0XrN8SULT7SnV2ge4pyzmDBchIwZI7CrPER2GWIaMwS/8ozDJgFGbpHYVZMkdhlv+/tbPp
- cdWGwvC+/6S7DnNH7brq8kqVkqtuLUKcBIUA1za5mfn1tQkBjn3M8DqzGwU/jxnAxl8cR0dhUmNtcuyC
- Gb8IbKzN4WBCrM2QZKxwXbSJjEZtkkejNgujUZvU0ahNfDQKj7VJKWpDYm0+0ocGLNYmpWK2bZpuy/nQ
- WJshyVnXB8ecM4wJjbUZgJwTiLVJIM61+Y6rNt95E9yujsTaJIfAMsvH2iRHsPLKxtocDyQ18GKxNsNj
- 23QtV1rQcREm1ib5GYu1yaCMF6/42Vib4wEg1uac4U1pT3gYa5McSnnCg1ib5EjCE+7H2pwdgGJt+hxj
- BKc2wlib469ArM05w5hS7gF//ROuvX/dlZxqHbODJm48lPe6e53oHVDem+j0fI2bfMEb1gSb+3T6SkO9
- tNIwOCjABWERAZMHvG5PR9ft6WfWxunltXEmbR2fia3ju6avkb0urZG9Js4PXaPzQ9fU+aFrbH7o/Hej
- yvpoU9sOw/anMj9+ra6hOHbZ/F3Wz8gtPvP/28raHZa5buqtcan/yU2+OoMIH8vhv7zq1n/hyrHLZuTa
- 8Pjkr+RVVv23aHWzX/2ZGaV8m/0zRTdiM99J7GUl10fjGgHqaPLKnq46IpoHQ0wHJZFzcckJX9YaCJY4
- AsQBRBK6p6Z0dxGlkesXhswZYlLSlgR5Ra7HA2E94rz+7ephxKeNcl9/AaqBmCyX/Texq5riLPa2nLvP
- TuXqaBYcOze/DUdzfUmy8/yUQ3Pf/BNtr3jY5GvPhX7J3P1XuSmbWou8KGRrcuCz1CVHkJP75PG4voqj
- VGBrd1LIulDvLRYaM4JT/59i19V77Do8GN/U5kpLcZI58DSEJLX+1Z//Xvbnj0gJOHNedqY5y1rIW/ti
- n0NbY6+2hmjMW1SlrE1/R/EQKitUsXzt4+OeT6giihviuRhh3wyNEvZUjG1KpGblaWL5lVp3Un3J1WRV
- sXyVfR7TsnFkzKrLY51mdWTM2tVPPMsDzLuz9FKSiUXvl5WSDCkl2dOlJFtRSrKvKSXZ2lKSfV0pyZBS
- kiWXkmyhlGTJpSRbKCXZM6UkY0pJY1sa76LIi5O8t/33QJ+Mp2N2oNUegBGnliZJabm4UVzytkUe9ggf
- 5NA3FBMuw8jxRqAr4mGBz3X8+kjKuHOO8t6E/3zkeOMFCVkYgJPTBb5z9dPZFpA+YtOuOxykG2GwzU7X
- PF5d3D43zXJN2T9J8fsnqWkPpHsURuC9wLHUbP/MXUAKsA3LoLy3vS+nEMZePm2v3iUlh0DC5+XqVqHy
- XylZPNiY+UOmWT8kNcKRaghEXB/i5Y/smzjm5iTVWx8zC5AyNGd3EafSzA+Ss9b2HmZK7hPVBOf89ljm
- EiX6Cc75dZEbk37RCc76f6pU9UBOVp2VSXMKPscYU+YUWHjmPuUvyUNDLEzcLjTVE3YOJ34XSfsJP4fP
- /PZnKVtoj5M545mQcd8RYByiNQr2OIi6uhaRdC2hD0C7eUhOeaABMyQnPDbuPALUoYVulJHIPzIyxAQ0
- 8e6pfVrUXVVhih6hnvV7IdxTE7ptkOfBpvZp9J4+ENZj+1gJKktRW7d+2HxITnigT3RP7dN9K/7Q1QWm
- GTHqO5UH6HxcempooDLjkhP+6ubbAEGfnhiQ6MhD8ok37hb3feP1O53Mmcl0fbwU8ZlvBqXelJlvn4sb
- t6nKbdwJFDYGnXlfRe5azuXqGnUiqKUyiKEyhN4VTa0Bvk9PDIXt4CKGPj01qMpF7t0DGy9RKrABtftE
- BBbVz5uDojvku/aYhd5h2yix7S37MyAZGWKSNyPOHaC5A8Rh3x36JLUBT2iOEV+5bwGNTU3p+tAguE3u
- 8ady5+JU1u/Qacww4nMFtNP5EXmSR4aY6vzitoaotVG5274OEPoo9WpR5m+iKjVSb8woz1YAbcsRII6m
- 0K2bE7ZPCHIP5ljoq5t+bAn1DRjxtUUJaGxqSg/DtEl3MoQ59zDwmyB+kMSqwUKlg1Kl4TebDt5sTasO
- CZNoPscan5o++8zD5pgycRbBWf9TU1ifedgckckrD2N9yLSVh7E+cMIqJGfWNpdaFLvisRpktdQHA6dR
- r9m4xqQfXdGgnDH4uYDj5wTyXUlXIPLfu97bkA1ULjiYcz+uSpJ7Bk/uW2KY+Fs0Svxw5CiRbQsIxLlc
- 2e2LLrrBxoKCy6d9aV/cHhxthmcwsYvm1yfMr6z5td/x0E2bJlzwOc3Z7/uSuDjquHtil83QdnZRwSd5
- 6ItbAwtuOfe5ic11/R5DBOJcpoFefQEYOOFJsVt094bhiC7AnZ98bmZ0X6zsy6PrWPWzhHl1bFRpTqv7
- v3EDn8tVqvLwDq2mjOCev1Vuw5J+RlFrgcWviwq8PPopZ3Pr6waN2SnKeF2mrmYwN9g7odTrxlv6Gtge
- PEnI66GB975qxHbvZa1LYAgoggd+mye83ReDBt6qac7adkPPUuxtn9T1dEE9YwhyuXeggWqPYr//9j+x
- hwL4R48EAA==
+ vim20tG0Y/tIck9nXliUSNk8oUiFoOy4f/0FSIrEx94g94arTs10LK21KRDfBIH/+q+zx7RIq7hOk7PN
+ a/+PaFNWWfEoRB4dqnSX/Yye0jhJq/8UT2dlcfap+XS1ujnblvt9Vv+/s3cff93ukt8udr8kvybxuzTZ
+ xe9+fb9599vH5N1v7za/XcaX7zeXH9/927/913+dXZWH1yp7fKrP/u/2P84u3p1f/uPs97J8zNOzRbH9
+ T/kV9a37tNpnQmQyXl2eHUX6Dxnt8PqPs32ZZDv5/+Mi+a+yOksyUVfZ5linZ/VTJs5Euatf4io928kP
+ 4+JVuQ7H6lCK9Owlq+UPqJr/Xx7rs12anknkKa1S9euruJAJ8Y+zQ1U+Z4lMkvopruX/Sc/iTfmcKtO2
+ v/airLNtqq6ijXsYrvf00eGQxtVZVpzFea7ILBWnX7f+Mj9b3X1e/89sOT9brM7ul3d/Lq7n12f/Z7aS
+ //4/Z7Pb6+ZLs4f1l7vl2fVidXUzW3xdnc1ubs4ktZzdrhfzlXL9z2L95Ww5/322lMidpKRvcN9e3Txc
+ L25/b8DF1/ubhYwyCM7uPivH1/ny6ov8y+zT4max/taE/7xY385Xq/+UjrPbu7P5n/Pb9dnqi/JoV/Zp
+ fnazmH26mZ99lv+a3X5TutX9/Goxu/mHvO7l/Gr9D6k4/Zf80tXd7Wr+zwepk985u559nf2uLqShT/9s
+ ftiX2Xp1J+Mu5c9bPdys1c/4vLz7enZzt1JXfvawmssYs/VM0TIN5SWv/iG5ubzApbrumfzf1Xpxd6t8
+ EpCh18uZuo7b+e83i9/nt1dzxd41wPpuKb/7sOqYf5zNlouVCnr3sFb0nXI2Wfju9nbefKdNfZUe8lqa
+ q5gvZUJ8nTXiz+bd+M8m/3+6W0qnLD7R7Po6ul/OPy/+OjvEok7FWf1SnsmsV9TZLksrITOPzPxlkcqb
+ UKssJjP1Xqg/KFFWq9Kqcly5O9vH26o8S38e4qLJhPJ/WS3O4urxuJc+cbZJJZw2gWTp/c9/+/dEluwi
+ BS/n/8b/ONv8B/hRtJA/fdl+wevQv3gWn/37v59F6v9s/m2gFnfRLpK1DHwNwx/bP/xjAP7DcIi0plo6
+ ZPBcr29W0TbPZFJF+1RWD8lUnUtaVoYO9Ii0ek4rjs4gLauqC6PNcbeT2Y3jBngzwvN5dMFPWZcG7Ewt
+ 6mOntEs79pCU8KfDo8zTdbZPVctG82qkY32SLVyeMsUm7LhZiYD8+pB75r9jqq7IiqzO4vz0S6Lk2NW8
+ 1EC4aog7Xy6jvIyTSBlU70Z2xaYGgtjBfHc/v1UfqGugVJk2Nxjv51+jKu3irWR3QbWJE60QC5g3WRlk
+ t3gzwkslW1Gu3oEhd8Dlg4Ihhvrj1eJe9lyiJBXbKjtQsiRMg3ZVP8RHWc8XWcLQ6zjq36jeCs+tUNS7
+ zQ6yfx9w5YMAjZFkj6moA2IMAjQG2+1xfv8ZFfE+ZYo72mtnX3ULo+59/DOSVbbg5XfLgEfJitAogwGN
+ EnALvOl/qHYBN6CjPfayLrdlHgVE6A1olGq3DUmfE476n+P8yJU3LG4Oyje+PJOJKJbtGsPckZh1k5fb
+ 7119x7PrBjCKqGWPMK4S7k01eCvC3df7KE6SaFvuD1XaTMUQu4MjGiDerkpT4JuCHBETATFl/nhHTz+D
+ hK1v8kMQDxIxS1gBsgTxcZMFSpX1XyofvIu2T7GsxbdpVZPMLg76z8P852P+5hPjjsT5IyMQ6EEitsPU
+ qxkrzAmG3enPuorDksxxwJFE+zM5ATrU9W6fUlk/HqrsWc2yf09fqXZHAMRo+6vytz1W5fFAjmDigD9P
+ 40pLPUGOYAuwGPZ9YkZyNFi8fZmkvBCKxKxlM65iXnsHu+60iDd5GpVbcVCN4iGXA31qCMiBRhLZY5F2
+ tYCaupDA/iCYIWEZGrvOhbp/RZGSu5uYxI21y4/i6VR0yT/MpAG7bN/JTsm4pqYRVymX7bKtrAWoVpvH
+ IqjywnMr0mflFWabRyIc4ires9wNiVnbGpdRY1s46G8LgqjV8xm6XqMRe5/ro+2GFUAXIDGaZkOw7C2K
+ eE/dgSjPRM3SGwY4ivxTfMzlkDQW4oWbSo5kYqzoKNIqiev4TYL2Njh6+jPihupQ1FukL7LbkKQ/mfKe
+ xyIE9gZACRwrK3ZltI3zfBNvv3PiGAI4hqwM8vIxKIqlgOOoia6mhuAWIEOAx2imc1jTHpgEiSVvXXgs
+ W4LEYvQITxxsZPYGNRT2/jhm6pH207FOyhdWkpgGOErzPCV+os4+OTRs73pPMj/LYQ477V0LHI34RBNA
+ EW8uZC0jv7P93hZR1s12LXA0mX2z3WtQLWIpvHGS9FA/BQRpeG8E7m3XcNffPBHtvpGX25hVBkGJG6tI
+ 5cim3h+i5Yo8AaKzkPmFLnxxPVW6L59T7gSHSbt29UEUb7fyTlPVGur1Ro9lmQTIG94foUqL9LGsM8YA
+ C9Eg8dpqanfMc1acAcf8m+gpo3eWdBYzl3JQsOXd5I71m/m3WReMxAi90YAHidgMRprbJbK/ecFMhSdO
+ 88UNO0aLe/yqrx7gb3GPv6tkAkL0BiQKu1B4SoRaAJzyrC2KeIvjfkN8JGeiiFeE50gxJUeKsBwpxnKk
+ CMuRYixHiuAcKSbkyK5Xycs/Jxhy1++6BZrRoSwZzYzJIxFY84XCM1/YfnaavBE8dY8j/lPflz3/BlvA
+ aOfsNDr3pJH87Fg9c2qdHvV6WdMGNo9EYM3VDiRiFdljnD/yEqRj/WZ+kugCJEbYsw5AgcR5i5x/PjHn
+ R3JoWb5Ex+J7Ub6oB8eHbvaFc5NwGRY7MNoUv0hz1QnktA62AY7SPn1n6TvU4+Xe/9H73nweOEWBeZCI
+ zdRuXCScp+uOAI3Bf54ixp+niGHVKbOm0XHEH/RcRUx4rqJ9JyTzGgYkyrGq1JdUH4gbxlRgcWRW33f5
+ kBdFE8Axgp9EiWlPosSbPokSxCdR+ve7Yn2I6ycRElf3IBFL0dTksp5tJoh5aWtL4FhpXOWvzfOybv0B
+ pykHLEg03lM94Xuqpz7cxblI1dqQqmt20yTqXp5tWi1OwDEnfCWPVRpLLCAtTQMcJXssZFumOlDn7yP1
+ GOSxihNWywibkKghTxvF+NNGEf60UUx52ihCnzaK8aeN4i2eNoppTxtPXxOp7A3sqvhRvUjLjWVIkFih
+ TzbFtCebgvlkU6BPNptPRFj20vnxCFFcPYZGUQ44UqGevbWpGNSzhzxjEUUUJ89qeZZIk+CwlgyO3SwA
+ rFJxKAvByhSGAInBe+4tfM+9RfMSSb8UlrPYH7Ug0cT3vkcakNUBDR6vezk1NJ6lQeJ1G2VwYrQo7P1x
+ zLYBt0fDUX/A6gcxYfWDCFr9IEZWP7Sf12rkWRayxyee4osPH6Nyp49/BC/qmBW7mq4/Lfu4smQf9ykv
+ um2Bo50qx2FVKrPmA0VYzNDVJmLiahP9e2rIXxa1rKBDog0WfzRV8JOnlLvWxaNC4kLrutldQdyGR8+K
+ R/ViSlnJEcW+2b1IcEMDKiRuVR9Uc7vL8pQXTRcgMeoq2wZPC7kWOFq37Ei9LBhQbbsWLBo7d3pzozkP
+ HjJ2hE1oVNX9attb9VoZt6sKiqbGDOku4DZ/9DqujyL01/aSKbF4jYTt8EYaVuCFRTM8EyOKN4knvNGO
+ ajJG1j8BoU4KJI6ss5Mnlr4hfdawbG4q8Djpln/9isXNlYi5Yol6vcFJozuQSNWR1ww1IOzkT677ZtW7
+ XugbdAxgkzcqa82sGF0ze1RD7h3V21KATZbh+3YU/Af9wZlJj9mj2er2PCxEoxiNo/pTgXGUAo6zXM3C
+ EswQTIjBTjbXMiUaN/FcCxwt4BVGCx/1s1POdoxHah8fc9MONo1HfYt4eCQ19Gs3paxfo6eMPgcOSsxY
+ 3eZWkdpgtX8cNDz+okQcUcFxtSdt2/iguveckK4FjkZ9G1jnMGO5jzavNW0A6tKwvX33lrwxDIB7/Lyp
+ EUThicOe7sYtnmiHNCDNFDzi1suwCApkmMaitnOJYfFahyfS20wnTVR6rqMdS7Fjtjjq5zy9B3Cvn/Vu
+ LubAI9EWLJokbt2rvZEr6oIu2IBH6bcjYzx89XnwiN0QPc92abPuiNq0jrl8kfcpP9I+9ZuJc3kAjvsD
+ b473njzFIrRysxR4HH6VMtCwPRPtoxZuH0bn4QjE9xA1DPY1K4l5VUeHer0hvQpLgcYJqcPFWB0u3qh2
+ EpNrp2H2nhvHl0NFQA0kvDWQCKuBxFgNJORYIk+ijXrbqXjMUzWyYQUCPHDEuuT36k+s3xztyirgZgMa
+ OB59vsokTSv9BWPoveKA/f28e/sF7Ovn3dNPbS4XHw551r59rjJsTdkd3OdwI7H28fPs4ac+UrMM3WsD
+ x82/0m0tVA6SvXDaRPWIyoqbqy+pTa67HdFJkWx4xB3lZWCAxgBFaUbp3aSwaqLzmh7HdUCR6tdDyk4r
+ DR5xM9PKNphR2pUYTxkpcXrIcqkFMu1WfCTbgFm+kP0fR/Z+pF8lcH0hezuO7OvI22MR21+RvbeiZ19F
+ xoYG4D4G22NdP1Xl8fGp2S81T2kz3ABu+pM0Tx/VmV3RtkqbKdU4Vz0IUg8alVixyuYQDzmc+U76ETpn
+ GWVzznjtSMNMXzvn2q/p3dY/1S5faXMKkhrzUYKMuaDIzWxv27mg3QEAR/3q3QXVVpOrZMxhRQrcTXR8
+ J9E320WUsINo8O6hE3YOTatK9nuZx284sOX+eSirZgmHaun2srBWspCSAoAGMwr1WYT7DKI/NlAtbmm2
+ gKf4XNq21+/0V2RphcylAbv+GEx1LgQ5gmOAovCaVf++p+2W7sNrBv0mNPRUAi1ANPbzk7HnJrz9W7G9
+ W4fnDKEjJr8Ji8p9LjPleczwna4Z7/Zjb9ekMMOBKiyuvQ6GGdPRAPG6Nxeq9MdRVvOy0ifuBoJKwFgh
+ y7QRBRTnTZ5skZ5oPTYbUND3fNM5xxh1j/iJwhPm+pirQiwU8LZLnjev9CNfABz1M+4gvhqbua8yuqdy
+ 2H7KY3spa59Xsudf7pnyFgbc3Sv69GUILu2xDwdcsEMMCjzOcFArM0ovAGM8p8Surs5hRurhKibpWk9v
+ 7jNm7AHc9TtjH2oERwDEUF14sldBgIv+DAl9/q99EP314d1v0Wp9t5w3q7Gy5CczBGACo7JWG/hXGXSb
+ d+9FJI4HNaihqzXYde/IpWUHlBP5j0w8pXRXx7lG9t4AI7uQNx8/k9sVibiefuAW5Sm5jBmw62bvJzCy
+ c3nwruUTdiwP3q18wk7lnF3K4R3K2305T+O+qC6/p0W0kUVRTR1wRmUjNjc6YzYX3Re9WYlzGkTRN94D
+ cI+f2WG1eSQCt1IxYMx9zPPQJLIcSKTmHe5adu5EMyXVZAHBigeakKhqcBTXxyodhpismIAHithmb14P
+ 1aQBO+sIGpMErNqybLJXY/1m8tI2UODG4L/3P3biQbOF8CYrqU7FACbWzgG+MxP6z4Sa0Si2KUt8ggE3
+ vUNUQT0ikW5VqRl2x26mznhdOJ8LitzO9xpvV9NDAhIoVju7xBr3GjDqVq/kMcq+SWN2zshuIH3WZjac
+ r25wyM8aoaOzWOIprtQcGm+yxaRRO2NfWpeG7LzaD6/3gMauO6GcHAM1TYuqBgesDORxTYvMKhGIB4jI
+ 3THi0b9bhLYSPH5MI/GdtlIXwAE/+3GqS8P2Y5H9oE/RDiRo1d747x9BMUJAmrF4nBzsGtwoARvrjp77
+ E3Lmj/+8n4Czfrzn/Ggf0hfHOTDo5rQ56Kj9hdG7fAF7ly/0vtoL1Fd7kVVWyu5QmrRpV+8shD6FxRxm
+ pKxgvjVqgI5T27SUKNVIxyrH5lSdQiyPiBJZW5A8LeJ4lJw13WCzjrnt0RGVLeS6gGZWbVZxENRE8Jic
+ qAF7wrq0azfmx3iLODwaM57qCR0PCXHGaqBMW55tqrh6JWdmnbOM6qC14VEjddwG4IC/XXvVLoYTZL1B
+ m/Z9/Jht+9mcfvu0mpT7UYkdS20sG+dRKQsKdXrBgU039xw7/Aw74ntjzvtixXFvDv5J982lTfshTUld
+ KPV929DcLpqkQSxPVW7VmT7NROehFDVvCa5HA8drKyn1AO6U4eivBY25nMjPWZK2l0htsR3YdLebhso8
+ 3v/qaJdnj0819SmVVwTEbGbW8vQ5zclRBhTwth0snlhjTXNFrDQqp55gHqCHnpenfcApUQBu+4X9aP9f
+ xFX/iMKM021FOqyqpERwYNutNhOXkfP2lRia2mRtc1taq5T6QoFJ2lbOCWHY6WABJ4N5TwVrPqRO+vcQ
+ 4Ao6Y2nKyWLNd144V/wCXfE56x6dI/eIczIZeipZyIlk/tPImk+ht2HIISAJEIv8LB078Yx72hl+0lnQ
+ KWcjJ5wFnm42erJZ+KlmU040E7w1rwJb89qc/9WeFazm+qjXa7CAmXf2mffcM/UhvcaJoPqGczAUeqJZ
+ 0OlfIyd/BZzI5T2NK+wkrrFTuJrPu+OJWZnLgAE39zyskbOwws9PmnJ2UvOd9gWvdPvUHQ9EDmILoBi7
+ stqmzcRSM4ci4kdGHEACxKKvIEV3HxHkVZECWBX5NqcqTT1RKeg0pZGTlNTH/0q+n59HL2X1Pa7KY0FO
+ HZt3I7DXO46cnRR8btKEM5OCz0uacFZS8DlJE85I4pyPBJ+NFHIukv9MpNDzkMbPQmq+UR/J0vroetiv
+ DI6cLsQ8WQg9VSj8RKEppwm9wUlCk04ReoMThCadHsQ8OQg9Nag/8kffTpX+Np5Hg8Tj3W70dKL+w5Bl
+ r6gEiaX22lXD0K0cw8j66FBmBS/VIBEYk7kGaezUJf6JS77TltrPhilCTj1v81CEtzzLiXOOk6Cv4RTQ
+ Gk7BW20nsNV24WchTTkHqfnOU5poU/bye7uM3ESCEigWL//jOf9tXhCmnKL0RicoTT49KejkpJFTk9qz
+ jhgjXmSkG3b60pSTl97mvKKpZxVph7c8qQeD1NWOEI9GCFl1J6auuhPBq+7EhFV3gefmjJ6ZwzsvBzsr
+ J/CcnNEzcrjn4+Bn4zDPxUHPxAk9D2f8LJzmG+7LbeTKDHIAkagn7iCn7fBO2sFO2XmbE3amnq4TcrKO
+ /1QdEbKCVPhXkAr6Ok0BrdNk9TTgXga5fQTaRvUnxq5kOocbydtDOrDprkv10Ju/ggjizQj8U5R8JygF
+ np40enJS4KlJoycmBZ2WNHJSUvgpSVNOSAo/HWnKyUgBpyJ5T0QKPQ1p/CSk0POIxs8iCj6HaMIZRGrd
+ SvSU5nmphtvV62m3KGIY0GFGYsxbgzPVLzEtEdT3LYNaGEZSKMBwPF+8P01EkCfQHNYxs5SIq5vFZCkN
+ djCvb1a8H++AppMugyysH+yAplOdqBVtjrudzJAMM4Ab/ufz6Jydoi7sunlSzMZNYRe23RchqXDhT4UL
+ phSzBaTChT8VAtLAmwIcIWwK+O3IL08uskg7/2Cq08JQH2X1DoAO3uwi4VynhaE+ynUC6OCVrf7V8tv9
+ +i769PD583zZDOXb4wF3x2I7NcaIZiye2jf3DeL1Gk+8JE0PzYWxQ/UGTxS1uL845jk7yEngi3Hc8/XH
+ vcd8OIontlrBHreY/s4ExHrMpM0rYdqwr5bre/n9u/X8aq3KjfzPz4ubOefejqmmxSXdb49lUjRiHvBp
+ zHhqpefi/ktfR+wP1JKPKbA4au1xnfICtCxqPh6Y2uMBc8o/JTypIjErJ9O6NGqnZU0DxJzUDGiSmJVa
+ Sdio4W22fLydfZ2zszJi8EZhtM2YwheH0yZjCiQOpy0GaMROLEgmiDkJBwI4IOIkvPppc7iRWthdGHEf
+ ygM/FU4w5qYVeRNEnM166pCCqQuwGIQNuxzQdYYVv7GSx80ceL6g1f4nxPVwsxaeq8RTtiPfmQZyXdSW
+ Y4AG1+zqSg7Couv56mq5uF9TjztHcK9/+sYDIOx1E2oumNbs81V09XV2NdnXfd80bDfbKC221ev04w8t
+ zPLtNucXlyylQVrWuuJaDdK0JilZ1yGmJ91uOJemYZaP4YI8JftelJ57IZrN0psPKO9FAajr7QJyvBpq
+ eo/FSxUfqMqBwmzRIU6S6QuqQNh0c64TvsqAa8SvcHV7Hs1uv1HqxwGxPJ8W62i1Vt9vDyIkGW0Yd5Oa
+ CoDFzY/NS4g1V97huJ+v9lkpzY+L4l7CFBWAer0hqSzgVP56z84eBop6qVesgaiTfOt00rbe3d3MZ7fk
+ 6+wxyze/ffg6X87W82t6klosbn4k5jETxb0ZW+tLB+rtMlHcK/ipIHypUJfRp1uuuYEt92dmJvuM5rLf
+ 57cy3s3if+fX64UcCsbJv0hmgB+JQG+aQMNIFHKRgQQjMYg3wcVH/NTsDvAjEQ4VYYkObhiJQi1eAD8e
+ gbjEcUQDx+O2cC7u9fPyFdbamR8z8xTa6i1mH7ipYqKol5gaOog6qalgkLb1dj3/XT0D2h9ozoFDjITH
+ OjaHGOn3SAMRJ7ULoXGIMeMJM8xHvtsDhxgF8zcL9Derqucoq9KPv3DFHY746V0Rg7Sstw83N/TM1FOQ
+ jXjTOwYyUW/3CbJcd5/+e361VvtEERb6uiRsJaedxsFGYvr1FGyjpuGA2b6r9XyYWCBWkTbsc1MrSxv2
+ uel3y6Z9duqdM1mfmXwXLdjnplaBNmy57+Xf17NPN3NukkOCkRjEhHfxET81+QEeixCQPt6UYaeJJzX4
+ 6eBNAcrLowBqeVfzfz7Mb6/mnMlYi8XMXCtgXPMuc41cYZvd2rSJk4RmtWCfe5uncUGspyGBLwa1O2rD
+ sJvacqFt1ukDwmoTm4ONlE3FbA4x8u5Ugt0fcpWF1+TDhP879g/vYdTdH1+8j8V3ZgjDAUfK0+Jx+juy
+ LglbqZUu2uZ0H9CninTQ44ymn0EMsX5ztDuEyCUO+wWvlhFY/aI2/GUK36HGaPMa3S6umd6Oxu2hpUNM
+ Kh32t6JYbN8imvLAEeWA92H9+ZITpEMRL7XDonG4kVvQT6xlXn8851bXJop6ib0WHUSd1DQwSNvKfMay
+ Rp+xsB6sIE9TmI9Q0OcmzQdJttvRdYqCbPSMgzxv4TxkgZ+ssB6nIM9QmA9O0KclrEckyHORkIch/icg
+ zaeyentMi7SK8+zvNFE7VdEjuA470rf7Obm/fYIgFz0/nijIRh1fnCDIRc6RHQS5BOe6BHxdapd1luzc
+ sj3cLv6cL1f8J2eQYCQGscJw8RE/9aYBvB1hfcVqIjQOMdIbCoPErPtDs01dVPPUPY746blEAxFnxrvW
+ DLtGci4YOMRIb1IMErFSqwWNw42c5sXFHf/nS3Y1YbK4mZwNNBK30jODjlrePxerRcA8uIt7/cQEsWGv
+ m5osDm3ZaQdca4jlafsftRz+qM1CST4TxbzP73nS5/eOsY7KDeXsKwuzfFmd7qPkIiPZThDiouwB4ICY
+ kzhto3GgkZ5xNA40HjkXeASvTh3twLklLYcYyfWGDiLO7CJhKSWHGKk1hMZBRt6Pxn4x6+civ1VtfsEq
+ Jx2IOTnlpOUgI+t2IPfiEBN7nj0F2dR2xXSbojBbtK1/8oyKhKzHgvebWw4y0vb/tDnLuN90uy6Snz0Z
+ JGYt+NoC8LbNl0zvv2klWuMso+wl77M6e07p1YSJ2t5jHaUlbU66YwATo7UfMMtXx48X1Bc9OgYwienH
+ I+uMbUr3h7zZP5B6EwxSsz6sv0hg/S1a3H6+i7oXPEl21DAWhZC2CD8WgVIjYwIoxh/zb4trZioNLG7m
+ pMyJxK2s1OjRwftptlpcRVd3t3KoMVvcrmn5BaZ99umpAbE+MyFFQFhzL+6i+HBojnXK8pSy3TyAmt7+
+ BKNtXeUUqwFazjyNq2iXx9MP1rQwyNduCMq0arDlVhudNAcFN18hmU3U8lKT001F+ZdmuNgcxkLcTBUV
+ IDHaE64fj3EVF3WassJYDiAS8UBqmzONSXk6YZHiGyjTlpY7ikZ+3eTVjjCkx8gGZLlywi4nPWA5Ktpd
+ tOrJ7i9RnOdUi2JMU7PWhrAUSGdc0/Rt4AcCsBzIloNryYqspnoU45r2ahKCkUYnDjYepncMLcz1qd1d
+ ZH6dviTIAV0ns063UMyrjhSdvk00xLpm6gkCNucYqT/c+rVP6c/kuCdl5g4xPeoGFaS83BK2pSa3fCfG
+ NKls2BxOVdBSSOdsY/1ErhZ7CHBROngaA5iaDaRIL7MAKOYl3g4DRJyJ7EhU5StL27GImVogDBBxykE4
+ z6lAxFkRDtVzQMRJ2kzeJV1rSe+RaJjpI2Z2J5+rRmCTldEhziqiqOdcI6MDqGGuj9a3aAnAQji/QWcA
+ 04HsObgWVSdujjuqqsNcnyi331NyoreUbftJ9Py0Dcf9Jq3I5VHDQJ8qUbINYSg70rQyBj7gmOdQkjKE
+ /LrFq+UIpIzQEpalrsjNyomxTMSBzsEZ51Ard7dOp2YdN8+0p6WK4pyqaSDAxZnlMUDbKWjFtQEsxwvv
+ ql6QaxKculvANbcg1tvCqbUFuc4WQI2tTuTY0yQSsB302lWAdWvTh8sJp0obEOCSSd+cV0nNAw6MuNVA
+ 4EDYJxWEETfbCzupI3UBzmYI8myGAGYzmr9RR9A9BLgOZNHBtVBnRgQ4MyK6CQli70XDYF9a7tQ4/1gV
+ HO1Au/aCsJRAZ1xTPw9BziED6bESZ0aEd2Zk+FQc0m0W5zx1B2Nu8gDJQl0vZzZHoLM5/VCsO6GJ9Igc
+ FVgxnspjnkRyRMRJaRsG3eQsN2CIj/hgRedAIz0jaJxtbO+k/Iwm7DHLV9D72CfGNNWpYFTsA2XajurY
+ Z9JVtYRpeabOnz27c2fPnCR6htPohTGwegFHVuQsBeSltugSH5n0EOTidLlNUrPezP6YX3y6+PBxsq0n
+ IEv0OSsI1Y/FgcYFpdNgYqDv4ZBQ5lRtUHPeRp9uFrfX7Xv+xXNK6E26KOwlFS2Lg41Z8RznGSkJQBq1
+ M5Mh86QCZZ7RxAzf1fqvKJ1+uMdAOBbibTkhjofwctpAOBZa8nSEYxF1XFGvpmEM0+/z26tPzToQgmqA
+ AJcgpVHPGKavd7fr5oIpix5tDjYSs4LBwUba7dQx1KcqGVFTXgBFBXiMXVlF+zI55kfBjaIp4Di0zKBj
+ qC/K1TxJwtR2tGGPNyLKRPRSVhSrRpm2hGRJHJp8IR1iesT2YlNQLA1gODZZQXO0gOmQf8lIjgYAHMRj
+ AWwOMB5iuu0QO6btZsO6toGzjUm6pakkYDueCGs8ToDtyFPWD+sx27c/ZDSTBAxHsw6QoGi+7xoo2/Pr
+ DGAiNicDZLoIiz9uzffw239T64wTYnpoja3Txm7LY6Eq2Jfo77QqVYIJks6hDbvM47TaqAVMR/ZMEWTP
+ Nk1N5xNieo6Uu2281Sb/nRZPcbFNk2if5bl6/Bk3lVyV7WVPv35tJg8I+ik6M/6PY5yzOigWaVp/UtJE
+ ftugiaXQKX+7qtzLjkxRP5b7tHolqQzSsD5uKVlFftukT2+tqnuRRqTq3GEtcx1Vu+37Dxcfuy+cf3j/
+ kaSHBE6M4/TNlgfCsRBL3AkxPLJto9UdLWA4SA9Dbu3nILeqryjrNGKPeIBsV5E+xuqVKZrsRNm2ktRp
+ bQHHURAvRgK241C+XNAkinAs9BKjUbBtF8taS83L8rQabvuJGRwac8i/qUaTZlGEYclTWiFpvm8aSCcx
+ 9gDgOCdLzg3LPq7Ek2xtSCs6TMzyie/UHk3PmKYyIY4ROwKyRD+O2fR3Ym3OMdJa4Y6ALBdNm0h3tRxk
+ ZAr9PlY3BhbgMYjl22EdczP1KqiX3FGYLdrkajF4wrOeaNReJlxzCeR8cj0zQIjrnCU7x2yscmmwiDlA
+ jHj3x5yokwRk4XWgXdhxEzsFJ8TxiB8VUSMJyFLTNW6+E8cNVXPcQBZWlug5x8iortxa6pDRuhItYDpo
+ +dLOkzJLUX9Jhxge2uS+PadfFDJ5KLz6vmugloABMl3HPbULc0JADzWBDc41vsr+MdWmGMNEG4TYI5BD
+ rFoc1fmLjoXai4TUHgK0aefO0XhmY0i72p2+7xooCwYHxPSI9JiUURWTnthqFGZT/+cx5Tlb1jATL9C5
+ MtYlea6l/TNtWGlwppHaM6rcXlFF7hFVQG+IeAzuQDgWxlSHjjk+2ryUAOalBH1eSkDzUrQeid0bIfZE
+ nF4IrQdi9z5UD4KaBh1ieOoyso5mJRhdGHR3Z60xxB1pW1ldXYMzjEfahMDRng040h4gHe0nSEdaVjja
+ eeE5zo8pse3tGcNEnMay5rD6r+yOxbbOyiJ6ItRAIA3ZRZrvaG24i2reh8/R1/nXbouXyUqDcm2kRyIa
+ 45oeq/KFalIMbGrPGOL4WtK1UrroA+J61AtT1TM50TrM9O3TPeUpX0+YFlFXREtLOJZ8G9dEjUIAD+EJ
+ 8YA4noL+swrodxV5WlA9uf5e59WnT810KGWaWGdgU7Qpy5yja0DESTq81CURa7mtyftNowIsRpa0z0lr
+ wpvCuAGJcuQn0BFJIdKQ1IBclzjE25TqaiDXdTz/SDVJBPR0Z1zJIZ386Of04a5HAcbJU4Y5h377Bfke
+ SwT0BP92VwHEeX9B9r6/AD2MNFQQ4KKXkyNUPuQfGdekIMB1SRZdQpbgm3rpv6fEMxY1xPRQ3j49fd8y
+ ZMSXqAzIdoltXCXR9inLE5pPA02n/I9s+s4AAwFZKJtFm5Rlo+zK1gOAo2041KB++p5zIGy6KYtMTt93
+ DRE55w+UaSP0r7qvmzyxT60hpocyLDx9Xzesuu5VWqlReJJW02UOCnmzuttr+SkWlFkv3ABEUb0geQm0
+ XpTLmma1z1acFaJbdflKqU4g2rYfXqndKJ0ybbQ6c+XUmatmdVhcvBL7+yaHG6M0T/eEHdgwHo6gcmBo
+ FNsBROKkDJwq9JGQBSJO7u8f/d1Rtj/k2TajD4hwBxaJNlixScR65GuPiJdceHvIdeWxqEkdPQNzfeVB
+ zdIRV3mB8IiblY1dw1gU3mB8zDQWlZdpIIcbiTRS7RHQw+/YowowTp4yzHkKuC7IiWqNVPs/Bv92/0i1
+ +xJlpNojoIeRhvZIdUVdQq4hoIdxTfZItfszuQKD6q6QkSpmMKPQxhIrZyyxUouETwsZ+rYnfaR1njGH
+ E6l5Ud3qDBMDQQpfHN7PcQVmDNKYaWWPmVbt7kTqVRmKpYdM1yFNv7eXWsek1DRA0ym+ZweKSn3fMtTT
+ nyidvm8bKE9GBkKzzJfrxefF1Ww9v7+7WVwt5rRTKjDeH4FQIkHabyc8CUNwzf91dkV+Bd+AABcpgXUI
+ cFF+rMZYJtL+JwNhWSh7nvSA5VhSNngcCMtC2y1FQzTP3e3n6M/ZzQPpFFaTsmzNHgGpoN1/G0Scednt
+ mckS97Rlb9fy5dn0Z/wWpvmWN9H1YrWO7u/IZ+FALG4mZEKHxK2UTOCiuvfb/fou+vTw+fN8Kb9xd0NM
+ ChD3+kmXDtGYPc7z6UeSASjmJc1wOSRm5SezL4WbOWPZtPLMJxqzU3pRNog52dnBkxOabVDUo2l2SugG
+ LApt5zeIdcxfH9bzv8iPswAWMZOGHzaIONXmLaStDWHaZ6c9UYNxxH8swq5f4/0R+L9BFzgxZEfxm2zh
+ qQ/2IBh1M3KNjqLeY9PJiTbq5wlmAMPhRFqtZ+vFVWBGhSUTYnFuOWLxR+NnYkwzKV7w7/Pm7PWX5Xx2
+ vbiOtseqojxagHHc32xJ3R26xw2iO/yRiuM+rbJtSKBO4Y9zKNVESBUSp1M4cbab7fnFpdrLpXo9UO+L
+ CWPutAhwd7Dr3m3Ux+dcu4Vj/ssw/+j1B9lR91Ms/xddvKNqT5xrbHsiqm/dHNtO70UDBjdKXQWkiQGP
+ uNU/CbPxuMKJsyur77JA1OoQ5+yxKKs02sfJc/SSHdKyaD5Vm/qpFeqU+VeO3L02dfAg7/bpqON93O5V
+ wsTkFmsAMSevXjLhETcrL0AKLA4vP5vwiDvkN/jzc/clVpfUYDFzM079nr7y3Ccas8umb/qWZACKeSmz
+ /TboOtXBF69t/6k9po7bh/GYvFG78+beIqyt8sZtLzQ8qOEBI/KqPY3ErOQTPxEc9DdVerfZWFYWjBCW
+ AYzSpB5lB3WIRc1qzV3ALbYVYJz6qTnZSX6X8LABxl3/U6xWutLHzQPoONUaxFjsicKOcm1tx43c3+s5
+ x9hUq+JVUN7lBlDX2xxOtcvUoahZnEebI2U5tMfhRMqzTRVXr5z7pqOOd99ML3O0Gula0z3hDVMDclyq
+ RuHVdhrpWo/7iDO303OOsQwZAZX+EVBZbKmVmUIcz6HMX8/fv/vA6/9YNG5n5CaDxc1H2uNKkHbtctwh
+ ZPHelD9Zl27hjr9KGPVOCyEutfdMnR3y9JJySpZH4cZJd+0Gu3JIEKmvN5sRkpbVj4nwmFmx5UaRqONV
+ 80XqVZ2Q3hnoACO9Tc9XEHq+4u16voLS8xVv1PMVk3u+gt3zFZ6eb3MMXRJy9RoN2gP7jWJKv1GE9RvF
+ WL+R133Cek7d36NsF8XPcZbHmzzlqQ2FE6fOxbmsoal15AnTfOtldL389DttT3mTAmynnZfJwhMIOElt
+ mA4BLvV2FWGpqYlpvqf4SvXMiRM7BjXYruer01TV+6kunTFN6XbzntptsznHyBQiviS9UA8QWFKLdczv
+ A8zvPeaCfn9OjGkqmNdXoNem6jrCFJ2GgJ7oWGyfUsohMyDsukvZ4TjEVVaTL3UgNeuXqIk02dV93zVE
+ h+OGlIAWZxrL/eEouzdE30BhNjW/8ES4JxCMumnnnICw4aYsueq+bvD9Dv60ZNQx2CdzUbxP67QShC3n
+ UIEVo34XPZKcCnAd1N/cIq7nQLUcAMcP8i+SCOCpsmfODztxgJFcaHXM9f2gmn7YDnUoxK+/nf8WXbz7
+ 5ZJmM1DDe9qSfch3BLMLG27CgsD22yZN3E9VQwxPu2iY9fts1PAKelkSUFkS9HIgoHLQDHuaN5Zopg4y
+ XYRTmbuvGzxtQWUP6I4m1QXlNB+d0UyL5fxqfbf8tlovqWeIQixunj6McEncSilELqp7V/c3s2/r+V9r
+ YhqYHGyk/Hadgm2k32xghq9bKB/dzr7Oqb/ZYXEz6bdbJG6lpYGNgl5mEqC/nvXDkd/M+7nYL23myA6U
+ h5ogrLlXs2i1INYeGuOauraTKusw10dJwAFxPU2bRzU1kOlqhzDq1dS4PlYko4Wa3qQMUbu0Y1efEJUK
+ cTzPaZXtXommFrJcsnG8/kISNYRpoeZcN9eyBk0Whxh5wybUYEchDZx6ArCQf7nT3zv99UD2HCDLD/rv
+ MvuN/V+pAygbhJzEIZTFAcYfZNcPx0J9JGJhoI+8DAhiTXPAwAykEbu8e4wiDeCI/7jJsy1b39OmndjW
+ Oe0ce0gIsKCZl6oODLpZKWqzplkw6jYB1m2CUSsJsFYSvJIqsJJKbdbdNp00KO6+bxqIw+KeMC30jgXQ
+ q2AMr3VocM2veLPSNocbo112EFxtAxtuRk/epGBbSTxjB2Ihs2rF6E5FYbao4vmiCjUKphH8xcSRkQPC
+ zp+Ud54dEHISWiEDglykUZeFQT7ByjUCyTV1yc3bJ9K2EsdZBgS4aFWihdk++oVBV0VpLQbCtnB+mPur
+ ot8/dydeyj7L0/Qz01zSsRaZqA8XF7/wzBaN2D98DLH3NGj/O8j+N2Zf3j3cR4RFvToDmAjNtM4AJlqz
+ p0GAqx0mtyPwsiJbTRzzlxVhP2EAhb2yi7CLt8yr7mHMfayeU5VHePIT7bVT5jYRHPEn6SMnjwwo4mXf
+ SPQ+tgWPsEW4SwJWNR7fvIYks2NAovDziUED9ibFSE9PARTwitN+trt8+itwMI3Y+dWJQSP25j149QKJ
+ OvxYHUG1K6s9KxJoMqL+Mf/WzTXTxi8WiDhJIy2Tc4zyhmcyKzXjEJFuq+kbpaECNwapBesIx0JsvU6I
+ 4+FMZQOo18u57Q4PRFCNZlWSk3MAYSdjzgrBET953gqmIXtTDqll2WFBc1psm+pKMMw9C5tpk1suiVnJ
+ k9EI7vgzEZWH+MeRWgR7zjHK+3lBeCXHpBzbadqY1XTDAjQGv7h4586775CmFk4EZGH3ZEAejEAePJmg
+ 42ynqtkXbeOInz75j+CYn50/PE8Bum9we2EOC5q5danw1qUioC4V3rpUsOtS4alLm94ko5ntOdDIzxUW
+ Ddu5TawJj7ijeKc+lPdaDhWyIibNC07zOVdAe3BiQIbr63z95e663RohS/Mkql8PlAoG5I0I7RIiwoHD
+ OgOYmjehqP1eG4W8pLmpnoFMhB2sDQhwJZucrJIMZDrSf5894qCvmjMgwNWcBxNSfHyayfGIUw5jKiBu
+ pobFNTlGi0E+EcXqbWX1Kn1Nz20mDvvlEL7pNHDkJxYw74/0HC0ZwETrEwLrI/u/ltv6opm/IPt6ErA2
+ f7/YbjZka0+iVhmXaZUkYBVvUw7F1HIo3q4cCko5bPtk+0OVCpEmbxIb1yHx65JfcC3eiNB18bPkoiDs
+ I++AoFPU8rOE4WxBw9mc2HXM8jrraglKPnNhzX198eHD+W+qD3WIs+kTpiaG+k7TedPf20MFbgzSM1aN
+ cU3EJ6QGpdsW97Pl+hv5VQEHRJzT18pbGOKjtAYWpxlvf1/cEn/vgDgelVnbR9DEOQEYB/3LEPsSdzcn
+ VZxKWlo8yo8EMQKkcOJQ7ltPOJYqfZRVjTptMs+bGjlPa+otBB1OJBF2T8XYPRUh91Rg93S5jFazP+fN
+ HtXE/O2ipldta5NWVVnRZhwc0mfd8bU709uOAZuPKU4Ng3ziVWacPVer06a9/Rm0w8lsDjdGBdcZFaa1
+ 2Q+3/UhQnDpnGY/Flv3zHdh0N/P61FvVQ4grytWfOMKG9FnJBQvAXX+R/hy+1WzxRw3hGswo8o/sW2iz
+ llm1LJ8Wd5w8Z7OAWf0H16yxgHk5u71mq3UYcDc7lZRsu4mb/uZ4PnKRGSjMRi40Fur1kosNxAMRmvOB
+ eYkxoF4vL1ksfjwCL4EgiRWrPKhB6j6uvpPsA2b5KrW0pAlJytY6hxuj7YYrlajHuzuwvbuD5T1yctwR
+ zGtVGouyYFfMAG779+WzatUJ25LZHGjstpfjinXc9otaHR7AMGug6RQxJw0GyrLJ1pZanE6MZvrzPprN
+ Z9fN2ZQx4UQdB0ScxNO9IBYxk0YsNog4VRdm+m74AIp4KfvnOaDHGb1k9VOUZFW6pex+PuZBIlLG5RaH
+ GMtDyrtoBXqc0WNcPxFW0iI8EkGkhDdvbNDjjMQ2rmvmZesCJEYdP5Je8AFYxEzZxdcBAad65E3bpwdA
+ Aa96U0lW/NUTp6bTYcTNTWGNBcyF2nmbmx46bLo/qZeO1uUfhKUQBmXarhb3X+bL5qY2x9PRXu7BBGiM
+ bXYgFnAHxt30NsulcTtlLYCL4t66yrleiaLebr9LSp8QE6AxaCueABY3E3sJFop6m0f9hwNtvIQr0DjU
+ noOF4t5nRoUC8WgEXh0OCtAY+zLh3l2Fol5iT8ckcWuWcK1ZgloryqntEIuaRXgeF1PyuPpSSA3Q894I
+ wfnRlHhjqe1Y+RWmZgCjBLWvI20r9z7g6R9S0/hrmaA7OnInmTULWqvwyr5b7undHqiv0/ztc1bEOWEv
+ KZeErAtqg9VTmI11iR0IOR9IJ77YnGm8Trfyjn+KRfrxF4pR50CjKqUMocIgX3PH6L4Gg3zUuzxQkI1+
+ R3QOMiY35HrBAB2n6sFyCoyFgl5GYp4w1Me7TLDUdJ+xbtIAWs7sMRW0H90QkIWetwcM9f1195mplCRq
+ pd4Vg4Ss5KzTU5iNdYlwvmk+WlFWsRkUZmPe7x7FvLy0PJGYlVFsLBYyc6248U/aGkGLw43Mu6XBuJt3
+ xwYWN3PTV6dN+7xgtesaBvnIqathkI+aogMF2eipqHOQkdGuG6Dj5LbrFgp6GYkJt+vaB7zLBOvn7jPW
+ TcLa9S/3f8y5c6g2i5jTn4eyqlniFkW81Jk2A0Sc3OcNoACJQX2GZoCIk/qEywBRZ308RBs55Imq6Gez
+ xJwZwvGMRxRvFFGQI6pXfZsTKt8qdC/0XsNBfH+LZNY1o/HE28QT1HhvkcSgD7iCZtKeU5pPIOJ8+p7s
+ oj1P27Gm+et1wLM4BwbdjDr+q2dlx+kz4vMxDUN9xFbTJGFrc4IqR9qAoLM7HpUh7UjQSn0C9hVbJfOV
+ t5blK7aSpfuAlul7CHQRn9t8RdandH8nP1nROdDIetJhs7CZV8LRsk166d/EHB+7DvLUP5xUhFNPvRjT
+ 7lbAUJqw42b8ZvDXMu6GeyfuP80jQTrz0qQs2x9Xq8sL2QR9I9l6yrbNv100H9JsJ8q1sdZEGCDiTGgt
+ ns4hRmoNbYCIs90R7DttbY9L++yViKMyTg9RHm/SnB/H9OARmy/uH3fnxCYDc4xEai4pMFLnGInEeFqM
+ OcYiCRGJOK+Ja9R8Hk/E/vygkGTUJUgsYquvc7gxyhKuNMqwKxVvVG7E5HLT7N+0bffiUiuxuOEMyYRY
+ j2kxbCIQHNSweaKrJJG1lvo6aWPXEc+0iIfjJv15eIuYrWkkakhNKCbVhOINakIxqSYUb1ATikk1odBq
+ sC61A3+ZYSJEfYPb5+qmxw9pBnDdhPhvFXg8YnD7I8bbn1gI4gNODUN90fVqxnQqFPe2275x1S2N25f8
+ q16CV91MfDLaj46DjJxmAWkDKPvDaQxs4uy2CeOQX81khQQweSBCktJHlhqHG8nzTQ4MutVm3AyrwlAf
+ 91J7Fjc3S0JT2so/iAcidMvzyeaOw4285NBhwM0aKyPj5Gb0Of3UUJtDjYxa8ARiTma9rbGYecm92iV2
+ tefMND1H0/Scm6bneJqeB6TpuTdNz7lpeu5L0zoXqmyopQy0fQm9FjhaVMUvrH14PQ5fJPqevLgCiMPo
+ QIB9B/re7g4JWNsONFnZYqiPV/lqLGDeZ7KvVjyGdCRcBRCHM58Dz+WoyZjQvAw4fJH4edlVAHFO0yFk
+ +wn0OHl5xqAhe7OLRXssJl2uwbi7vTNceUvj9uZ2cOUNDLgFt1UTeKsmAlo14W3VBLdVE3irJt6kVRMT
+ W7Vml1TiUzQDhJyckT8y7m8Gwazy15Og9W/GL3aeQDZ/ZqUeknLEvepNDPA9kxcvaxjq490PjcXNVbpV
+ y/q48g4f9Qf9At1hRmKtwkfW33NW3sNr7k9/JS720TDXR18ci63bZ66GR9fB81bAY2vfh78TU88AISc9
+ BfE19Gobz3bvhijOs5jUnbBZ15yQ30kaKMumdpWKUxGdX1xG2802Ek9x00qR5JhkYqwo2x9k3yOj7mg0
+ STh+DerU1zf4xZ3GF2+7jzb5Ma3LkvZiAG6ZGi26fJt40aUvYl1FT/v4lBr8iKbHE/Fxu2dHkazfLIc4
+ RdJsShMSY7CMRBMBmb/jRyLI3Hl+ERSjMUyI8j44ynssym8X/LvesohZld/gGtCWTIwVXAP6hOPXEFID
+ uprxeO8vf3mLeJ3GF+8NaiTA44nIzZsd6zcH1kiOZSSaCMiM/hrp9A1+jWQYJkR5HxwFqpG2T7H838W7
+ 6FDmr+fv330gR3EMQJREXkmapO/DqifQMjVaUAU1agSuojjmOf+3GjRg/xl+436O3rm+d0hz9xjiqyuW
+ r65gX0rYQdjEYB+5AkR7Y+0H5Y51fRIDfLIDwLkfLYb4GPejxWAf5360GOzj3A+4n9R+wLkfLeb6urac
+ 6uswxEe/Hx0G+xj3o8NgH+N+IH2D9gPG/egw07fJ4+/pxYbYSxoo08Z44Q580041HcQc0iGuh3gnOwTw
+ 0Pbb6hDQ854heg+bOMl04hAjJ8E6DjQyL9G9QnV8sGriKbITY5qaI+ObubbNK+l4aoD1mGnP9S3U9bYz
+ ebwr1lmPmX7FGop7y82/uF6Jmt6nWDTV2VNcJS9xRUoJmzXNp0Pd29BRnD+WVVY/kSpuzAFHYj72958+
+ r3+B9bDfpS17QtpKTn7d5j/Q+A8O3/TyiZKGMU3tMe0h9xs2QFGY99p3kvzwMes+26xprrYX0S/vqJX3
+ QLk2hgrw/EJzWHmPmm/cPKPmgi5+ITok4VpofS5oDqqdDSNaJOFYPtDmY1oCskT0X9VRpk1NFah5g2Zh
+ 9z4mZRybhc1dmVUPkauEozcEcIz2s9M3xfGgtvdJWdEQFRa3OT6G8bYSbNCi/LWe317Pr9U6nOhhNfud
+ eDIjjHv9hAfIEOx1U1bygfRg/7y4X5F25e0BwBERNnYwoMH1+/x2vpzdROrE2BXpJrkkZp1+a2wOMxJu
+ iAPCTspbMDaHGAlv2NscYuTeHs/daRfBl+qYmFvCgMGj8MV5jvNjQIwGR/y8TIbmMW4W8+SwZikly9mQ
+ iFX0iV9w75+p8MXh3z/huX+rh0/r5ZyXvXUWN9Mzx0DiVkYW0dDB++WP68m79KrvmqTaDjAuEoqgQxxP
+ XcXbmihqGM30dXY12SC/a5Kc/bhsDjIS9uIyIMRFWFxmc4CRku0NCHBRFkoaEOAiZG+dAUykHahMyrKR
+ Fh4OhGVZUFNp4aYQcZGhzlgm2tJCDbE8lFXSPaA5lquVeuE0nl7yesKypAXV0hCW5TEt0oo4F+KAlpM/
+ 5YXglp870QLCtrvMX9/LwvqcTt831gFB5/6YM4SSGmyL1epBfjW6XqzW0f3d4nZNqtcQ3OufXoZB2Osm
+ 1H0wPdi/Xk+eepFfNThaddcDpoNS2Z2+bxrWVVyIXVntKZoeMl20ym4gdMuH6fgHg6Om5wc3PT8Q0/OD
+ k54fOOn5AU7PD+T0/OCm53z95e6a8iLLQDiWY0H3NMxgaoYLV3e3q/VyJgvTKto+pdM3m4dpj51SS4Gw
+ xz09owCox0uonSBWM8tPPtOSoCdsS7PLGe0AXwcEnaSDvG3ONubl9E2PBwKyRJuspJsUZdsot/MEaI75
+ enU1u59Hq/s/ZKeOdDNdFPUS8rINok7KD3dI2LqINh9/UZ1SwhQrxvsitO9p8iO0PBaBexMXnnu4aEqF
+ 7F0SuqUYj0XgZZIFmkcW3Cyy8OUQEZgOYjQdKK/UuiRmpb0eCrGa+W69uJrLr9LymkFBNkIO0BjIRLnz
+ OjS47j79d7TdiAvCehUNsTy0SSkNsTx7mmNv86QN2wfCtCS0X5LYv0L+R6Kyapao1QyC4rJQ1Lt5DVF3
+ tGlvniFQToE1INNFO7BzICxLQc2cLWFa5B8utpsNRdMhricvqJq8cC2ElVwa4noE+WqEdTVSS03iDnE9
+ 9c+a6pGI6RHkOy6AOy61VE2HuB7iveoQzXM/v1VfUm8Rx3k+LG8S0bYsJg8GRzRuvM0xy9X+au2OuoIa
+ x8Jdf1N9i5Tq7TDER6h3TQz2VaTW2yUBq0zr7JFsbCjAdjjKyrg5moasHFDXy/nV8O993NfZnuxqKcwm
+ 8/C/eEZFotYk2+2YWoW63qdYPL2/oCpbyrVl8fuLbXyI7qnCHgSc6oFJs5FiSbYOqOttR+KqBpAVwL5M
+ jjm9AoEcbqS9rMvKLdXdUpiN9JQPQAFvuk/oRbSlXFtRMquRHnSdshPLScgOc32irraxSCndcYcErYx0
+ bCnQlm/jmqFTGOKb/iTcwkBfwU/EwpeKBS8ZCywdC8JW3Rbm+uoyL1+m73pkYZpv/WW+pC4+MyDIRWob
+ DQqyESoajYFMhPG8AWmuQ1rAXcTJYtSAR2lftmGH6HDc367VZfs73PU/y6iEuXgLQ31RcdwznQodvPfz
+ r9FsdXuu6ujJIxkDQlyUiXkHBJwvMoekZGFDYTbWJfakaf3rw7vfosXt5ztyQpqkz0q9XpfG7KzkAHDT
+ v3mtU8G6cpM0rfI/o60sc5t4+vNIm7ON32WPbFfSbC1jmcpIHa47vVUyINOl5vnVKv+rxb2sh5uEplgB
+ 3PQfKtkRpezDaECmi5rn3Zze3OvrL7SdXR0Qcq5m9+0LWX9Mf9IA07A9un/4RNgkFUBhLzcpTiRgnV8F
+ JIUOg25uQvQkYFXn8f1KNjYUYrtk2S4xm/z64s/mNRNqAcUcUCRewuKpys8F3jywDCpry5Gypj5vVuVx
+ 5ScYdnNTeekrx6qNJBsVhLii2cNfLJ8CMefV8obnlCDmXM7/yXNKEHAS+w9wz+H0V347o8OYO6gMOAY8
+ Cje/mjjuD0kiTxukPg9qh2wBGiMkgXxtkvqc1y71pMd6ybZe+qyB7RTiwSLyE96f6mG5ZjTPLIPL7nJC
+ 2Q1qx2wBHiPkLizH6gdWu3YCPU5W+6bDPjenndNhn5vT3umw6SZPdgDzHO2gnNPUmSRo5RYUAEf8jOxr
+ s4iZnSBwq9Z+yG3SXBq2s5MDacnaD8nNmIZhvkue7xL1hSSsJZgQg3LEsFeCxuI3xagEjMXMMJ7cEnIj
+ vPdgGVafLMfqE26T69KInZ3aS29tRW1mBwqzURtYk0StxKbVJFErsVE1SZ81up3/D9+saMhOHKQis+b9
+ nwPabnycqn0eVuZGRqrGl9ilwzdWNb4RlFC+dj1kuAob8ChByeRt51lDVgv1eS/53kuvNzThJ7T/wNd4
+ fQBE5I0Z2heYNC7XvhqQwUZyV+iNGr1Hy/D6ajmlvgrrK/jH58Z3gu7GcrRW5PUd4DG6+RmvD4GP0q3P
+ WX0JfJxufc7qU4yM1I3PeX0L26BFkcX7/CK6/zRXq00mmw3KsdFeYDEgx0VZ6qQhjkc9sf4u68y4SKJt
+ Wk1fjIPxToRmaweitWEcU3eqHWGzQwc0nR/krfrj+vNFRNm6xwE9zmj1ZXbOFje0bT9s0gv1kib5fHYE
+ B/2c898R3PT/Gm2ORZKnqsYgZTUDRJwq/2W7bCvLC8+tC+wY1AL3K1Defm2KC/2nnyjIpmoznvFEYlZ+
+ ckIGKEpYhDG7Ook5LIJtsKNQ3nUdCNuiVvao88Upr+e5JGolnYkIsZi5K+VpwpP3OO5/TvPywPd3OOZX
+ 94Irb1m/eVYk87Cf4HrMiNYAhFxHQbw/Aq05cGm/nbBOGsFtf9fS0awdZLu6DEtzdZDtOu2m1RcCzu7n
+ E1R23HafrTeI6hE5MVX/UL1LTIxwwkCf4PmE6bu7WVx9oxcdEwN9hIKiQ6CLUiwMyrb982F2w/y1Bop6
+ qb9aA1En+dfrpG1l73+E4F4/NTXQXZCAj8mpgu+E1H3+dXZ/r0j6ZWskZuWktY6iXu7F+q6VnrYaqVmX
+ d3/JZJ8v123z1OyPvlrc3dISw2uZEo2QRB7HlEiUhPNJ7FhdKtOTTQMRJzVxegzxkZNg4AbjcnZ7HXVv
+ EE216Yxlkn9J41eSqEUsD2Em7PR9y9C8YkJyNARkiV6y+kmFyNTuaepAIcLwaURjxSNuX6Azlil9pKWg
+ /L5tKOJNnka7svoeHQsR79Joc9ztUspGcaMiK+Yuk1+kbLFuUpatHVgXSbRP66eSlh4Wa5mb19JVWJKz
+ pyzboZx+kFoP2A6RHpOSke110HKKNKUlmgIcB/8eCO89EHVcH2m/tUU0z9XkXWPlVw2uuTjCWEZDNI/+
+ wIqyX5QDms7T0ymqUucM4/9G5+8uflEbMKhd7aP4+ecFwQvQhj26X62i+9ly9pXWUwZQ1Du99XVA1Elo
+ gV3StKoXjQ/ft+JcDm/lX39SvDZrmjfZ9Cctp+9bhjwr1MlD0fT3nC3M9DWbxcp68EC6roGCbJSSqEOm
+ iziHoyG2Zxcf85pa5zmkaSXOCmmI6dnl8SMp6RvAchCLqVs29f3jCVv8A6jHS81kDmy763fRtqoj2nok
+ AAW8CVmXQJb94ZwukhDo+sFx/YBcKVmUApZdvK3Lip7wHQcYsx/7A1mnIMBFrIRODGAqyJ4CsNB/GPSr
+ fpAtPxyLLKW0UZOJgT7ZhkayhaFWHSZrmjMRlYf4x5GUWXvIdAWcK4vgiJ98DAZMm3Zi18bpz6gEprd+
+ A2XauqMPm55Os9AiupvN76P9445UP3k0Y/FU3y083MkyFq15KhcYq3VMinTxBpEu8EhFWaTcCIqFzW0X
+ 7g1yAygaj8m/R65lYrSLN4nm3CnmicggDLpZNRR+Tk/zKeWYvx5wHM1lM3r9Fgp7Gf11C4W9Td+0KvfE
+ yR7UgEepy7AYdemLUFNPaAFhy93mF84tNUjQyrmhBglaA24nJEBjsG6mi5t+wR8RCd+ISDB7+wLt7QtG
+ D12APXTB688KrD9LWdt1+r5riA5CkNtAAwScVfxC1knGNv2d0ix/W23+8UA5OWkgTAvtZIeBgCwB3UJQ
+ AMbg3FELBb3EuzpQg42y2thcW6z+RTsibCAsC+WQsB6wHORjwkzKstEOCtMQw3Nx8QtBIb9t0+T07RnH
+ REzjE+J4yCkzQKbrw0eK5MNHm6anzYlxTNS06RDHw8mDBocbP+Xl9rvgelvasdPvZQ8ZrveXlHwuv23T
+ 5HvZM46JeC9PiOMhp80AGa4P5xcEify2TUe0ktIRkIWcygYHGomprWOgj5zqJug4Ob8Y/rWMXwr+Sk4d
+ YXCOkZVmTnot7r/MVl8iQovVE5rlfvbH/IJ8TreFgT7CRKZJObb+2dBePBKVOup41Z6rqequkbUaqVlJ
+ S7Ds1Vftv6nbWpvUYFsvH1braH33x/w2urpZzG/XzaQeYRSGG7xRNuljVkSZEMe42KYBwUzRhJhVmqT7
+ A+V8zgkqb1z590w8vcWPtUxTor7Jz3Vc/siEGgLBvX5CjQHTXruaBRBVFVgGNAscTZ2XPV+GlDbT4I3C
+ vSMa7vWrDBkSoOG9EZj3fKC9dpWx031AgFYwIQZlaO+VeGOp3LdP61hNZQVmL1s1Gjeg7LgWOJpk2//g
+ 5mtDAMdoz77tZ7NPScCJhqjguOnPQ1pl+7Soo+dzTjRDMB5DdlL2m9A4jWRKrOfyUO3CozUaOB43S+A5
+ QV9yxDHrPByBWbkZtdrDar5sD4AlJYGFgb7p4yMDAl2En2pSmm39+VItE5m880MPWI7DkehQwOD46+LD
+ h/PJO7y037ZplScOcVbRLCfKsXVPg5pnTV11QzQDBi3Kh3e//flevZ+jNgtoH/9TDrfEeDCC2oclJILB
+ gxEI77CYFGaL4jyLBc/Zsqg5z6a/uA+gqJebuqMp234aie8hcomDfuJbOC4JWpOLjGGUFGij1MIWBvpk
+ BcbQSQqzUTZZc0nQml1wjJICbdy8iefLNlPxfnfPgmbSchebw43R7sCVShT0PjdrFguGtiMda3dynmwx
+ RLqlzDRgvBNBVgjnjMx1wiCfetWoSOJKvfFSp4WaFhN0PWQBo8m0O6YMf8PhxmhTljlX28Aj7ohcAh3e
+ E4FeZgzWYz5un+KK7W5ox95UAIxqvecc45BpWBWIjTt+VVfTW7WOAm28Eq6RsLWmvLPqgKCTXT5M2OOm
+ 3zCDdcztgkpGT28AHWeX6pxsq6OAt4629U+ysqFAG6e17znX2GQM1s8eSNMazW5+v1tSXlQ0KchGOfLW
+ pEBbcuTYkiNsoyaehoE+yr4/Fgb6ODcCuw+EeQmTAm2C90sF9kubSdiEZ5Sg7Vyvl4tPD+t5tJqvyalo
+ wah7Wx4LrrphcTNp71QQHnFHm9fodnEdFKJzTIh09+m/gyNJx4RI9c86OJJ0oJHI9Y9OolZ6PWSgqLd9
+ G5IwqY/x/gjl5l+yJQ2J0Rr8USgHyWI8GoFdR3jqB3KNq5OoVVZ45yH3tOf9EYLuqWawojR7IM0e/qJn
+ eYPErMTbqHGYkXoTdRBzkkdCFmp7F7efGel5oiBbM/LIHou4PlYMrYFDfup9ahnIRL4/HQS5mr5EmWS7
+ LE3oUp227csb+p6lLolZqak5cJiRnKoaCDi/ztdf7q55v15jcTPnegcU8MZJ8i6q0ufyOzUrWDDsPlcz
+ G9T5PgeG3epTjlZxgLF9eVMcszrdkLU6DLmJY8OOAUxJmqfqpUXGTx9QyJvtdnSjhEAXZXNqC4N8R3rq
+ ub1Q9VdWwURKZNPXkr1otZU42anDHrdIqyzO2fYWx/y82XKIxyLksahpS58xHotQyIsIiTDwWARm78DB
+ YX+0nP9598f8miM/sYiZU0V0HG7kDKdd3O+nDqJd3O/fVlmdbXnFynZ4ItFnTRzaYyc+C7BZxNys3qxY
+ 4hZFvGEVwWg90GxkQh8rOjRiD6tkRuuYoY6gPs+GDUgU4nsGEAuYGV1ysDe+j+vtE1nVUICN002G+8eM
+ IeyJwmzElQAGCDibOYiAAmbxWISAQmDxcATmRn4eBRKnrahIO99iPBKBXxuJkdpIBJRj4S3HlI0RDAhx
+ UR8pGiDkLBm9bAUBLtoWBxYG+GibHViY5et3TCc/nTRIzBrwVARxTIhE7dAhDjQSdXxokKiVPFbE9vC3
+ PmwOueJ0QWGFNw65EnJxr58xeQ4J0BjcIuArAdS+AXKGgfWZCL+rYspdFWF3VYzdVRF6VwV2V3nzwtic
+ MGv2Fpm5vbm7++PhXtUy5FXfNoua5d8e04remwQNaJSub8KYNkIcaCRxpGcSh4bt27piXbviYCPl9ACb
+ Q4zUfKxxsPEpFrLbl1Uc64mFzZTjPm0ONlLL3YDBPvF0rJPypeBIT6xlblYiz2/Xy8Wc3JOyWMz8LaAz
+ hUmmxKJ2pzDJlFjUZSaYBI9F7byZKO4ll1CLxc2sjhXA+yMwGmHQgEfJ2HZfmaDWDSaKe0XKvlyR1l5v
+ 0N0Uo3dTBN9N4b2bi9v1fHk7u2HdUA2G3M3j0qKuXunmHvV62ZWnbRiNwqo2bcNoFFaFaRugKNRHyCcI
+ cp2eBPNurE6DdvrjX40DjZw2Amkd2nSmP5yxYcjNa3Ow1qZdlEh8HGOQiJV743sU8zbb/LNLtG0YjcIq
+ 0bYBi1Izn3ZCgrEY7B9So888m6+ocQFdrCjMFpV5wjMqErJyGi24rWL1PJA+R1mkeVYwCnMHQk764H/A
+ UB/hOB+X9FmpT6lsGHKz+nBu703m9vlV+361eiOvlnUSbdIGEsAxmppU/YHj72HUTV/rbbGwOUt+cudo
+ QAMcpUrrKkuf08BQgGYkHv1ZMWiAo7RPeRgdBIC3ItyrM+3JfYSegmzUOu8E2a72uNrbu2tONeXQtv3h
+ E++XDxxsJG6koGGo7127RT5T29GwPWNdbIZcK/nO9xjsE7y0FFhaiqC0FHhaLu/vVnPqji86hxgZO5HY
+ LGImvy2pgx4nfQ2DQ/vsIkwv/P7mUUPC1be03x50/b3AE4PeRji0xx6QON6Uqauj4F91QyN2ehXSc5ZR
+ 7fjEe15okJiVWBNrHGak1sY6CDiblx/iuq7I0p70WTnjWkgwFoM6roUEYzGoE26QAI7BXSDv4qN+8sJP
+ WAHEaV9MYRw5hhuAKN2UICvHaixkpk8mDhjkI7bwHQOY+qRn3TyDBuysig+p8wLeY3Bx2H8epfs4yznu
+ DoW9vCx1Aj1ObhVo8SMROBWgxfsi0DsgLo74jfwpWDFMxVicwBiY/3DccCq9AUW8/DX7oAGL0s6H0Dv6
+ kACJwVlPbLGAmdHFAntXnI4V3Keiz2v0FGajTr7qIOrcHZjOHdRKifCyLKaUZcEva8JX1kRoKRDjpUAE
+ lALhLQXkVfUnCHGRV9XrIOCsS/rktsYBRsZa+AFzfM37jfz3yCEBHoP8xqTFImbmG9sujvnJPdqeQ4yM
+ vucAIs6QN44Rhy+S2pRgG6tN766pbyx5PL6I7XrZ2+N+k1b8eLoFj8bOTPD7vdanvK4xpBiPQ+8gQ4rx
+ OKyl+R7PSEROxxwwjEShvgMM8EiEjHfxGXbF9F5czyFG1e6+QSF3NZ54wUXcllixVovf6XXvCQJc5OcO
+ Jwh27TmuPeAi5q4WATzUXNUxtml9t5w3J9FxngA5NGqn31kDRb1Nu0HehATgRyI8xVkRFEIJRmIcq0qd
+ C7MlvgCCa6bFY2x74DX5o9IfikKC0RhNChCHC6hlJFqZZ9vXqObncFvjjyfqsgqK1Aj8MWTzqx51EXfF
+ wiS+WOehZet8vGydB+fx8wl5O/SHjP+OoWwHVXiGxhsvraoyINVafjyCHOYd6qfQOK3FH+0n/W0H0DAW
+ RTa07TrbsFC9ZiTeQVYdWd1VIUEhDRMalfxSnYmiXnKfRidR6+FYHUqh9qp/kt1P7oVbFjRas3hHNr6C
+ Gafn/RFC2lEx3o42r2Pza5kT7vcH1JditL7UtkQJiNEZRqLwa6+e90YIqYfFaD0sgmtGMaFmVN/Z5fFj
+ QLloeW+ErpQGxOgM3ih1tg8JoXC/n7xKCeC9Edop52i7CYjSO9BIXf9PnS60/c6MZDjQSH+nVckMoFDQ
+ q2a2mXXgCcW9rEFeR6LWvCy/s4bwAwy6maN3dOSu7QbPqQ50HPdzW8iRUWY75JD3lnnlHexx8/oOPYuZ
+ uW8qQAI0hvptzMyt47i/WY8VEODEj0RohntJUJBWMRJnmH4NijVo8Hjs+T2NRu3tpkzcu9LRXjt7CG8K
+ 0Bht9RdSsg3FaBx2KdcNaBTGk2gbHnHz+g6Po/2GvIxVW9TmZk4SmQIwBm+ciY0xm+GUbEEzFTDOgybP
+ UBcW+Zzdzg0w5g6pzcVYbS4Ca3MxWpuL8NpcTKnNxdvU5mJqbS6CanMxUpvrW4ke4vpJMGMYDk8k3tjZ
+ P24OGWv6x5kiqK0TI22dCG3rxHhbJ8LbOjGlrRPBbZ2Y0NaFjfnHxvshY3H/OFyEtNHC30aHju/Hx/aM
+ PWR10HKulw8r8in2AwXaOPWjQYJW8pqCAUN99IWdFouZGe8YWixqpq/wsVjUTK+1LRY108uxxYJm6lt/
+ PYXZWHPWDm3Z/5wxTn85QYCL+BDlT2iHLfVHaj+8Y2zTfLn4/C26ny1nX9tTmRgPwjDJaKw63hD310Qc
+ I5HOo6eSmIFhhS+OqvwqRiHEJL5Y9Axp0z47uap26DE7veKGFaNxDmlavUGsk2YkHqNyhxVjcehdf1gx
+ FicwN2Mti/ElzqNlSOCLwZjcB3hfBHJ1bME+t5pt4MsVPWZnvISJOEYjhdXEvWI0TnYIjJIdJsSIYrEN
+ jqMko7HCarFeMRqnabqzVATGOmlG4oXWZGJKTSbCazIxpSZTX1J58w1i9ZqxeJwBPCYZi0V+dA8aRqOQ
+ Bxuwwhen6TSyBrq4xorHfvfM885Z81GVNq8kMjYGdnHI3yQeW6/Trp38/hH8hlxzYgK9mzpgoI/czA6Y
+ 5WtWV/HPhXVx0M+YSdJBx6nCxd+J0x4DBvq2McO2jUEXvY+icaCR3BcZMNBH7HOcIMRF7lvoIOykP8vx
+ PMEJ2yFmbHeY7nNG82aQoJXexGicbSRur+3urC3/0i8rJzexNgy4WU7AxXwfGX0PmbFDD7g7D/U9Zvf9
+ 5aaGoE+qDJjlk/+VaCfixPJfjJN1UAsSjbNAyWJtMzVFgLRo5k/iY/1UyjH6K+fxHGjwR5HVCXX+HjT4
+ ozDuKWiAojDfePe/6d7Om5X1bFdz7sGJRKyf0h317SoThbzt/h7RJqtFzbhkA4f87Fdzx966D9g7y7tv
+ Vvthty8JN5+bPBSh3gh1CXH+SLcPLGQ+UreS6SnXxpm4QncOaz4ot+JA1ynKtUXaxrRUp84C5mZ5UFbs
+ SrK3JwHrad1J8524SmOy3TGMRaEeXAYJJsSI0uI5OI6SjMUinxgHGqZECf9JJ4sn2ql/HnKbNAcQifP2
+ DP42YdA7hCNvDnL2T4H3TQnYL8W7T0rA/ijefVFC90MZ3weFv/+Jb98T7n4n+D4n/daBSZo0redRxI8p
+ R24psDjN1mn0CWWAByJwTzR/9J5mrj7lJ40vRbhdV0/Pld9x9fVbm5WbeVqQnR0HGel75KF7UT6G7Enz
+ 6N+LJmyPy7H9LYP2thzZ15K7pyW+n6XaxoadafeeXLvnZ9s9nm/3atInipN/0Zw9ZvmceQvyXBloGI1C
+ PrwKVsBxVL7h/o4T6zFzr72HR9zkY7gggR2D1mA7KzVk/ZQl9Kc5Awb6yE9zBszyNS/FnN7HoHfwXRz1
+ B7hRL/+S4aulLnRx17aowbJMafq2ujpoOQ9xJdJoV5X7aHPc7Yi1rUPb9nZ/oeYhAE2sgbAzT5/T/DQP
+ lqQcu6XwxVGfM/rYiAOO1Hyu7QLFiWQ7RiPRF60ijrFIP45xnu0y2dyHRRs8cES1lxV9/t2GPe7mKpo7
+ yo4wKMbisBYVoZaxaEfZir9RSEPlidsWDXbJsh12JHJVCdaRnJ3HkV3HuYc94uc8svYwR/Yv72b9GQ8Y
+ DdKyditnmiXaJKkOWs52XR5nhGCQiJUxQjBRyDsMz+L8saTLTd4f4TnOj2lIiEbgxmDNOuI79YiAuRTh
+ nUsR3FkPgc96CPash/DMejD38Uf38A/aN3dkv9ygswFGzgXgngmAnwdAPgsAOAeAdQYAsv//ULqSI3Eg
+ bKKol97eWaxt1m4XefBuwz43efju0GN28gAeNDhRDoeyUjtF9XPGxBgOb0VgzSwh80qnP1O7MhpnG9tT
+ KdSBEjTjwNnGZhksvaugcZaRsdoTXOfJeHMafF/69JYzdZMvjcON3a6kopaF+ZGrNyRmrLjmnZSoc7iR
+ 8VwPwP1+4vM9APf7iacjArjjZ571Z5KOtRmmqT4ZL1VsHPJzLhk+SU77gJdJvKfIWZ+zEsObQ/jnxzmw
+ 6X5+z3k7YKAcG2+tqgE6Tsbz/4HCbIxs4MA+NzETOLDPzVkLABvQKOSMZrODOb7Iot/nt/Pl7Ca6nX2d
+ T7XanGlc3Et4OV+tKLoeQlzR7RVLJznTmB0IW4P0gObYZFGdyh7JJk6iY/GiVgvX6V529uJqch/CK/HH
+ eqnK4lF2Yh4zQRgAj5uAqNu83MiRYlSdvyPH0Viv+TzAfO41XwSYL7zm9wHm917zLwHmX7zmDwHmDz7z
+ JV986fP+xvf+5vPGP/ni+KfPvDnwzZuD1xxwzRvvNW8DzFuvOcn45iTzmgOuOfFeswi4ZuG75p/7Pb8K
+ VbDffR7iPh9xB134+diVh1362LVfBNkvRuzvg+zvR+y/BNl/GbF/CLJ/8NuDkn0k1YMSfSTNg5J8JMWD
+ EnwkvT+GuD/63b+GuH/1uy9D3Jd+928hbqgH0QzWZbe53Y8qyap0W59WEpNj+WRA7GZPj7CIrgKIU1fx
+ Xj1/L1Kyf0ABbzfiqNL6WBVktUHjdlHH0ydeQdjnLg98dan37lJxfnH5uN2L7DmS/4i+T16PAaBeb5QW
+ 2+jneYC+MyBRknTLcksOMabbTRNyk5fTl5XhBiyK/HwvHqOfv/BC9PiY/zLMf4n4vyc7llhyhvHiw0du
+ PrRRr5eeDxEDEoWWDw0OMXLzIWLAonDyIYSP+S/D/JeIn5YPDc4wRtu6atonwkoJCzN9Ty/RdrNVP6B6
+ PdQUpUm61rp6f3H6tL23gqoHFE4cmTMZV95Rjq3LiwyjRrpWnhGxtbuWtYlCzAYuDdpPSc6za7RpL0p+
+ brNZyByY41AJEIuR63QOMHLTBE+PgHwC8UgEZl6BeCNCVwE+NbukfSQdfAnTuD1IPuaWHf3X5+lPuTAe
+ itB9FD2VVUF4voHwRoQii+SXGNncBCEnPaOboOYUxXmUlFGcTN4hTUMsj2rCKSvmDQhwkfKUDgGuKiUd
+ PW1zgFHEz3SdgizXYypzTpxnf6dJs0CqLqN6TxKDBieKOqClzLaprDJyOS6ffiYnxgMRdlmaJ9Ghprt7
+ 0rJmdbqPtuV+I/9Cz1wObdmrdNc8pFaFrZkhaUbSlPMYRzRYPFVtl0XKi9LBllsE3mExeoeP9ZaZQw1y
+ sG7S9Bjty0QWWrXyVq0WryibpWG8FiEru1kvIbsh1NNoYdq075JIPJXHvJkxmv5MHkBNr9pFUOYktaxT
+ JVt3AepPcZKQfoHfZEZVH9LTaKBcm1qxLv+bquswzVdEsdrW6LiRBboQNSmfAKxpTpLopaym74ukM4Zp
+ Wx5eyaoBMlyJ7GBwfqvBGcb050Hed4KqBQzHLquFLHDkH2lwplG997kvi/qx3KeEIuSQPmsk9nGe890t
+ b0R4jOuntPpAcHaEYZFJUsXFY0pOUBM0nULtuNZU6WSrhdreKs3jOntO81e10p+ULwHasP8r3pabjCBs
+ AcORb/esMmNwpjEVIqqf4kLPDEuKGhQgMai3yyIN6z7L82Yhiez+kDrTEOsx17L3STk3EBVYMYpMFrno
+ JUumb1Bvc6axTNpTqBn5w2FBM/XuGZxjlJVvtIllt+aCfcmQAoyjsia5inRhx931zN61xZ0fBvVgEdlJ
+ 5vBoBGr957CoWcixf1oHBdAVTpxcPGU7deQ2M40cHokQGMDj3x/zkMYdUzhxuP1NhwXNnPqi5xzj8fwj
+ +1oN1jLLola8I/kawrTIxGbVkDrnGNXQPv6FqGsh2HXJcV0CLsZd0DnHqNKUKFMI6GF0XG3U8ZIL4Ilx
+ TJwc4uaOUuaZonn1WHU7y81zVh6F7HXKG3YohexxECKMuszIRTPPwRrPOKxhPpQvtLvWAoajUuN+3njD
+ Rl1v1+Y036GKddY0p8lxm8qk2ZKcA4XZ1ADqkMdcbY9bfpH9zUhbDTN9XUtLFuocYDyld/MPstegITvv
+ coGrFdu4rmm5/oSYnmZKk3xdOmb5avYIxWEds6jleGjLuFoTdbwcIWD6UV3+lNm/VmcyUip9E7Sd9NZ8
+ gGDXJcd1CbjorbnBOUZqa9kzjol8R0+MbfrJvqU/0XvK6OHCvVujTSSnHkAb9iN3UuCIzwgcuQOHIz5q
+ eCFP374487elehdfCLWz4EEdnZXvmodVk50IP0TYXmTRbHV7Hn1arKPVWgmmygEU8C5u1/Pf50uytOMA
+ 492n/55frcnCFtN8m00zVFEznMXk9Ycm5dqOW3ERbVKqrsMAX717zxJ2HGi8ZNguTZN6CKz+GhF2bbY5
+ 3dicM0e+Fzrl2sj3wsAAH/lemBxovGTY9HvxFMv/XTSb/b2ev3/3ISoPhDsC0j67SKe3NzCt2dXilrJZ
+ 6bLN1bgwLdQCoMk1JsYPERJV+K+u1Kve1/PV1XJxv17c3U71w7Rl59Wdia/uHD78es/VnkjIend3M5/d
+ 0p0tBxjntw9f58vZen5Nlg4o4O22EVj87/x6vZi+AwHG4xGYqWzQgH0x+8A09yRkpbWoCdqi9p/cPtzc
+ kHUKAly01jnBWufhg6v1nF26dBhw38u/r2efbug5qyd9VuZFWzwQYTX/58P89moezW6/kfU6DLrXTO0a
+ Ma4/njNToichK6dCQGqB9bd7hktCgOvhdvHnfLli1ykWD0VYX7F+fMeBxs+X3MvtUcD752K14JcDg7bs
+ D+svElx/k5Xa57uukSYFgARYjD/m3xbXPHuDWt5jXd63Rzz9MX0FuUua1k+z1eIqurq7lck1k/UHKTUc
+ 2HRfzZfrxefFlWyl7+9uFleLOckO4JZ/eRNdL1br6P6OeuUWanqvvxziKt4LivDEwKaIsDTO5izjYinb
+ u7vlN3rhsFDbu7q/mX1bz/9a05w95vi6xCXqOgqzkbaUAlDLu5rxipQBepzkG2/DPvf0Tbwh1jUfN3m2
+ ZSTEiXOMxDMZTQqzMZJUI1ErOTEH0HWuFr9TbRJxPIxq6ASZrvkV46p6yHbdqwhpTTibweYcI6sQ6hxu
+ pOYXm/WYaXnGQm0vo7D0EOKi/3S0pAwfUX80Vk7m14v72XL9jVqh65xl/Gs9v72eX6veU/Swmv1O8zq0
+ aefsaZigexran6y4SqvvslitHiTBbH9d2rTfzterq9n9PFrd/zG7ophNErcuuNKF5bxbL2QHcv6Z5DtB
+ putu/WW+pN72HjJd939crabvIDUQkIVavAcKtNEKdg+5rl+pnl8BB+fH/Qr/tkt+YwDgfj89ES89rULz
+ uZrY+bOpldSYk6w38VE/K4VcxXgcRko5BigK6/qRK+Zco3NVauz6jXzregqy/fNhdsMznkjLurz761sz
+ 4G5TtmkLV8RHHqgEitVeDV3fcpaR3HGCek28LhPWX2J1lpCeEq93jPWNAypDXz3IrgI9tR9nQIqMRpfc
+ kf4SH+kvQ0b6S/9Ifxkw0l96R/pL5kh/iY709U84yaCzHjM9ETTU8Ub3q1UkBxKzryuiViMBK7kuWiIz
+ Hkv2jMfSM+Ox5M54LPEZj4eV7Ok2XWeKcKBMm9pdnuJR33cN0ezm97sl1dNSmG3F060g33q9XHx6WM/p
+ yhMJWR/+ovse/gJMTSvO0Z1AyCl7BXSfhCDX8oauWt7AJnK/2gARJ7HM6hxipJVXDQN8rA6eSfqsK74W
+ Ki3UsXcPIa5ofrtefmMZWxTw0it+DQN8hDOydAY28XL4CUScnBzecYiRkcNbDPT9efcHbWGRzgFG4vT5
+ iQFMf87otZdkABPnHsDpz0h7I91FHDV7wOzT6S9JGJDpao7yjg70Jw0AO5jTbfT75+5FZsKJLRYG+5JN
+ zvFJDPbt0jzdd4elv9bTD1j2OXyR9secH0LCPrf4UfHdEva56zI0fU4GOMpjVR4PkfxzNv3MSYz3RaDs
+ 3ADTPnuz7dOxmr6XmUcBx1FXEB2qVL0uyQmi83AEZg5F86Za+qt2TWBKG9ZnrrdPfLWEcXdAMmu4x9+M
+ nMN+gu5wIsnCUKtTM7dlkqo3+fK4UvvRUAsxpnHiiWx/yJtjZaOf0bYsqyQr4pp65xELFi2wBkcs/mjM
+ 2hB0YJECakTA4I/yyKy3YIk/FqMGdnh/BPEWv0aM/ZpmbxDmL2lZ1CyiWNXU6s7Vr8wIhsMTqSxC0koT
+ YDEOZVbUza5svBAD74/Az1cD74+gsoQstWE3BlR544oo/XGM84BwncGIEu/Uf3W7fsUFOQbIQxHat77p
+ 5paDjDLhTmHpWg023dRhlc4Ypk32WByb+r2p6Ak+i0SsbQvM0rao4Q1orL0ttOr6HOs0ermdfaY4Nczw
+ tY0mbTjZM4CJmt81CrCxuh/ePkf7YZE+koWSgUyynlab6Eb7WHynO3UasJMLuY5BvuOGLjtuAJPqZjX5
+ n+zrScTKuttgr0/1nPSCJCsWsh51jEYi1ye4xIzV9KOK9IWiPjGG6SkWTyrlmn5GdHh/+Uv0c6/2+40/
+ nF9EQrwco6SKd/W7XwmhpkvBa+nGQTbHvw6/0LgG5iQAOvbvG3F5GW0zSbC68IibPODFFEacw/f0ldp+
+ 94xpanpoTbV8LFRaVakQKaXdQQxAlGbnLmr5s1Gvlzr3AvJjEWj3Exb4Y9BzO6YYidPMpwSFaQxTooQn
+ HDr7cxplEFtlHQN99akADrW/YPghDRCP0cqaoOls7z8jVQzQcKrd1sqme9T0jshFGeSNCN2dpnV8Bwhy
+ NZ1Y6vEACA75WZ1hh0XN9M0AUQEUIyue3wXFsARgDEE6F8MBIae5AytdbfJQBNpgZIAgV7v3H13XcpCR
+ XKwNDjSSBiEDBLkYVZlFItaQW47sjol8QWVsfq2Bqsy47byYiHfd1BUlkM2a5nY+LLyQ+zyeiG+SlNOM
+ +lW0T2/+vvjwMYqff170ezASRiioAolD3WEXhBE3qQoyOcQo+x9hV6wLPDHUXoFBMU4CJEbb8SF1EyB6
+ zE4eH3ok3lhJKfu2IXFaARLjlIc/sAL09Ij91yA7Vr6CchKQi5KLDx/Of2NMgNug66QPym1wcKqNxB6b
+ yRJZC031GRDkarYmo9saDPKpcyTpOkVBNiFE+p6uazDLJ6+3JqfcCYJc9JQbMMhHTrmegmz0lBsw09fM
+ mhET7sQAJnKyDRRgoyZaDwEucpIN1GDLLuKAPf1g2rLz9rQDUMBL3L3N5gAjbcc1CwN8tB1pLEz3bbm7
+ IwIo4CWn5BZNySQoRyUjOSrhp0PiS4eEuUukS0JW2i6RNgcYOSUq8ZWoJGiXSIzHIzBTGdklsv+cvEuk
+ S0JWaulIfKWDukukAQEuap2VYHVWwt8lEoQBN3mXSJf0WZkXje4S2X+Ds0skCIPuNVO7RozkXSJdErJy
+ KgSkFqDsEmlAgIu5SyTGQxFou0TaHGik7hIJoICXtUskTFv2kF0iUQEWg7RLJICaXvZ+jiBsugP2c0Rw
+ y8/bzxFATS91P0edgU2U965szjLy9nMEUNtL3s/RwhwfcT8pk8JspHc7AdTycnZ5cECPk3zj8V0e3I+n
+ v4IHsa6ZusuDzTlG4kuuJoXZGEkK7m5gfUZOTGh3g9NHhFc/NcTxMKohdz9H9Wfyfo4GZLvo+znanGNk
+ FUJ4P0f7E2p+wfdzdD6l5Rl0P8f2Q0ZhAfZzNP5M/+loSeHs52hzlpGxn6PNWUb2fo4wbdo5+znaHG5c
+ cZVW34W/nyNMm3befo4u+f9bO5cet20ojO77T7rraBKk66KbAAEKaIpuCVmmbcG2pIi0M5NfX1KWLV3y
+ UtZ3ld1gxHOoFym+fJm2fpVKvwZONJ4jgagLjudIIOrC4jmOBGdBizcXz3Hyf6xgM/Ec7//+gnq+MA7J
+ xX3hr20SMfFrvWskZkbxPB/8hsaG2VxWXsnTq1h3BU/Pvq62a69gUDzPZ92V3AxMLrJYmwn8qV90t+Zi
+ baYSCe7WTKzNMY3o/BNnLDnH6KzgWJuU4mxorM2YDKxrY23OSri8sFibIRcY4UYt16KVNWdTbVlRQzbR
+ ipX1XFL9lhVV+1ytLq7QZ+pyyWBBYqQgl47C5OlRmHzNKEw+PwqTrxiFyWdHYXLhKEyeHIWRxtrk2Bkz
+ fhPYWJvDQUGszZhkrHBdlCdGo3LxaFQ+MxqVS0ej8vRoFB5rk1LUhsTavKePDVisTUqlbG8y3RvnQ2Nt
+ xiRnXR4cc8owJjTWZgRyTiDWJoE4V/4NV+XfeBPcrk7E2iSHwDLLx9okR7DyysbaJAfsxoiEjmOMoiZj
+ KnpnfOxNruXKHzrSwkTvJP/GoncyKOPFPyVs9M7HASB655ThTbIyE0fvJIckZSaK3kmOCMpMGL1zcgCK
+ 3hlyjBGcLImjdz7+C0TvnDKMSfIM+PsvuPfsfZfUU1Ed1WlxxRegvNe/NULvgPJeoTPwNX5iCG/0E2zq
+ M/JVkGZuFWR0UIGL1RICJg94TaFJrik0a9btmfl1e1a2xtCm1hhe5et3r3Prd6/Cuatrcu7qKp27uqbm
+ ro5/NV1V711q15l5+97Zf38srus4dt78Tddr5A6f+P9pde0P68I09Zv1qf8ubLE4gwSfyuG/4nRZ/utb
+ jp03I/eGx0f/SV/1qf+dXN1sF/8EjlKhzf0p0T2wie+gtvqkl0cKewDU0RQnd7rdHtHcGWLadRo5F5+c
+ 8FVtgECOD4A4gChHt9SUvpxVZfXyRStThpg67UqCviL3446wHnVc/nUNMOIztvO/TANUAzFazttPanNq
+ yqPaunLufxKrF0fa4Nip+fNwtDBnkZ3nxxya28akaHslwEZfeyzNS+aff1fYqqmNKspSt7YAfjI754hy
+ 8j/H3C+v4igV2dqNVrouu48WC9uZwKn/i9pc6i12H+5MaGqLzmh10AXwNsQktf7Zn/9W9+ePSAk4cZ43
+ tjnqWun39sW9h67GXmyN0ZS3PFW6tv0TxcO7LFCl8nWvj38/oYoobUjnYpX7MjSdcqdiXVNCmlWgSeVX
+ GXPR3S+5m6wqlW/n3kdZNp5MWU21r2VWT6asl3rFuzzAvDuTl5JMzXp/WSnJkFKSrS4l2YJSkv2aUpIt
+ LSXZryslGVJKMnEpyWZKSSYuJdlMKcnWlJKMKSWNa2l8qLIoD/rW9t8CfTKeTtmBVnsEJpxGW5HScWmj
+ Ohdti7zsCT7KoW8oCm7Dg+ONQFckwCKf7/j1UZ5x5xTlvYIrf3C88YyEU4xA4vxQ+XdkJ5QJMnp8cD9f
+ zx1dQeujUm0uu532IxWu+eqb2YuL7XPTJFfJHlEdv0dUN+7zdIs0CXxfOJaa3Z+FD7oBtoUZlPe2tyUj
+ yrrbZ9zdO0tyiCR8Xr6OVl3xQ5LFnU2Zf2qZ9aemRjgaD4GI66d6+SP7pPaFPejucx8XDJAyNGf3UbVk
+ 5jvJWWv3DLNOb4VqgnN+dyzziYR+gnN+UxbWym86wVn/906qHsjRarJKNDcRcoxRMjfBwhP3oXgRDzGx
+ MHH78Fsr7BxO/D5a+Ao/h0/87t9at9A+LlMmMCHjxw+AcajWdrDHQ9R1aRHJpSX0Dmh/D8kpDzSEhuSE
+ x8avHwB1GGWazmrkQh4MMQFNxVvqkFb15XTCFD1CPcv3e7ilJnTbIO+DSx3S6DO9I6zH9dUEKkdR22X5
+ 8PuQnPBA3+qWOqT73sDuUpeY5oFR36HaQefj01NDA5UZn5zwVz9vBwj69MSARIAeko+89Y+472Mv381l
+ yoym6/2jiM+gMyj1SmbQQy5tfJMq39JOoLAx6MT7qgrfcq4W16gjQS0nixhOltCbsqkNwPfpiaF0XVvE
+ 0Kenhu7koxNvgc2lKBXZgNp9JCJL18+/g6IbFLq2mIU+Ydcoce0t929A8mCISb9bdbwAmhtAHO7bYQ7a
+ WPCEphjxVdsW0LjUlK53DYK75AF/qDY+Fmf9AZ3GBCM+X0Avptgjb/KDIaa6OPvtL2pju8Jv0QcIQ5R6
+ jaqKz+pUGaTemFCBrQTalg+AOJrStH5u2b0hyDOYYrGvbvqxJdQ3YMTXlhWgcakpPQz3ip5kDHPuYQBZ
+ IL6TxGrAQmWiUmXgL5uJvmxN2+0Ek3EhxxpXTcM987A5SibgEjjrXzUV9szD5ohMggUY60OmvwKM9YET
+ XzE5sbaFNqrclPdVJYulIRg5bfeaPdaq9KMrBpQzhjAXcPycQKFLdAcSV+97b0M2ULngYM59vysi9wQe
+ 3e/CUPjvyUj4w5G9RrZmIBDn8mW3L7roJiIzCi6f9qV98fuMtBmewcjOml9XmF9Z82u/q6OffhXc8CnN
+ 2W97r/hY8bh7ZOfN0JZ9ScGTPMzZr6UFt9V7bmJzXb6PEoE4l22gT18ERk54Uuw9uUPFcMSU4O5WITcx
+ +l++bKu971j1s4TFad90lT0s7v+mDXwuV91Vuw9oVWYCD/xt5zdl6WcUjVFYjL6kIMijn3K2733dYDA7
+ RRmvz9TXDPYd9o4o9frxlr4GdgcPGvIGaOS9rT5x3XtdmwoYAkrgkd/lCW9pxqCR99Q0R+O6oUettq5P
+ 6nu6oJ4xRLncOtBAtUex33/7H2QijAAVlQQA
EOF
# We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists
// instead. This file can be regenerated from the template by running
// `tools/buildgen/generate_projects.sh`.
-#define GRPC_OBJC_VERSION_STRING @"1.35.0"
+#define GRPC_OBJC_VERSION_STRING @"1.36.0"
// instead. This file can be regenerated from the template by running
// `tools/buildgen/generate_projects.sh`.
-#define GRPC_OBJC_VERSION_STRING @"1.35.0"
-#define GRPC_C_VERSION_STRING @"14.0.0"
+#define GRPC_OBJC_VERSION_STRING @"1.36.0"
+#define GRPC_C_VERSION_STRING @"15.0.0"
```sh
$ git submodule update --init
$ EXTRA_DEFINES=GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK make
-$ make
```
#### Build and install the `grpc` extension
$ grpc_root="$(pwd)"
$ cd src/php/ext/grpc
$ phpize
-$ ./configure --enable-grpc="${grpc_root}"
+$ GRPC_LIB_SUBDIR=libs/opt ./configure --enable-grpc="${grpc_root}"
$ make
$ [sudo] make install
```
cd $(dirname $0)
source ./determine_extension_dir.sh
export GRPC_TEST_HOST=localhost:50051
+export GRPC_TEST_INSECURE_HOST=localhost:50052
+
php $extension_dir -d max_execution_time=300 $(which phpunit) -v --debug \
../tests/generated_code/GeneratedCodeTest.php
php $extension_dir -d max_execution_time=300 $(which phpunit) -v --debug \
"name": "grpc/grpc-dev",
"description": "gRPC library for PHP - for Development use only",
"license": "Apache-2.0",
- "version": "1.35.0",
+ "version": "1.36.0",
"require": {
"php": ">=7.0.0",
"google/protobuf": "^v3.3.0"
grpc_status_code status;
grpc_slice recv_status_details = grpc_empty_slice();
grpc_slice send_status_details = grpc_empty_slice();
- grpc_byte_buffer *message;
+ grpc_byte_buffer *message = NULL;
int cancelled;
grpc_call_error error;
* @return null
*/
PHP_METHOD(ChannelCredentials, createInsecure) {
- RETURN_NULL();
+ grpc_channel_credentials* creds = grpc_insecure_credentials_create();
+ zval* creds_object = grpc_php_wrap_channel_credentials(
+ creds, strdup("INSECURE"), false TSRMLS_CC);
+ RETURN_DESTROY_ZVAL(creds_object);
+}
+
+/**
+ * Create XDS channel credentials
+ * @param ChannelCredentials $fallback_creds The fallback credentials used
+ * if the channel target does not have the 'xds:///' scheme or if the xDS
+ * control plane does not provide information on how to fetch credentials
+ * dynamically.
+ * @return ChannelCredentials The xDS channel credentials object
+ */
+PHP_METHOD(ChannelCredentials, createXds) {
+ grpc_channel_credentials* xds_creds = NULL;
+ zval* fallback_creds = NULL;
+ if (zend_parse_parameters_ex(0, // ZEND_PARSE_PARAMS_QUIET,
+ ZEND_NUM_ARGS() TSRMLS_CC, "O", &fallback_creds,
+ grpc_ce_channel_credentials) != SUCCESS) {
+ zend_throw_exception(spl_ce_InvalidArgumentException,
+ "createXds expects a fallback credentials",
+ 1 TSRMLS_CC);
+ return;
+ }
+
+ wrapped_grpc_channel_credentials* wrapped_fallback_creds =
+ PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_channel_credentials,
+ fallback_creds);
+ xds_creds = grpc_xds_credentials_create(wrapped_fallback_creds->wrapped);
+ const char* fallback_creds_hash_str =
+ wrapped_fallback_creds->hashstr ? wrapped_fallback_creds->hashstr : "";
+
+ // prefix "XDS:" as the hash of the xDS channel
+ char* hash_str = malloc(strlen(fallback_creds_hash_str) + strlen("XDS:") + 1);
+ strcpy(hash_str, "XDS:");
+ strcat(hash_str, fallback_creds_hash_str);
+ zval* xds_creds_obj = grpc_php_wrap_channel_credentials(
+ xds_creds, hash_str, false /* has_call_creds */ TSRMLS_CC);
+ RETURN_DESTROY_ZVAL(xds_creds_obj);
}
ZEND_BEGIN_ARG_INFO_EX(arginfo_setDefaultRootsPem, 0, 0, 1)
ZEND_BEGIN_ARG_INFO_EX(arginfo_createInsecure, 0, 0, 0)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO_EX(arginfo_createXds, 0, 0, 1)
+ ZEND_ARG_OBJ_INFO(0, fallback_creds, Grpc\\ChannelCredentials, 1)
+ZEND_END_ARG_INFO()
+
static zend_function_entry channel_credentials_methods[] = {
PHP_ME(ChannelCredentials, setDefaultRootsPem, arginfo_setDefaultRootsPem,
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
PHP_ME(ChannelCredentials, createInsecure, arginfo_createInsecure,
ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
+ PHP_ME(ChannelCredentials, createXds, arginfo_createXds,
+ ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
PHP_FE_END
};
#ifndef VERSION_H
#define VERSION_H
-#define PHP_GRPC_VERSION "1.35.0"
+#define PHP_GRPC_VERSION "1.36.0"
#endif /* VERSION_H */
$method,
$argument,
$deserialize,
+ $this->_UnaryUnaryCallFactory($channel->getNext()),
$metadata,
- $options,
- $this->_UnaryUnaryCallFactory($channel->getNext())
+ $options
);
};
}
$method,
$argument,
$deserialize,
+ $this->_UnaryStreamCallFactory($channel->getNext()),
$metadata,
- $options,
- $this->_UnaryStreamCallFactory($channel->getNext())
+ $options
);
};
}
return $channel->getInterceptor()->interceptStreamUnary(
$method,
$deserialize,
+ $this->_StreamUnaryCallFactory($channel->getNext()),
$metadata,
- $options,
- $this->_StreamUnaryCallFactory($channel->getNext())
+ $options
);
};
}
return $channel->getInterceptor()->interceptStreamStream(
$method,
$deserialize,
+ $this->_StreamStreamCallFactory($channel->getNext()),
$metadata,
- $options,
- $this->_StreamStreamCallFactory($channel->getNext())
+ $options
);
};
}
$method,
$argument,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation
+ array $options = []
) {
return $continuation($method, $argument, $deserialize, $metadata, $options);
}
public function interceptStreamUnary(
$method,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation
+ array $options = []
) {
return $continuation($method, $deserialize, $metadata, $options);
}
$method,
$argument,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation
+ array $options = []
) {
return $continuation($method, $argument, $deserialize, $metadata, $options);
}
public function interceptStreamStream(
$method,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation
+ array $options = []
) {
return $continuation($method, $deserialize, $metadata, $options);
}
--- /dev/null
+<?php
+/*
+ *
+ * Copyright 2020 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.
+ *
+ */
+
+namespace Grpc;
+
+/**
+ * This is an experimental and incomplete implementation of gRPC server
+ * for PHP. APIs are _definitely_ going to be changed.
+ *
+ * DO NOT USE in production.
+ */
+
+/**
+ * Class Status
+ * @package Grpc
+ */
+class Status
+{
+ public static function status(int $code, string $details, array $metadata = null): array
+ {
+ $status = [
+ 'code' => $code,
+ 'details' => $details,
+ ];
+ if ($metadata) {
+ $status['metadata'] = $metadata;
+ }
+ return $status;
+ }
+
+ public static function ok(array $metadata = null): array
+ {
+ return Status::status(STATUS_OK, 'OK', $metadata);
+ }
+ public static function unimplemented(): array
+ {
+ return Status::status(STATUS_UNIMPLEMENTED, 'UNIMPLEMENTED');
+ }
+}
$this->assertTrue(is_string(self::$client->getTarget()));
}
- /**
- * @expectedException InvalidArgumentException
- */
public function testClose()
{
+ $this->expectException(\InvalidArgumentException::class);
self::$client->close();
$div_arg = new Math\DivArgs();
$call = self::$client->Div($div_arg);
}
- /**
- * @expectedException InvalidArgumentException
- */
public function testInvalidMetadata()
{
+ $this->expectException(\InvalidArgumentException::class);
$div_arg = new Math\DivArgs();
$call = self::$client->Div($div_arg, [' ' => 'abc123']);
}
public function testMetadata()
{
$div_arg = new Math\DivArgs();
+ $div_arg->setDividend(7);
+ $div_arg->setDivisor(4);
$call = self::$client->Div($div_arg, ['somekey' => ['abc123']]);
+ // $this->assertNotNull($call);
+ list($response, $status) = $call->wait();
+ $this->assertSame(\Grpc\STATUS_OK, $status->code);
}
public function testMetadataKey()
{
$div_arg = new Math\DivArgs();
+ $div_arg->setDividend(7);
+ $div_arg->setDivisor(4);
$call = self::$client->Div($div_arg, ['somekey_-1' => ['abc123']]);
+ list($response, $status) = $call->wait();
+ $this->assertSame(\Grpc\STATUS_OK, $status->code);
}
public function testMetadataKeyWithDot()
{
$div_arg = new Math\DivArgs();
+ $div_arg->setDividend(7);
+ $div_arg->setDivisor(4);
$call = self::$client->Div($div_arg, ['someKEY._-1' => ['abc123']]);
+ list($response, $status) = $call->wait();
+ $this->assertSame(\Grpc\STATUS_OK, $status->code);
}
- /**
- * @expectedException InvalidArgumentException
- */
public function testMetadataInvalidKey()
{
+ $this->expectException(\InvalidArgumentException::class);
$div_arg = new Math\DivArgs();
$call = self::$client->Div($div_arg, ['(somekey)' => ['abc123']]);
}
public function testCallCredentialsCallback()
{
$div_arg = new Math\DivArgs();
+ $div_arg->setDividend(7);
+ $div_arg->setDivisor(4);
$call = self::$client->Div($div_arg, array(), array(
'call_credentials_callback' => function ($context) {
return array();
},
));
- $call->cancel();
list($response, $status) = $call->wait();
- $this->assertSame(\Grpc\STATUS_CANCELLED, $status->code);
+ $this->assertSame(\Grpc\STATUS_OK, $status->code);
}
- public function testCallCredentialsCallback2()
+ public function testInsecureChannelCallCredentialsCallback()
{
$div_arg = new Math\DivArgs();
- $call = self::$client->Div($div_arg);
- $call_credentials = Grpc\CallCredentials::createFromPlugin(
- function ($context) {
+ $div_arg->setDividend(7);
+ $div_arg->setDivisor(4);
+ $client = new Math\MathClient(
+ getenv('GRPC_TEST_INSECURE_HOST'), [
+ 'credentials' => Grpc\ChannelCredentials::createInsecure(),
+ ]);
+ $call = $client->Div($div_arg, array(), array(
+ 'call_credentials_callback' => function ($context) {
return array();
- }
- );
- $call->setCallCredentials($call_credentials);
- $call->cancel();
+ },
+ ));
list($response, $status) = $call->wait();
- $this->assertSame(\Grpc\STATUS_CANCELLED, $status->code);
+ $this->assertSame(\Grpc\STATUS_UNAUTHENTICATED, $status->code);
}
- /**
- * @expectedException InvalidArgumentException
- */
public function testInvalidMethodName()
{
+ $this->expectException(\InvalidArgumentException::class);
$invalid_client = new DummyInvalidClient('host', [
'credentials' => Grpc\ChannelCredentials::createInsecure(),
]);
$invalid_client->InvalidUnaryCall($div_arg);
}
- /**
- * @expectedException Exception
- */
public function testMissingCredentials()
{
+ $this->expectException(\Exception::class);
+ $this->expectExceptionMessage("The opts['credentials'] key is now required.");
$invalid_client = new DummyInvalidClient('host', [
]);
}
'credentials' => Grpc\ChannelCredentials::createInsecure(),
'grpc.primary_user_agent' => 'testUserAgent',
]);
+ $this->assertTrue(TRUE); // to avoid no assert warning
}
public function testWriteFlags()
$status = $call->getStatus();
$this->assertSame(\Grpc\STATUS_OK, $status->code);
}
+
+ public function testReuseCall()
+ {
+ $this->expectException(\LogicException::class);
+ $this->expectExceptionMessage("start_batch was called incorrectly");
+ $div_arg = new Math\DivArgs();
+ $div_arg->setDividend(7);
+ $div_arg->setDivisor(4);
+ $call = self::$client->Div($div_arg, [], ['timeout' => 1000000]);
+
+ list($response, $status) = $call->wait();
+ $this->assertSame(\Grpc\STATUS_OK, $status->code);
+ list($response, $status) = $call->wait();
+ }
}
class DummyInvalidClient extends \Grpc\BaseStub
{
self::$client = new Math\MathClient(
getenv('GRPC_TEST_HOST'), [
- 'credentials' => Grpc\ChannelCredentials::createInsecure(),
+ 'credentials' => Grpc\ChannelCredentials::createSsl(
+ file_get_contents(dirname(__FILE__).'/../data/ca.pem')),
+ 'grpc.ssl_target_name_override' => 'foo.test.google.fr',
+
]);
}
{
self::$client = new Math\MathClient(
getenv('GRPC_TEST_HOST'),
- ['credentials' => Grpc\ChannelCredentials::createInsecure(),
+ ['credentials' => Grpc\ChannelCredentials::createSsl(
+ file_get_contents(dirname(__FILE__).'/../data/ca.pem')),
+ 'grpc.ssl_target_name_override' => 'foo.test.google.fr',
'update_metadata' => function ($a_hash,
$client = []) {
$a_copy = $a_hash;
Sum: Sum,
DivMany: DivMany,
});
- server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
+ server.bind('0.0.0.0:50052', grpc.ServerCredentials.createInsecure());
+ var fs = require('fs');
+ var key_data = fs.readFileSync(__dirname + '/../data/server1.key');
+ var pem_data = fs.readFileSync(__dirname + '/../data/server1.pem');
+ server.bind('0.0.0.0:50051', grpc.ServerCredentials.createSsl(null, [{private_key: key_data,
+ cert_chain: pem_data}]));
server.start();
}
* Generated from protobuf field <code>repeated .grpc.testing.ClientConfigureRequest.Metadata metadata = 2;</code>
*/
private $metadata;
+ /**
+ * The deadline to use, in seconds, for all RPCs. If unset or zero, the
+ * client will use the default from the command-line.
+ *
+ * Generated from protobuf field <code>int32 timeout_sec = 3;</code>
+ */
+ protected $timeout_sec = 0;
/**
* Constructor.
* The types of RPCs the client sends.
* @type \Grpc\Testing\ClientConfigureRequest\Metadata[]|\Google\Protobuf\Internal\RepeatedField $metadata
* The collection of custom metadata to be attached to RPCs sent by the client.
+ * @type int $timeout_sec
+ * The deadline to use, in seconds, for all RPCs. If unset or zero, the
+ * client will use the default from the command-line.
* }
*/
public function __construct($data = NULL) {
return $this;
}
+ /**
+ * The deadline to use, in seconds, for all RPCs. If unset or zero, the
+ * client will use the default from the command-line.
+ *
+ * Generated from protobuf field <code>int32 timeout_sec = 3;</code>
+ * @return int
+ */
+ public function getTimeoutSec()
+ {
+ return $this->timeout_sec;
+ }
+
+ /**
+ * The deadline to use, in seconds, for all RPCs. If unset or zero, the
+ * client will use the default from the command-line.
+ *
+ * Generated from protobuf field <code>int32 timeout_sec = 3;</code>
+ * @param int $var
+ * @return $this
+ */
+ public function setTimeoutSec($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->timeout_sec = $var;
+
+ return $this;
+ }
+
}
{
/**
* The total number of RPCs have ever issued for each type.
+ * Deprecated: use stats_per_method.rpcs_started instead.
*
- * Generated from protobuf field <code>map<string, int32> num_rpcs_started_by_method = 1;</code>
+ * Generated from protobuf field <code>map<string, int32> num_rpcs_started_by_method = 1 [deprecated = true];</code>
*/
private $num_rpcs_started_by_method;
/**
* The total number of RPCs have ever completed successfully for each type.
+ * Deprecated: use stats_per_method.result instead.
*
- * Generated from protobuf field <code>map<string, int32> num_rpcs_succeeded_by_method = 2;</code>
+ * Generated from protobuf field <code>map<string, int32> num_rpcs_succeeded_by_method = 2 [deprecated = true];</code>
*/
private $num_rpcs_succeeded_by_method;
/**
* The total number of RPCs have ever failed for each type.
+ * Deprecated: use stats_per_method.result instead.
*
- * Generated from protobuf field <code>map<string, int32> num_rpcs_failed_by_method = 3;</code>
+ * Generated from protobuf field <code>map<string, int32> num_rpcs_failed_by_method = 3 [deprecated = true];</code>
*/
private $num_rpcs_failed_by_method;
+ /**
+ * Per-method RPC statistics. The key is the full method path; i.e.
+ * "/proto.package.ServiceName/MethodName".
+ *
+ * Generated from protobuf field <code>map<string, .grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats> stats_per_method = 4;</code>
+ */
+ private $stats_per_method;
/**
* Constructor.
*
* @type array|\Google\Protobuf\Internal\MapField $num_rpcs_started_by_method
* The total number of RPCs have ever issued for each type.
+ * Deprecated: use stats_per_method.rpcs_started instead.
* @type array|\Google\Protobuf\Internal\MapField $num_rpcs_succeeded_by_method
* The total number of RPCs have ever completed successfully for each type.
+ * Deprecated: use stats_per_method.result instead.
* @type array|\Google\Protobuf\Internal\MapField $num_rpcs_failed_by_method
* The total number of RPCs have ever failed for each type.
+ * Deprecated: use stats_per_method.result instead.
+ * @type array|\Google\Protobuf\Internal\MapField $stats_per_method
+ * Per-method RPC statistics. The key is the full method path; i.e.
+ * "/proto.package.ServiceName/MethodName".
* }
*/
public function __construct($data = NULL) {
/**
* The total number of RPCs have ever issued for each type.
+ * Deprecated: use stats_per_method.rpcs_started instead.
*
- * Generated from protobuf field <code>map<string, int32> num_rpcs_started_by_method = 1;</code>
+ * Generated from protobuf field <code>map<string, int32> num_rpcs_started_by_method = 1 [deprecated = true];</code>
* @return \Google\Protobuf\Internal\MapField
*/
public function getNumRpcsStartedByMethod()
/**
* The total number of RPCs have ever issued for each type.
+ * Deprecated: use stats_per_method.rpcs_started instead.
*
- * Generated from protobuf field <code>map<string, int32> num_rpcs_started_by_method = 1;</code>
+ * Generated from protobuf field <code>map<string, int32> num_rpcs_started_by_method = 1 [deprecated = true];</code>
* @param array|\Google\Protobuf\Internal\MapField $var
* @return $this
*/
/**
* The total number of RPCs have ever completed successfully for each type.
+ * Deprecated: use stats_per_method.result instead.
*
- * Generated from protobuf field <code>map<string, int32> num_rpcs_succeeded_by_method = 2;</code>
+ * Generated from protobuf field <code>map<string, int32> num_rpcs_succeeded_by_method = 2 [deprecated = true];</code>
* @return \Google\Protobuf\Internal\MapField
*/
public function getNumRpcsSucceededByMethod()
/**
* The total number of RPCs have ever completed successfully for each type.
+ * Deprecated: use stats_per_method.result instead.
*
- * Generated from protobuf field <code>map<string, int32> num_rpcs_succeeded_by_method = 2;</code>
+ * Generated from protobuf field <code>map<string, int32> num_rpcs_succeeded_by_method = 2 [deprecated = true];</code>
* @param array|\Google\Protobuf\Internal\MapField $var
* @return $this
*/
/**
* The total number of RPCs have ever failed for each type.
+ * Deprecated: use stats_per_method.result instead.
*
- * Generated from protobuf field <code>map<string, int32> num_rpcs_failed_by_method = 3;</code>
+ * Generated from protobuf field <code>map<string, int32> num_rpcs_failed_by_method = 3 [deprecated = true];</code>
* @return \Google\Protobuf\Internal\MapField
*/
public function getNumRpcsFailedByMethod()
/**
* The total number of RPCs have ever failed for each type.
+ * Deprecated: use stats_per_method.result instead.
*
- * Generated from protobuf field <code>map<string, int32> num_rpcs_failed_by_method = 3;</code>
+ * Generated from protobuf field <code>map<string, int32> num_rpcs_failed_by_method = 3 [deprecated = true];</code>
* @param array|\Google\Protobuf\Internal\MapField $var
* @return $this
*/
return $this;
}
+ /**
+ * Per-method RPC statistics. The key is the full method path; i.e.
+ * "/proto.package.ServiceName/MethodName".
+ *
+ * Generated from protobuf field <code>map<string, .grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats> stats_per_method = 4;</code>
+ * @return \Google\Protobuf\Internal\MapField
+ */
+ public function getStatsPerMethod()
+ {
+ return $this->stats_per_method;
+ }
+
+ /**
+ * Per-method RPC statistics. The key is the full method path; i.e.
+ * "/proto.package.ServiceName/MethodName".
+ *
+ * Generated from protobuf field <code>map<string, .grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats> stats_per_method = 4;</code>
+ * @param array|\Google\Protobuf\Internal\MapField $var
+ * @return $this
+ */
+ public function setStatsPerMethod($var)
+ {
+ $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::MESSAGE, \Grpc\Testing\LoadBalancerAccumulatedStatsResponse\MethodStats::class);
+ $this->stats_per_method = $arr;
+
+ return $this;
+ }
+
}
--- /dev/null
+<?php
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: src/proto/grpc/testing/messages.proto
+
+namespace Grpc\Testing\LoadBalancerAccumulatedStatsResponse;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats</code>
+ */
+class MethodStats extends \Google\Protobuf\Internal\Message
+{
+ /**
+ * The number of RPCs that were started for this method.
+ *
+ * Generated from protobuf field <code>int32 rpcs_started = 1;</code>
+ */
+ protected $rpcs_started = 0;
+ /**
+ * The number of RPCs that completed with each status for this method. The
+ * key is the integral value of a google.rpc.Code; the value is the count.
+ *
+ * Generated from protobuf field <code>map<int32, int32> result = 2;</code>
+ */
+ private $result;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data {
+ * Optional. Data for populating the Message object.
+ *
+ * @type int $rpcs_started
+ * The number of RPCs that were started for this method.
+ * @type array|\Google\Protobuf\Internal\MapField $result
+ * The number of RPCs that completed with each status for this method. The
+ * key is the integral value of a google.rpc.Code; the value is the count.
+ * }
+ */
+ public function __construct($data = NULL) {
+ \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce();
+ parent::__construct($data);
+ }
+
+ /**
+ * The number of RPCs that were started for this method.
+ *
+ * Generated from protobuf field <code>int32 rpcs_started = 1;</code>
+ * @return int
+ */
+ public function getRpcsStarted()
+ {
+ return $this->rpcs_started;
+ }
+
+ /**
+ * The number of RPCs that were started for this method.
+ *
+ * Generated from protobuf field <code>int32 rpcs_started = 1;</code>
+ * @param int $var
+ * @return $this
+ */
+ public function setRpcsStarted($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->rpcs_started = $var;
+
+ return $this;
+ }
+
+ /**
+ * The number of RPCs that completed with each status for this method. The
+ * key is the integral value of a google.rpc.Code; the value is the count.
+ *
+ * Generated from protobuf field <code>map<int32, int32> result = 2;</code>
+ * @return \Google\Protobuf\Internal\MapField
+ */
+ public function getResult()
+ {
+ return $this->result;
+ }
+
+ /**
+ * The number of RPCs that completed with each status for this method. The
+ * key is the integral value of a google.rpc.Code; the value is the count.
+ *
+ * Generated from protobuf field <code>map<int32, int32> result = 2;</code>
+ * @param array|\Google\Protobuf\Internal\MapField $var
+ * @return $this
+ */
+ public function setResult($var)
+ {
+ $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::INT32, \Google\Protobuf\Internal\GPBType::INT32);
+ $this->result = $arr;
+
+ return $this;
+ }
+
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(MethodStats::class, \Grpc\Testing\LoadBalancerAccumulatedStatsResponse_MethodStats::class);
+
--- /dev/null
+<?php
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: src/proto/grpc/testing/messages.proto
+
+namespace Grpc\Testing;
+
+if (false) {
+ /**
+ * This class is deprecated. Use Grpc\Testing\LoadBalancerAccumulatedStatsResponse\MethodStats instead.
+ * @deprecated
+ */
+ class LoadBalancerAccumulatedStatsResponse_MethodStats {}
+}
+class_exists(LoadBalancerAccumulatedStatsResponse\MethodStats::class);
+@trigger_error('Grpc\Testing\LoadBalancerAccumulatedStatsResponse_MethodStats is deprecated and will be removed in the next major release. Use Grpc\Testing\LoadBalancerAccumulatedStatsResponse\MethodStats instead', E_USER_DEPRECATED);
+
public function testCreateInsecure()
{
$channel_credentials = Grpc\ChannelCredentials::createInsecure();
- $this->assertNull($channel_credentials);
+ $this->assertNotNull($channel_credentials);
}
public function testDefaultRootsPem()
$this->assertNotNull($channel);
}
+ public function testCreateXdsWithSsl()
+ {
+ $xdsCreds = \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl()
+ );
+ $this->assertNotNull($xdsCreds);
+ }
+
+ public function testCreateXdsWithInsecure() {
+ $xdsCreds = \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createInsecure()
+ );
+ $this->assertNotNull($xdsCreds);
+ }
+
+ public function testCreateXdsWithNull() {
+ $this->expectException(\InvalidArgumentException::class);
+ $xdsCreds = \Grpc\ChannelCredentials::createXds(null);
+ }
+
+ public function testCreateXdsWithInvalidType() {
+ $this->expectException(\TypeError::class);
+ $xdsCreds = \Grpc\ChannelCredentials::createXds("invalid-type");
+ }
+
public function testGetConnectivityState()
{
$this->channel = new Grpc\Channel('localhost:50001',
$this->channel2->close();
}
- public function testPersistentChannelSameChannelCredentials()
- {
- $creds1 = Grpc\ChannelCredentials::createSsl();
- $creds2 = Grpc\ChannelCredentials::createSsl();
-
- $this->channel1 = new Grpc\Channel('localhost:50019',
- ["credentials" => $creds1,
- "grpc_target_persist_bound" => 3,
- ]);
- $this->channel2 = new Grpc\Channel('localhost:50019',
- ["credentials" => $creds2]);
+ public function persistentChannelSameChannelCredentialsProvider(): array
+ {
+ return [
+ [
+ Grpc\ChannelCredentials::createSsl(),
+ Grpc\ChannelCredentials::createSsl(),
+ 50301,
+ ],
+ [
+ Grpc\ChannelCredentials::createSsl(
+ file_get_contents(dirname(__FILE__) . '/../data/ca.pem')
+ ),
+ Grpc\ChannelCredentials::createSsl(
+ file_get_contents(dirname(__FILE__) . '/../data/ca.pem')
+ ),
+ 50302,
+ ],
+ [
+ Grpc\ChannelCredentials::createInSecure(),
+ Grpc\ChannelCredentials::createInSecure(),
+ 50303,
+ ],
+ [
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl()
+ ),
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl()
+ ),
+ 50304,
+ ],
+ [
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl()
+ ),
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl()
+ ),
+ 50305,
+ ],
+ [
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl(
+ file_get_contents(dirname(__FILE__) . '/../data/ca.pem')
+ )
+ ),
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl(
+ file_get_contents(dirname(__FILE__) . '/../data/ca.pem')
+ )
+ ),
+ 50306,
+ ],
+ [
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createInSecure()
+ ),
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createInSecure()
+ ),
+ 50307,
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider persistentChannelSameChannelCredentialsProvider
+ */
+ public function testPersistentChannelSameChannelCredentials(
+ $creds1,
+ $creds2,
+ $port
+ ) {
+ $this->channel1 = new Grpc\Channel(
+ 'localhost:' . $port,
+ [
+ "credentials" => $creds1,
+ "grpc_target_persist_bound" => 3,
+ ]
+ );
+ $this->channel2 = new Grpc\Channel(
+ 'localhost:' . $port,
+ ["credentials" => $creds2]
+ );
// try to connect on channel1
$state = $this->channel1->getConnectivityState(true);
$this->channel2->close();
}
- public function testPersistentChannelDifferentChannelCredentials()
- {
- $creds1 = Grpc\ChannelCredentials::createSsl();
- $creds2 = Grpc\ChannelCredentials::createSsl(
- file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
-
- $this->channel1 = new Grpc\Channel('localhost:50020',
- ["credentials" => $creds1,
- "grpc_target_persist_bound" => 3,
- ]);
- $this->channel2 = new Grpc\Channel('localhost:50020',
- ["credentials" => $creds2]);
-
- // try to connect on channel1
- $state = $this->channel1->getConnectivityState(true);
- $this->waitUntilNotIdle($this->channel1);
-
- $state = $this->channel1->getConnectivityState();
- $this->assertConnecting($state);
- $state = $this->channel2->getConnectivityState();
- $this->assertEquals(GRPC\CHANNEL_IDLE, $state);
-
- $this->channel1->close();
- $this->channel2->close();
- }
-
- public function testPersistentChannelSameChannelCredentialsRootCerts()
- {
- $creds1 = Grpc\ChannelCredentials::createSsl(
- file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
- $creds2 = Grpc\ChannelCredentials::createSsl(
- file_get_contents(dirname(__FILE__).'/../data/ca.pem'));
-
- $this->channel1 = new Grpc\Channel('localhost:50021',
- ["credentials" => $creds1,
- "grpc_target_persist_bound" => 3,
- ]);
- $this->channel2 = new Grpc\Channel('localhost:50021',
- ["credentials" => $creds2]);
-
- // try to connect on channel1
- $state = $this->channel1->getConnectivityState(true);
- $this->waitUntilNotIdle($this->channel1);
-
- $state = $this->channel1->getConnectivityState();
- $this->assertConnecting($state);
- $state = $this->channel2->getConnectivityState();
- $this->assertConnecting($state);
-
- $this->channel1->close();
- $this->channel2->close();
- }
-
- public function testPersistentChannelDifferentSecureChannelCredentials()
- {
- $creds1 = Grpc\ChannelCredentials::createSsl();
- $creds2 = Grpc\ChannelCredentials::createInsecure();
-
- $this->channel1 = new Grpc\Channel('localhost:50022',
- ["credentials" => $creds1,
- "grpc_target_persist_bound" => 3,
- ]);
- $this->channel2 = new Grpc\Channel('localhost:50022',
- ["credentials" => $creds2]);
+ public function persistentChannelDifferentChannelCredentialsProvider(): array
+ {
+ return [
+ [
+ Grpc\ChannelCredentials::createSsl(),
+ Grpc\ChannelCredentials::createSsl(
+ file_get_contents(dirname(__FILE__) . '/../data/ca.pem')
+ ),
+ 50351,
+ ],
+ [
+ Grpc\ChannelCredentials::createSsl(),
+ Grpc\ChannelCredentials::createInsecure(),
+ 50352,
+ ],
+ [
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl()
+ ),
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl(
+ file_get_contents(dirname(__FILE__) . '/../data/ca.pem')
+ )
+ ),
+ 50353,
+ ],
+ [
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl()
+ ),
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createInsecure()
+ ),
+ 50354,
+ ],
+ [
+ \Grpc\ChannelCredentials::createInsecure(),
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createInsecure()
+ ),
+ 50355,
+ ],
+ [
+ \Grpc\ChannelCredentials::createSsl(),
+ \Grpc\ChannelCredentials::createXds(
+ \Grpc\ChannelCredentials::createSsl()
+ ),
+ 50356,
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider persistentChannelDifferentChannelCredentialsProvider
+ */
+ public function testPersistentChannelDifferentChannelCredentials(
+ $creds1,
+ $creds2,
+ $port
+ ) {
+
+ $this->channel1 = new Grpc\Channel(
+ 'localhost:' . $port,
+ [
+ "credentials" => $creds1,
+ "grpc_target_persist_bound" => 3,
+ ]
+ );
+ $this->channel2 = new Grpc\Channel(
+ 'localhost:' . $port,
+ ["credentials" => $creds2]
+ );
// try to connect on channel1
$state = $this->channel1->getConnectivityState(true);
public function interceptUnaryUnary($method,
$argument,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation)
+ array $options = [])
{
$metadata["foo"] = array('interceptor_from_unary_request');
return $continuation($method, $argument, $deserialize, $metadata, $options);
}
public function interceptStreamUnary($method,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation)
+ array $options = [])
{
$metadata["foo"] = array('interceptor_from_stream_request');
return $continuation($method, $deserialize, $metadata, $options);
public function interceptUnaryUnary($method,
$argument,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation)
+ array $options = [])
{
if (array_key_exists('foo', $metadata)) {
$metadata['bar'] = array('ChangeMetadataInterceptor should be executed first');
}
public function interceptStreamUnary($method,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation)
+ array $options = [])
{
if (array_key_exists('foo', $metadata)) {
$metadata['bar'] = array('ChangeMetadataInterceptor should be executed first');
public function interceptUnaryUnary($method,
$argument,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation)
+ array $options = [])
{
$argument->setData('intercepted_unary_request');
return $continuation($method, $argument, $deserialize, $metadata, $options);
}
public function interceptStreamUnary($method,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation)
+ array $options = [])
{
return new ChangeRequestCall(
$continuation($method, $deserialize, $metadata, $options)
public function interceptUnaryUnary($method,
$argument,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation)
+ array $options = [])
{
$metadata["foo"] = array('interceptor_from_request_response');
}
public function interceptStreamUnary($method,
$deserialize,
+ $continuation,
array $metadata = [],
- array $options = [],
- $continuation)
+ array $options = [])
{
$metadata["foo"] = array('interceptor_from_request_response');
}
--- /dev/null
+<?php
+/*
+ *
+ * Copyright 2015 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.
+ *
+ */
+
+require_once(dirname(__FILE__) . '/../../lib/Grpc/Status.php');
+
+class StatusTest extends \PHPUnit\Framework\TestCase
+{
+ public function testStatusOk()
+ {
+ $status = [
+ 'code' => \Grpc\STATUS_OK,
+ 'details' => 'OK',
+ ];
+ $return = \Grpc\Status::ok();
+ $this->assertEquals($status, $return);
+ }
+
+ public function testStatusOkWithMetadata()
+ {
+ $status = [
+ 'code' => \Grpc\STATUS_OK,
+ 'details' => 'OK',
+ 'metadata' => ['a' => 1],
+ ];
+ $return = \Grpc\Status::ok(['a' => 1]);
+ $this->assertEquals($status, $return);
+ }
+
+ public function testStatusUnimplemented()
+ {
+ $status = [
+ 'code' => \Grpc\STATUS_UNIMPLEMENTED,
+ 'details' => 'UNIMPLEMENTED',
+ ];
+ $return = \Grpc\Status::unimplemented();
+ $this->assertEquals($status, $return);
+ }
+
+ public function testStatus()
+ {
+ $status = [
+ 'code' => \Grpc\STATUS_INVALID_ARGUMENT,
+ 'details' => 'invalid argument',
+ ];
+ $return = \Grpc\Status::status(
+ \Grpc\STATUS_INVALID_ARGUMENT,
+ "invalid argument"
+ );
+ $this->assertEquals($status, $return);
+ }
+
+ public function testStatusWithMetadata()
+ {
+ $status = [
+ 'code' => \Grpc\STATUS_INVALID_ARGUMENT,
+ 'details' => 'invalid argument',
+ 'metadata' => ['trailiingMeta' => 100]
+ ];
+ $return = \Grpc\Status::status(
+ \Grpc\STATUS_INVALID_ARGUMENT,
+ "invalid argument",
+ ['trailiingMeta' => 100]
+ );
+ $this->assertEquals($status, $return);
+ }
+}
with open(proto_filename) as inp:
for line in inp:
imp = re.search(r'import "([^"]*)"', line)
- if not imp: continue
+ if not imp:
+ continue
imp_proto = imp.group(1)
# This indicates an external dependency, which we should handle
# differently and not traverse recursively
# revert the change to avoid file error.
if imp_proto.startswith('third_party/grpc'):
imp_proto = imp_proto[17:]
- if key not in deps: deps[key] = []
+ if key not in deps:
+ deps[key] = []
deps[key].append(imp_proto[:-6])
if is_trans:
update_deps(key, imp_proto, deps, deps_external, is_trans,
deps_external_trans = {}
for root, dirs, files in os.walk('src/proto'):
for f in files:
- if f[-6:] != '.proto': continue
+ if f[-6:] != '.proto':
+ continue
look_at = os.path.join(root, f)
deps_for = look_at[:-6]
# First level deps
--- /dev/null
+# Copyright 2021 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.
+
+licenses(["notice"])
+
+load("@rules_proto//proto:defs.bzl", "proto_library")
+
+proto_library(
+ name = "authz_policy_proto",
+ srcs = [
+ "authz_policy.proto",
+ ],
+ visibility = ["//visibility:public"],
+)
--- /dev/null
+// Copyright 2021 The 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.
+
+syntax = "proto3";
+
+package grpc.auth.v1;
+
+// Peer specifies attributes of a peer. Fields in the Peer are ANDed together, once
+// we support multiple fields in the future.
+message Peer {
+ // Optional. A list of peer identities to match for authorization. The principals
+ // are one of, i.e., it matches if one of the principals matches. The field
+ // supports Exact, Prefix, Suffix, and Presence matches.
+ // - Exact match: "abc" will match on value "abc".
+ // - Prefix match: "abc*" will match on value "abc" and "abcd".
+ // - Suffix match: "*abc" will match on value "abc" and "xabc".
+ // - Presence match: "*" will match when the value is not empty.
+ repeated string principals = 1;
+}
+
+// Specification of HTTP header match attributes.
+message Header {
+ // Required. The name of the HTTP header to match. The following headers are *not*
+ // supported: "hop-by-hop" headers (e.g., those listed in "Connection" header),
+ // HTTP/2 pseudo headers (":"-prefixed), the "Host" header, and headers prefixed
+ // with "grpc-".
+ string key = 1;
+
+ // Required. A list of header values to match. The header values are ORed together,
+ // i.e., it matches if one of the values matches. This field supports Exact,
+ // Prefix, Suffix, and Presence match. Multi-valued headers are considered a single
+ // value with commas added between values.
+ // - Exact match: "abc" will match on value "abc".
+ // - Prefix match: "abc*" will match on value "abc" and "abcd".
+ // - Suffix match: "*abc" will match on value "abc" and "xabc".
+ // - Presence match: "*" will match when the value is not empty.
+ repeated string values = 2;
+}
+
+// Request specifies attributes of a request. Fields in the Request are ANDed
+// together.
+message Request {
+ // Optional. A list of paths to match for authorization. This is the fully
+ // qualified name in the form of "/package.service/method". The paths are ORed
+ // together, i.e., it matches if one of the paths matches. This field supports
+ // Exact, Prefix, Suffix, and Presence matches.
+ // - Exact match: "abc" will match on value "abc".
+ // - Prefix match: "abc*" will match on value "abc" and "abcd".
+ // - Suffix match: "*abc" will match on value "abc" and "xabc".
+ // - Presence match: "*" will match when the value is not empty.
+ repeated string paths = 1;
+
+ // Optional. A list of HTTP header key/value pairs to match against, for
+ // potentially advanced use cases. The headers are ANDed together, i.e., it matches
+ // only if *all* the headers match.
+ repeated Header headers = 3;
+}
+
+// Specification of rules.
+message Rule {
+ // Required. The name of an authorization rule.
+ // It is mainly for monitoring and error message generation.
+ string name = 1;
+
+ // Optional. If not set, no checks will be performed against the source. An empty
+ // rule is always matched (i.e., both source and request are empty).
+ Peer source = 2;
+
+ // Optional. If not set, no checks will be performed against the request. An empty
+ // rule is always matched (i.e., both source and request are empty).
+ Request request = 3;
+}
+
+// AuthorizationPolicy defines which principals are permitted to access which
+// resource. Resources are RPC methods scoped by services.
+//
+// In the following yaml policy example, a peer identity from ["admin1", "admin2", "admin3"]
+// is authorized to access any RPC methods in pkg.service, and peer identity "dev" is
+// authorized to access the "foo" and "bar" RPC methods.
+//
+// name: example-policy
+// allow_rules:
+// - name: admin-access
+// source:
+// principals:
+// - "spiffe://foo.com/sa/admin1"
+// - "spiffe://foo.com/sa/admin2"
+// - "spiffe://foo.com/sa/admin3"
+// request:
+// paths: ["/pkg.service/*"]
+// - name: dev-access
+// source:
+// principals: ["spiffe://foo.com/sa/dev"]
+// request:
+// paths: ["/pkg.service/foo", "/pkg.service/bar"]
+
+message AuthorizationPolicy {
+ // Required. The name of an authorization policy.
+ // It is mainly for monitoring and error message generation.
+ string name = 1;
+
+ // Optional. List of deny rules to match. If a request matches any of the deny
+ // rules, then it will be denied. If none of the deny rules matches or there are
+ // no deny rules, the allow rules will be evaluated.
+ repeated Rule deny_rules = 2;
+
+ // Required. List of allow rules to match. The allow rules will only be evaluated
+ // after the deny rules. If a request matches any of the allow rules, then it will
+ // allowed. If none of the allow rules matches, it will be denied.
+ repeated Rule allow_rules = 3;
+}
// Accumulated stats for RPCs sent by a test client.
message LoadBalancerAccumulatedStatsResponse {
// The total number of RPCs have ever issued for each type.
- map<string, int32> num_rpcs_started_by_method = 1;
+ // Deprecated: use stats_per_method.rpcs_started instead.
+ map<string, int32> num_rpcs_started_by_method = 1 [deprecated = true];
// The total number of RPCs have ever completed successfully for each type.
- map<string, int32> num_rpcs_succeeded_by_method = 2;
+ // Deprecated: use stats_per_method.result instead.
+ map<string, int32> num_rpcs_succeeded_by_method = 2 [deprecated = true];
// The total number of RPCs have ever failed for each type.
- map<string, int32> num_rpcs_failed_by_method = 3;
+ // Deprecated: use stats_per_method.result instead.
+ map<string, int32> num_rpcs_failed_by_method = 3 [deprecated = true];
+
+ message MethodStats {
+ // The number of RPCs that were started for this method.
+ int32 rpcs_started = 1;
+
+ // The number of RPCs that completed with each status for this method. The
+ // key is the integral value of a google.rpc.Code; the value is the count.
+ map<int32, int32> result = 2;
+ }
+
+ // Per-method RPC statistics. The key is the RpcType in string form; e.g.
+ // 'EMPTY_CALL' or 'UNARY_CALL'
+ map<string, MethodStats> stats_per_method = 4;
}
// Configurations for a test client.
repeated RpcType types = 1;
// The collection of custom metadata to be attached to RPCs sent by the client.
repeated Metadata metadata = 2;
+ // The deadline to use, in seconds, for all RPCs. If unset or zero, the
+ // client will use the default from the command-line.
+ int32 timeout_sec = 3;
}
// Response for updating a test client's configuration.
repeated Thresholds thresholds = 1;
}
+message ClusterConfig {
+ repeated string clusters = 1;
+}
+
+message CustomClusterType {
+ string name = 1;
+ ClusterConfig typed_config = 2;
+}
+
message Cluster {
// Refer to :ref:`service discovery type <arch_overview_service_discovery_types>`
// for an explanation on each type.
// The :ref:`service discovery type <arch_overview_service_discovery_types>`
// to use for resolving the cluster.
DiscoveryType type = 2;
+
+ // The custom cluster type: aggregate cluster in this case.
+ CustomClusterType cluster_type = 38;
}
// Only valid when discovery type is EDS.
"listener.proto",
],
well_known_protos = True,
+ deps = [
+ "address_proto",
+ "base_proto",
+ ],
)
grpc_proto_library(
)
grpc_proto_library(
+ name = "aggregate_cluster_proto",
+ srcs = [
+ "aggregate_cluster.proto",
+ ],
+ well_known_protos = True,
+ deps = [
+ "string_proto",
+ ],
+)
+
+grpc_proto_library(
name = "tls_proto",
srcs = [
"tls.proto",
--- /dev/null
+// Copyright 2020 The 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.
+
+// Local copy of Envoy xDS proto file, used for testing only.
+
+syntax = "proto3";
+
+package envoy.extensions.clusters.aggregate.v3;
+
+// Configuration for the aggregate cluster. See the :ref:`architecture overview
+// <arch_overview_aggregate_cluster>` for more information.
+// [#extension: envoy.clusters.aggregate]
+message ClusterConfig {
+ // Load balancing clusters in aggregate cluster. Clusters are prioritized based on the order they
+ // appear in this list.
+ repeated string clusters = 1;
+}
import "src/proto/grpc/testing/xds/v3/base.proto";
import "src/proto/grpc/testing/xds/v3/config_source.proto";
+import "google/protobuf/any.proto";
import "google/protobuf/wrappers.proto";
enum RoutingPriority {
repeated Thresholds thresholds = 1;
}
+// Extended cluster type.
+message CustomClusterType {
+ // The type of the cluster to instantiate. The name must match a supported cluster type.
+ string name = 1;
+
+ // Cluster specific configuration which depends on the cluster being instantiated.
+ // See the supported cluster for further documentation.
+ google.protobuf.Any typed_config = 2;
+}
+
// [#protodoc-title: Cluster configuration]
// Configuration for a single upstream cluster.
// The :ref:`service discovery type <arch_overview_service_discovery_types>`
// to use for resolving the cluster.
DiscoveryType type = 2;
+
+ // The custom cluster type.
+ CustomClusterType cluster_type = 38;
}
// Configuration to use for EDS updates for the Cluster.
package envoy.config.listener.v3;
+import "src/proto/grpc/testing/xds/v3/address.proto";
+import "src/proto/grpc/testing/xds/v3/base.proto";
+
import "google/protobuf/any.proto";
// [#protodoc-title: Listener configuration]
google.protobuf.Any api_listener = 1;
}
+message FilterChainMatch {
+ // If non-empty, a list of application protocols (e.g. ALPN for TLS protocol) to consider when
+ // determining a filter chain match. Those values will be compared against the application
+ // protocols of a new connection, when detected by one of the listener filters.
+ //
+ // Suggested values include:
+ //
+ // * ``http/1.1`` - set by :ref:`envoy.filters.listener.tls_inspector
+ // <config_listener_filters_tls_inspector>`,
+ // * ``h2`` - set by :ref:`envoy.filters.listener.tls_inspector <config_listener_filters_tls_inspector>`
+ //
+ // .. attention::
+ //
+ // Currently, only :ref:`TLS Inspector <config_listener_filters_tls_inspector>` provides
+ // application protocol detection based on the requested
+ // `ALPN <https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation>`_ values.
+ //
+ // However, the use of ALPN is pretty much limited to the HTTP/2 traffic on the Internet,
+ // and matching on values other than ``h2`` is going to lead to a lot of false negatives,
+ // unless all connecting clients are known to use ALPN.
+ repeated string application_protocols = 10;
+}
+
+// A filter chain wraps a set of match criteria, an option TLS context, a set of filters, and
+// various other parameters.
+// [#next-free-field: 10]
+message FilterChain {
+ // The criteria to use when matching a connection to this filter chain.
+ FilterChainMatch filter_chain_match = 1;
+
+ // Optional custom transport socket implementation to use for downstream connections.
+ // To setup TLS, set a transport socket with name `tls` and
+ // :ref:`DownstreamTlsContext <envoy_api_msg_extensions.transport_sockets.tls.v3.DownstreamTlsContext>` in the `typed_config`.
+ // If no transport socket configuration is specified, new connections
+ // will be set up with plaintext.
+ core.v3.TransportSocket transport_socket = 6;
+}
+
// [#next-free-field: 23]
message Listener {
// The unique name by which this listener is known. If no name is provided,
// updated or removed via :ref:`LDS <config_listeners_lds>` a unique name must be provided.
string name = 1;
+ // The address that the listener should listen on. In general, the address must be unique, though
+ // that is governed by the bind rules of the OS. E.g., multiple listeners can listen on port 0 on
+ // Linux as the actual port will be allocated by the OS.
+ core.v3.Address address = 2;
+
+ // A list of filter chains to consider for this listener. The
+ // :ref:`FilterChain <envoy_api_msg_config.listener.v3.FilterChain>` with the most specific
+ // :ref:`FilterChainMatch <envoy_api_msg_config.listener.v3.FilterChainMatch>` criteria is used on a
+ // connection.
+ //
+ // Example using SNI for filter chain selection can be found in the
+ // :ref:`FAQ entry <faq_how_to_setup_sni>`.
+ repeated FilterChain filter_chains = 3;
+
// Used to represent an API listener, which is used in non-proxy clients. The type of API
// exposed to the non-proxy application depends on the type of API listener.
// When this field is set, no other field except for :ref:`name<envoy_api_field_config.listener.v3.Listener.name>`
import "src/proto/grpc/testing/xds/v3/string.proto";
+import "google/protobuf/wrappers.proto";
+
message CertificateValidationContext {
// An optional list of Subject Alternative name matchers. If specified, Envoy will verify that the
// Subject Alternative Name of the presented certificate matches one of the specified matchers.
CommonTlsContext common_tls_context = 1;
}
+message DownstreamTlsContext {
+ // Common TLS context settings.
+ CommonTlsContext common_tls_context = 1;
+
+ // If specified, Envoy will reject connections without a valid client
+ // certificate.
+ google.protobuf.BoolValue require_client_certificate = 2;
+}
+
+
// TLS context shared by both client and server TLS contexts.
// [#next-free-field: 14]
message CommonTlsContext {
certificate_chain))
+def xds_channel_credentials(fallback_credentials=None):
+ """Creates a ChannelCredentials for use with xDS. This is an EXPERIMENTAL
+ API.
+
+ Args:
+ fallback_credentials: Credentials to use in case it is not possible to
+ establish a secure connection via xDS. If no fallback_credentials
+ argument is supplied, a default SSLChannelCredentials is used.
+ """
+ fallback_credentials = ssl_channel_credentials(
+ ) if fallback_credentials is None else fallback_credentials
+ return ChannelCredentials(
+ _cygrpc.XDSChannelCredentials(fallback_credentials._credentials))
+
+
def metadata_call_credentials(metadata_plugin, name=None):
"""Construct CallCredentials from an AuthMetadataPlugin.
], require_client_auth))
+def xds_server_credentials(fallback_credentials):
+ """Creates a ServerCredentials for use with xDS. This is an EXPERIMENTAL
+ API.
+
+ Args:
+ fallback_credentials: Credentials to use in case it is not possible to
+ establish a secure connection via xDS. No default value is provided.
+ """
+ return ServerCredentials(
+ _cygrpc.xds_server_credentials(fallback_credentials._credentials))
+
+
+def insecure_server_credentials():
+ """Creates a credentials object directing the server to use no credentials.
+ This is an EXPERIMENTAL API.
+
+ This object cannot be used directly in a call to `add_secure_port`.
+ Instead, it should be used to construct other credentials objects, e.g.
+ with xds_server_credentials.
+ """
+ return ServerCredentials(_cygrpc.insecure_server_credentials())
+
+
def ssl_server_certificate_configuration(private_key_certificate_chain_pairs,
root_certificates=None):
"""Creates a ServerCertificateConfiguration for use with a Server.
interceptors=None,
options=None,
maximum_concurrent_rpcs=None,
- compression=None):
+ compression=None,
+ xds=False):
"""Creates a Server with which RPCs can be serviced.
Args:
compression: An element of grpc.compression, e.g.
grpc.compression.Gzip. This compression algorithm will be used for the
lifetime of the server unless overridden. This is an EXPERIMENTAL option.
+ xds: If set to true, retrieves server configuration via xDS. This is an
+ EXPERIMENTAL option.
Returns:
A Server object.
() if handlers is None else handlers,
() if interceptors is None else interceptors,
() if options is None else options,
- maximum_concurrent_rpcs, compression)
+ maximum_concurrent_rpcs, compression, xds)
@contextlib.contextmanager
def _done():
return (state.code is not None or
- cygrpc.OperationType.send_message not in
- state.due)
+ cygrpc.OperationType.send_message
+ not in state.due)
_common.wait(state.condition.wait,
_done,
raise self
def _response_ready():
- return (
- self._state.response is not None or
- (cygrpc.OperationType.receive_message not in self._state.due
- and self._state.code is not None))
+ return (self._state.response is not None or
+ (cygrpc.OperationType.receive_message
+ not in self._state.due and
+ self._state.code is not None))
_common.wait(self._state.condition.wait, _response_ready)
if self._state.response is not None:
init_grpc_aio()
# NOTE(lidiz) Core objects won't be deallocated automatically.
# If AioServer.shutdown is not called, those objects will leak.
- self._server = Server(options)
+ # TODO(rbellevi): Support xDS in aio server.
+ self._server = Server(options, False)
grpc_server_register_completion_queue(
self._server.c_server,
global_completion_queue(),
cdef grpc_channel_credentials *c(self) except *
+cdef class XDSChannelCredentials(ChannelCredentials):
+
+ cdef readonly ChannelCredentials _fallback_credentials
+
+ cdef grpc_channel_credentials *c(self) except *
+
+
cdef class ServerCertificateConfig:
cdef grpc_ssl_server_certificate_config *c_cert_config
return c_composition
+cdef class XDSChannelCredentials(ChannelCredentials):
+
+ def __cinit__(self, fallback_credentials):
+ self._fallback_credentials = fallback_credentials
+
+ cdef grpc_channel_credentials *c(self) except *:
+ cdef grpc_channel_credentials *c_fallback_creds = self._fallback_credentials.c()
+ cdef grpc_channel_credentials *xds_creds = grpc_xds_credentials_create(c_fallback_creds)
+ grpc_channel_credentials_release(c_fallback_creds)
+ return xds_creds
+
+
cdef class ServerCertificateConfig:
def __cinit__(self):
def channel_credentials_local(grpc_local_connect_type local_connect_type):
return LocalChannelCredentials(local_connect_type)
+cdef class InsecureChannelCredentials(ChannelCredentials):
+
+ cdef grpc_channel_credentials *c(self) except *:
+ return grpc_insecure_credentials_create()
+
+def channel_credentials_insecure():
+ return InsecureChannelCredentials()
+
def server_credentials_local(grpc_local_connect_type local_connect_type):
cdef ServerCredentials credentials = ServerCredentials()
credentials.c_credentials = grpc_local_server_credentials_create(local_connect_type)
return credentials
+def xds_server_credentials(ServerCredentials fallback_credentials):
+ cdef ServerCredentials credentials = ServerCredentials()
+ credentials.c_credentials = grpc_xds_server_credentials_create(fallback_credentials.c_credentials)
+ # NOTE: We do not need to call grpc_server_credentials_release on the
+ # fallback credentials here because this will be done by the __dealloc__
+ # method of its Cython wrapper.
+ return credentials
+
+def insecure_server_credentials():
+ cdef ServerCredentials credentials = ServerCredentials()
+ credentials.c_credentials = grpc_insecure_server_credentials_create()
+ return credentials
cdef class ALTSChannelCredentials(ChannelCredentials):
void grpc_server_register_completion_queue(grpc_server *server,
grpc_completion_queue *cq,
void *reserved) nogil
+
+ ctypedef struct grpc_server_config_fetcher:
+ pass
+
+ void grpc_server_set_config_fetcher(
+ grpc_server* server, grpc_server_config_fetcher* config_fetcher) nogil
+
+ grpc_server_config_fetcher* grpc_server_config_fetcher_xds_create() nogil
+
+
int grpc_server_add_insecure_http2_port(
grpc_server *server, const char *addr) nogil
void grpc_server_start(grpc_server *server) nogil
void *reserved) nogil
void grpc_channel_credentials_release(grpc_channel_credentials *creds) nogil
+ grpc_channel_credentials *grpc_xds_credentials_create(
+ grpc_channel_credentials *fallback_creds) nogil
+
+ grpc_channel_credentials *grpc_insecure_credentials_create() nogil
+
+ grpc_server_credentials *grpc_xds_server_credentials_create(
+ grpc_server_credentials *fallback_creds) nogil
+
+ grpc_server_credentials *grpc_insecure_server_credentials_create() nogil
+
grpc_call_credentials *grpc_composite_call_credentials_create(
grpc_call_credentials *creds1, grpc_call_credentials *creds2,
void *reserved) nogil
cdef class Server:
- def __cinit__(self, object arguments):
+ def __cinit__(self, object arguments, bint xds):
fork_handlers_and_grpc_init()
self.references = []
self.registered_completion_queues = []
self.c_server = NULL
cdef _ChannelArgs channel_args = _ChannelArgs(arguments)
self.c_server = grpc_server_create(channel_args.c_args(), NULL)
+ if xds:
+ grpc_server_set_config_fetcher(self.c_server, grpc_server_config_fetcher_xds_create())
self.references.append(arguments)
def request_call(
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc/_grpcio_metadata.py.template`!!!
-__version__ = """1.35.0"""
+__version__ = """1.36.0"""
# pylint: disable=too-many-arguments
def __init__(self, thread_pool, generic_handlers, interceptors, options,
- maximum_concurrent_rpcs, compression):
+ maximum_concurrent_rpcs, compression, xds):
completion_queue = cygrpc.CompletionQueue()
- server = cygrpc.Server(_augment_options(options, compression))
+ server = cygrpc.Server(_augment_options(options, compression), xds)
server.register_completion_queue(completion_queue)
self._state = _ServerState(completion_queue, server, generic_handlers,
_interceptor.service_pipeline(interceptors),
def create_server(thread_pool, generic_rpc_handlers, interceptors, options,
- maximum_concurrent_rpcs, compression):
+ maximum_concurrent_rpcs, compression, xds):
_validate_generic_rpc_handlers(generic_rpc_handlers)
return _Server(thread_pool, generic_rpc_handlers, interceptors, options,
- maximum_concurrent_rpcs, compression)
+ maximum_concurrent_rpcs, compression, xds)
ResponseType = TypeVar('ResponseType')
OptionsType = Sequence[Tuple[str, str]]
-CacheKey = Tuple[str, OptionsType, Optional[grpc.ChannelCredentials], Optional[
- grpc.Compression]]
+CacheKey = Tuple[str, OptionsType, Optional[grpc.ChannelCredentials],
+ Optional[grpc.Compression]]
_LOGGER = logging.getLogger(__name__)
def _create_channel(target: str, options: Sequence[Tuple[str, str]],
channel_credentials: Optional[grpc.ChannelCredentials],
compression: Optional[grpc.Compression]) -> grpc.Channel:
- if channel_credentials is grpc.experimental.insecure_channel_credentials():
- _LOGGER.debug(f"Creating insecure channel with options '{options}' " +
- f"and compression '{compression}'")
- return grpc.insecure_channel(target,
- options=options,
- compression=compression)
- else:
- _LOGGER.debug(
- f"Creating secure channel with credentials '{channel_credentials}', "
- + f"options '{options}' and compression '{compression}'")
- return grpc.secure_channel(target,
- credentials=channel_credentials,
- options=options,
- compression=compression)
+ _LOGGER.debug(
+ f"Creating secure channel with credentials '{channel_credentials}', " +
+ f"options '{options}' and compression '{compression}'")
+ return grpc.secure_channel(target,
+ credentials=channel_credentials,
+ options=options,
+ compression=compression)
class ChannelCache:
@experimental_api
def unary_unary(
- request: RequestType,
- target: str,
- method: str,
- request_serializer: Optional[Callable[[Any], bytes]] = None,
- response_deserializer: Optional[Callable[[bytes], Any]] = None,
- options: Sequence[Tuple[AnyStr, AnyStr]] = (),
- channel_credentials: Optional[grpc.ChannelCredentials] = None,
- insecure: bool = False,
- call_credentials: Optional[grpc.CallCredentials] = None,
- compression: Optional[grpc.Compression] = None,
- wait_for_ready: Optional[bool] = None,
- timeout: Optional[float] = _DEFAULT_TIMEOUT,
- metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None
+ request: RequestType,
+ target: str,
+ method: str,
+ request_serializer: Optional[Callable[[Any], bytes]] = None,
+ response_deserializer: Optional[Callable[[bytes], Any]] = None,
+ options: Sequence[Tuple[AnyStr, AnyStr]] = (),
+ channel_credentials: Optional[grpc.ChannelCredentials] = None,
+ insecure: bool = False,
+ call_credentials: Optional[grpc.CallCredentials] = None,
+ compression: Optional[grpc.Compression] = None,
+ wait_for_ready: Optional[bool] = None,
+ timeout: Optional[float] = _DEFAULT_TIMEOUT,
+ metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None
) -> ResponseType:
"""Invokes a unary-unary RPC without an explicitly specified channel.
@experimental_api
def unary_stream(
- request: RequestType,
- target: str,
- method: str,
- request_serializer: Optional[Callable[[Any], bytes]] = None,
- response_deserializer: Optional[Callable[[bytes], Any]] = None,
- options: Sequence[Tuple[AnyStr, AnyStr]] = (),
- channel_credentials: Optional[grpc.ChannelCredentials] = None,
- insecure: bool = False,
- call_credentials: Optional[grpc.CallCredentials] = None,
- compression: Optional[grpc.Compression] = None,
- wait_for_ready: Optional[bool] = None,
- timeout: Optional[float] = _DEFAULT_TIMEOUT,
- metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None
+ request: RequestType,
+ target: str,
+ method: str,
+ request_serializer: Optional[Callable[[Any], bytes]] = None,
+ response_deserializer: Optional[Callable[[bytes], Any]] = None,
+ options: Sequence[Tuple[AnyStr, AnyStr]] = (),
+ channel_credentials: Optional[grpc.ChannelCredentials] = None,
+ insecure: bool = False,
+ call_credentials: Optional[grpc.CallCredentials] = None,
+ compression: Optional[grpc.Compression] = None,
+ wait_for_ready: Optional[bool] = None,
+ timeout: Optional[float] = _DEFAULT_TIMEOUT,
+ metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None
) -> Iterator[ResponseType]:
"""Invokes a unary-stream RPC without an explicitly specified channel.
@experimental_api
def stream_unary(
- request_iterator: Iterator[RequestType],
- target: str,
- method: str,
- request_serializer: Optional[Callable[[Any], bytes]] = None,
- response_deserializer: Optional[Callable[[bytes], Any]] = None,
- options: Sequence[Tuple[AnyStr, AnyStr]] = (),
- channel_credentials: Optional[grpc.ChannelCredentials] = None,
- insecure: bool = False,
- call_credentials: Optional[grpc.CallCredentials] = None,
- compression: Optional[grpc.Compression] = None,
- wait_for_ready: Optional[bool] = None,
- timeout: Optional[float] = _DEFAULT_TIMEOUT,
- metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None
+ request_iterator: Iterator[RequestType],
+ target: str,
+ method: str,
+ request_serializer: Optional[Callable[[Any], bytes]] = None,
+ response_deserializer: Optional[Callable[[bytes], Any]] = None,
+ options: Sequence[Tuple[AnyStr, AnyStr]] = (),
+ channel_credentials: Optional[grpc.ChannelCredentials] = None,
+ insecure: bool = False,
+ call_credentials: Optional[grpc.CallCredentials] = None,
+ compression: Optional[grpc.Compression] = None,
+ wait_for_ready: Optional[bool] = None,
+ timeout: Optional[float] = _DEFAULT_TIMEOUT,
+ metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None
) -> ResponseType:
"""Invokes a stream-unary RPC without an explicitly specified channel.
@experimental_api
def stream_stream(
- request_iterator: Iterator[RequestType],
- target: str,
- method: str,
- request_serializer: Optional[Callable[[Any], bytes]] = None,
- response_deserializer: Optional[Callable[[bytes], Any]] = None,
- options: Sequence[Tuple[AnyStr, AnyStr]] = (),
- channel_credentials: Optional[grpc.ChannelCredentials] = None,
- insecure: bool = False,
- call_credentials: Optional[grpc.CallCredentials] = None,
- compression: Optional[grpc.Compression] = None,
- wait_for_ready: Optional[bool] = None,
- timeout: Optional[float] = _DEFAULT_TIMEOUT,
- metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None
+ request_iterator: Iterator[RequestType],
+ target: str,
+ method: str,
+ request_serializer: Optional[Callable[[Any], bytes]] = None,
+ response_deserializer: Optional[Callable[[bytes], Any]] = None,
+ options: Sequence[Tuple[AnyStr, AnyStr]] = (),
+ channel_credentials: Optional[grpc.ChannelCredentials] = None,
+ insecure: bool = False,
+ call_credentials: Optional[grpc.CallCredentials] = None,
+ compression: Optional[grpc.Compression] = None,
+ wait_for_ready: Optional[bool] = None,
+ timeout: Optional[float] = _DEFAULT_TIMEOUT,
+ metadata: Optional[Sequence[Tuple[str, Union[str, bytes]]]] = None
) -> Iterator[ResponseType]:
"""Invokes a stream-stream RPC without an explicitly specified channel.
"""Enables asynchronous invocation of a unary-call RPC."""
@abc.abstractmethod
- def __call__(self,
- request: Any,
- *,
- timeout: Optional[float] = None,
- metadata: Optional[Metadata] = None,
- credentials: Optional[grpc.CallCredentials] = None,
- wait_for_ready: Optional[bool] = None,
- compression: Optional[grpc.Compression] = None
- ) -> _base_call.UnaryUnaryCall:
+ def __call__(
+ self,
+ request: Any,
+ *,
+ timeout: Optional[float] = None,
+ metadata: Optional[Metadata] = None,
+ credentials: Optional[grpc.CallCredentials] = None,
+ wait_for_ready: Optional[bool] = None,
+ compression: Optional[grpc.Compression] = None
+ ) -> _base_call.UnaryUnaryCall:
"""Asynchronously invokes the underlying RPC.
Args:
"""Enables asynchronous invocation of a server-streaming RPC."""
@abc.abstractmethod
- def __call__(self,
- request: Any,
- *,
- timeout: Optional[float] = None,
- metadata: Optional[Metadata] = None,
- credentials: Optional[grpc.CallCredentials] = None,
- wait_for_ready: Optional[bool] = None,
- compression: Optional[grpc.Compression] = None
- ) -> _base_call.UnaryStreamCall:
+ def __call__(
+ self,
+ request: Any,
+ *,
+ timeout: Optional[float] = None,
+ metadata: Optional[Metadata] = None,
+ credentials: Optional[grpc.CallCredentials] = None,
+ wait_for_ready: Optional[bool] = None,
+ compression: Optional[grpc.Compression] = None
+ ) -> _base_call.UnaryStreamCall:
"""Asynchronously invokes the underlying RPC.
Args:
"""Enables asynchronous invocation of a client-streaming RPC."""
@abc.abstractmethod
- def __call__(self,
- request_iterator: Optional[RequestIterableType] = None,
- timeout: Optional[float] = None,
- metadata: Optional[Metadata] = None,
- credentials: Optional[grpc.CallCredentials] = None,
- wait_for_ready: Optional[bool] = None,
- compression: Optional[grpc.Compression] = None
- ) -> _base_call.StreamUnaryCall:
+ def __call__(
+ self,
+ request_iterator: Optional[RequestIterableType] = None,
+ timeout: Optional[float] = None,
+ metadata: Optional[Metadata] = None,
+ credentials: Optional[grpc.CallCredentials] = None,
+ wait_for_ready: Optional[bool] = None,
+ compression: Optional[grpc.Compression] = None
+ ) -> _base_call.StreamUnaryCall:
"""Asynchronously invokes the underlying RPC.
Args:
"""Enables asynchronous invocation of a bidirectional-streaming RPC."""
@abc.abstractmethod
- def __call__(self,
- request_iterator: Optional[RequestIterableType] = None,
- timeout: Optional[float] = None,
- metadata: Optional[Metadata] = None,
- credentials: Optional[grpc.CallCredentials] = None,
- wait_for_ready: Optional[bool] = None,
- compression: Optional[grpc.Compression] = None
- ) -> _base_call.StreamStreamCall:
+ def __call__(
+ self,
+ request_iterator: Optional[RequestIterableType] = None,
+ timeout: Optional[float] = None,
+ metadata: Optional[Metadata] = None,
+ credentials: Optional[grpc.CallCredentials] = None,
+ wait_for_ready: Optional[bool] = None,
+ compression: Optional[grpc.Compression] = None
+ ) -> _base_call.StreamStreamCall:
"""Asynchronously invokes the underlying RPC.
Args:
@abc.abstractmethod
async def wait_for_state_change(
- self,
- last_observed_state: grpc.ChannelConnectivity,
+ self,
+ last_observed_state: grpc.ChannelConnectivity,
) -> None:
"""Waits for a change in connectivity state.
@abc.abstractmethod
def unary_unary(
- self,
- method: str,
- request_serializer: Optional[SerializingFunction] = None,
- response_deserializer: Optional[DeserializingFunction] = None
+ self,
+ method: str,
+ request_serializer: Optional[SerializingFunction] = None,
+ response_deserializer: Optional[DeserializingFunction] = None
) -> UnaryUnaryMultiCallable:
"""Creates a UnaryUnaryMultiCallable for a unary-unary method.
@abc.abstractmethod
def unary_stream(
- self,
- method: str,
- request_serializer: Optional[SerializingFunction] = None,
- response_deserializer: Optional[DeserializingFunction] = None
+ self,
+ method: str,
+ request_serializer: Optional[SerializingFunction] = None,
+ response_deserializer: Optional[DeserializingFunction] = None
) -> UnaryStreamMultiCallable:
"""Creates a UnaryStreamMultiCallable for a unary-stream method.
@abc.abstractmethod
def stream_unary(
- self,
- method: str,
- request_serializer: Optional[SerializingFunction] = None,
- response_deserializer: Optional[DeserializingFunction] = None
+ self,
+ method: str,
+ request_serializer: Optional[SerializingFunction] = None,
+ response_deserializer: Optional[DeserializingFunction] = None
) -> StreamUnaryMultiCallable:
"""Creates a StreamUnaryMultiCallable for a stream-unary method.
@abc.abstractmethod
def stream_stream(
- self,
- method: str,
- request_serializer: Optional[SerializingFunction] = None,
- response_deserializer: Optional[DeserializingFunction] = None
+ self,
+ method: str,
+ request_serializer: Optional[SerializingFunction] = None,
+ response_deserializer: Optional[DeserializingFunction] = None
) -> StreamStreamMultiCallable:
"""Creates a StreamStreamMultiCallable for a stream-stream method.
"""
@abc.abstractmethod
- async def abort(self,
- code: grpc.StatusCode,
- details: str = '',
- trailing_metadata: Metadata = tuple()) -> None:
+ async def abort(
+ self,
+ code: grpc.StatusCode,
+ details: str = '',
+ trailing_metadata: Metadata = tuple()) -> None:
"""Raises an exception to terminate the RPC with a non-OK status.
The code and details passed as arguments will supercede any existing
def _metadata_sent_observer(self):
self._metadata_sent.set()
- async def _consume_request_iterator(self,
- request_iterator: RequestIterableType
- ) -> None:
+ async def _consume_request_iterator(
+ self, request_iterator: RequestIterableType) -> None:
try:
if inspect.isasyncgen(request_iterator) or hasattr(
request_iterator, '__aiter__'):
# pylint: disable=too-many-arguments
def __init__(
- self,
- channel: cygrpc.AioChannel,
- method: bytes,
- request_serializer: SerializingFunction,
- response_deserializer: DeserializingFunction,
- interceptors: Optional[Sequence[ClientInterceptor]],
- loop: asyncio.AbstractEventLoop,
+ self,
+ channel: cygrpc.AioChannel,
+ method: bytes,
+ request_serializer: SerializingFunction,
+ response_deserializer: DeserializingFunction,
+ interceptors: Optional[Sequence[ClientInterceptor]],
+ loop: asyncio.AbstractEventLoop,
) -> None:
self._loop = loop
self._channel = channel
self._interceptors = interceptors
@staticmethod
- def _init_metadata(metadata: Optional[Metadata] = None,
- compression: Optional[grpc.Compression] = None
- ) -> Metadata:
+ def _init_metadata(
+ metadata: Optional[Metadata] = None,
+ compression: Optional[grpc.Compression] = None) -> Metadata:
"""Based on the provided values for <metadata> or <compression> initialise the final
metadata, as it should be used for the current call.
"""
class UnaryUnaryMultiCallable(_BaseMultiCallable,
_base_channel.UnaryUnaryMultiCallable):
- def __call__(self,
- request: Any,
- *,
- timeout: Optional[float] = None,
- metadata: Optional[Metadata] = None,
- credentials: Optional[grpc.CallCredentials] = None,
- wait_for_ready: Optional[bool] = None,
- compression: Optional[grpc.Compression] = None
- ) -> _base_call.UnaryUnaryCall:
+ def __call__(
+ self,
+ request: Any,
+ *,
+ timeout: Optional[float] = None,
+ metadata: Optional[Metadata] = None,
+ credentials: Optional[grpc.CallCredentials] = None,
+ wait_for_ready: Optional[bool] = None,
+ compression: Optional[grpc.Compression] = None
+ ) -> _base_call.UnaryUnaryCall:
metadata = self._init_metadata(metadata, compression)
if not self._interceptors:
class UnaryStreamMultiCallable(_BaseMultiCallable,
_base_channel.UnaryStreamMultiCallable):
- def __call__(self,
- request: Any,
- *,
- timeout: Optional[float] = None,
- metadata: Optional[Metadata] = None,
- credentials: Optional[grpc.CallCredentials] = None,
- wait_for_ready: Optional[bool] = None,
- compression: Optional[grpc.Compression] = None
- ) -> _base_call.UnaryStreamCall:
+ def __call__(
+ self,
+ request: Any,
+ *,
+ timeout: Optional[float] = None,
+ metadata: Optional[Metadata] = None,
+ credentials: Optional[grpc.CallCredentials] = None,
+ wait_for_ready: Optional[bool] = None,
+ compression: Optional[grpc.Compression] = None
+ ) -> _base_call.UnaryStreamCall:
metadata = self._init_metadata(metadata, compression)
deadline = _timeout_to_deadline(timeout)
class StreamUnaryMultiCallable(_BaseMultiCallable,
_base_channel.StreamUnaryMultiCallable):
- def __call__(self,
- request_iterator: Optional[RequestIterableType] = None,
- timeout: Optional[float] = None,
- metadata: Optional[Metadata] = None,
- credentials: Optional[grpc.CallCredentials] = None,
- wait_for_ready: Optional[bool] = None,
- compression: Optional[grpc.Compression] = None
- ) -> _base_call.StreamUnaryCall:
+ def __call__(
+ self,
+ request_iterator: Optional[RequestIterableType] = None,
+ timeout: Optional[float] = None,
+ metadata: Optional[Metadata] = None,
+ credentials: Optional[grpc.CallCredentials] = None,
+ wait_for_ready: Optional[bool] = None,
+ compression: Optional[grpc.Compression] = None
+ ) -> _base_call.StreamUnaryCall:
metadata = self._init_metadata(metadata, compression)
deadline = _timeout_to_deadline(timeout)
class StreamStreamMultiCallable(_BaseMultiCallable,
_base_channel.StreamStreamMultiCallable):
- def __call__(self,
- request_iterator: Optional[RequestIterableType] = None,
- timeout: Optional[float] = None,
- metadata: Optional[Metadata] = None,
- credentials: Optional[grpc.CallCredentials] = None,
- wait_for_ready: Optional[bool] = None,
- compression: Optional[grpc.Compression] = None
- ) -> _base_call.StreamStreamCall:
+ def __call__(
+ self,
+ request_iterator: Optional[RequestIterableType] = None,
+ timeout: Optional[float] = None,
+ metadata: Optional[Metadata] = None,
+ credentials: Optional[grpc.CallCredentials] = None,
+ wait_for_ready: Optional[bool] = None,
+ compression: Optional[grpc.Compression] = None
+ ) -> _base_call.StreamStreamCall:
metadata = self._init_metadata(metadata, compression)
deadline = _timeout_to_deadline(timeout)
return _common.CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY[result]
async def wait_for_state_change(
- self,
- last_observed_state: grpc.ChannelConnectivity,
+ self,
+ last_observed_state: grpc.ChannelConnectivity,
) -> None:
assert await self._channel.watch_connectivity_state(
last_observed_state.value[0], None)
state = self.get_state(try_to_connect=True)
def unary_unary(
- self,
- method: str,
- request_serializer: Optional[SerializingFunction] = None,
- response_deserializer: Optional[DeserializingFunction] = None
+ self,
+ method: str,
+ request_serializer: Optional[SerializingFunction] = None,
+ response_deserializer: Optional[DeserializingFunction] = None
) -> UnaryUnaryMultiCallable:
return UnaryUnaryMultiCallable(self._channel, _common.encode(method),
request_serializer,
self._loop)
def unary_stream(
- self,
- method: str,
- request_serializer: Optional[SerializingFunction] = None,
- response_deserializer: Optional[DeserializingFunction] = None
+ self,
+ method: str,
+ request_serializer: Optional[SerializingFunction] = None,
+ response_deserializer: Optional[DeserializingFunction] = None
) -> UnaryStreamMultiCallable:
return UnaryStreamMultiCallable(self._channel, _common.encode(method),
request_serializer,
self._loop)
def stream_unary(
- self,
- method: str,
- request_serializer: Optional[SerializingFunction] = None,
- response_deserializer: Optional[DeserializingFunction] = None
+ self,
+ method: str,
+ request_serializer: Optional[SerializingFunction] = None,
+ response_deserializer: Optional[DeserializingFunction] = None
) -> StreamUnaryMultiCallable:
return StreamUnaryMultiCallable(self._channel, _common.encode(method),
request_serializer,
self._loop)
def stream_stream(
- self,
- method: str,
- request_serializer: Optional[SerializingFunction] = None,
- response_deserializer: Optional[DeserializingFunction] = None
+ self,
+ method: str,
+ request_serializer: Optional[SerializingFunction] = None,
+ response_deserializer: Optional[DeserializingFunction] = None
) -> StreamStreamMultiCallable:
return StreamStreamMultiCallable(self._channel, _common.encode(method),
request_serializer,
@abstractmethod
async def intercept_service(
- self, continuation: Callable[[grpc.HandlerCallDetails], Awaitable[
- grpc.RpcMethodHandler]],
+ self, continuation: Callable[[grpc.HandlerCallDetails],
+ Awaitable[grpc.RpcMethodHandler]],
handler_call_details: grpc.HandlerCallDetails
) -> grpc.RpcMethodHandler:
"""Intercepts incoming RPCs before handing them over to a handler.
@abstractmethod
async def intercept_stream_unary(
- self,
- continuation: Callable[[ClientCallDetails, RequestType],
- UnaryStreamCall],
- client_call_details: ClientCallDetails,
- request_iterator: RequestIterableType,
+ self,
+ continuation: Callable[[ClientCallDetails, RequestType],
+ UnaryStreamCall],
+ client_call_details: ClientCallDetails,
+ request_iterator: RequestIterableType,
) -> StreamUnaryCall:
"""Intercepts a stream-unary invocation asynchronously.
@abstractmethod
async def intercept_stream_stream(
- self,
- continuation: Callable[[ClientCallDetails, RequestType],
- UnaryStreamCall],
- client_call_details: ClientCallDetails,
- request_iterator: RequestIterableType,
+ self,
+ continuation: Callable[[ClientCallDetails, RequestType],
+ UnaryStreamCall],
+ client_call_details: ClientCallDetails,
+ request_iterator: RequestIterableType,
) -> Union[ResponseIterableType, StreamStreamCall]:
"""Intercepts a stream-stream invocation asynchronously.
def __del__(self):
self.cancel()
- def _fire_or_add_pending_done_callbacks(self,
- interceptors_task: asyncio.Task
- ) -> None:
+ def _fire_or_add_pending_done_callbacks(
+ self, interceptors_task: asyncio.Task) -> None:
if not self._pending_add_done_callbacks:
return
# consumed a logging warning is emmited by Asyncio.
self._response_aiter = None
- async def _wait_for_interceptor_task_response_iterator(self
- ) -> ResponseType:
+ async def _wait_for_interceptor_task_response_iterator(
+ self) -> ResponseType:
call = await self._interceptors_task
async for response in call:
yield response
super().__init__(interceptors_task)
# pylint: disable=too-many-arguments
- async def _invoke(self, interceptors: Sequence[UnaryUnaryClientInterceptor],
- method: bytes, timeout: Optional[float],
- metadata: Optional[Metadata],
- credentials: Optional[grpc.CallCredentials],
- wait_for_ready: Optional[bool], request: RequestType,
- request_serializer: SerializingFunction,
- response_deserializer: DeserializingFunction
- ) -> UnaryUnaryCall:
+ async def _invoke(
+ self, interceptors: Sequence[UnaryUnaryClientInterceptor],
+ method: bytes, timeout: Optional[float],
+ metadata: Optional[Metadata],
+ credentials: Optional[grpc.CallCredentials],
+ wait_for_ready: Optional[bool], request: RequestType,
+ request_serializer: SerializingFunction,
+ response_deserializer: DeserializingFunction) -> UnaryUnaryCall:
"""Run the RPC call wrapped in interceptors"""
async def _run_interceptor(
super().__init__(interceptors_task)
# pylint: disable=too-many-arguments
- async def _invoke(self, interceptors: Sequence[UnaryUnaryClientInterceptor],
- method: bytes, timeout: Optional[float],
- metadata: Optional[Metadata],
- credentials: Optional[grpc.CallCredentials],
- wait_for_ready: Optional[bool], request: RequestType,
- request_serializer: SerializingFunction,
- response_deserializer: DeserializingFunction
- ) -> UnaryStreamCall:
+ async def _invoke(
+ self, interceptors: Sequence[UnaryUnaryClientInterceptor],
+ method: bytes, timeout: Optional[float],
+ metadata: Optional[Metadata],
+ credentials: Optional[grpc.CallCredentials],
+ wait_for_ready: Optional[bool], request: RequestType,
+ request_serializer: SerializingFunction,
+ response_deserializer: DeserializingFunction) -> UnaryStreamCall:
"""Run the RPC call wrapped in interceptors"""
async def _run_interceptor(
- interceptors: Iterator[UnaryStreamClientInterceptor],
- client_call_details: ClientCallDetails,
- request: RequestType,
+ interceptors: Iterator[UnaryStreamClientInterceptor],
+ client_call_details: ClientCallDetails,
+ request: RequestType,
) -> _base_call.UnaryUnaryCall:
interceptor = next(interceptors, None)
"""Run the RPC call wrapped in interceptors"""
async def _run_interceptor(
- interceptors: Iterator[UnaryUnaryClientInterceptor],
- client_call_details: ClientCallDetails,
- request_iterator: RequestIterableType
+ interceptors: Iterator[UnaryUnaryClientInterceptor],
+ client_call_details: ClientCallDetails,
+ request_iterator: RequestIterableType
) -> _base_call.StreamUnaryCall:
interceptor = next(interceptors, None)
"""Run the RPC call wrapped in interceptors"""
async def _run_interceptor(
- interceptors: Iterator[StreamStreamClientInterceptor],
- client_call_details: ClientCallDetails,
- request_iterator: RequestIterableType
+ interceptors: Iterator[StreamStreamClientInterceptor],
+ client_call_details: ClientCallDetails,
+ request_iterator: RequestIterableType
) -> _base_call.StreamStreamCall:
interceptor = next(interceptors, None)
_call: Union[_base_call.UnaryStreamCall, _base_call.StreamStreamCall]
_response_iterator: AsyncIterable[ResponseType]
- def __init__(self, call: Union[_base_call.UnaryStreamCall, _base_call.
- StreamStreamCall],
+ def __init__(self, call: Union[_base_call.UnaryStreamCall,
+ _base_call.StreamStreamCall],
response_iterator: AsyncIterable[ResponseType]) -> None:
self._response_iterator = response_iterator
self._call = call
import warnings
import grpc
+from grpc._cython import cygrpc as _cygrpc
_EXPERIMENTAL_APIS_USED = set()
"""Raised by the gRPC library to indicate usage not allowed by the API."""
-_insecure_channel_credentials_sentinel = object()
+# It's important that there be a single insecure credentials object so that its
+# hash is deterministic and can be used for indexing in the simple stubs cache.
_insecure_channel_credentials = grpc.ChannelCredentials(
- _insecure_channel_credentials_sentinel)
+ _cygrpc.channel_credentials_insecure())
def insecure_channel_credentials():
"""Creates a ChannelCredentials for use with an insecure channel.
THIS IS AN EXPERIMENTAL API.
-
- This is not for use with secure_channel function. Intead, this should be
- used with grpc.unary_unary, grpc.unary_stream, grpc.stream_unary, or
- grpc.stream_stream.
"""
return _insecure_channel_credentials
'src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc',
'src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc',
'src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc',
+ 'src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc',
'src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc',
'src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc',
'src/core/ext/filters/client_channel/resolver_registry.cc',
'src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c',
'src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c',
'src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c',
+ 'src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c',
'src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c',
'src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c',
'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c',
'src/core/ext/upb-generated/udpa/annotations/status.upb.c',
'src/core/ext/upb-generated/udpa/annotations/versioning.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/authority.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/resource.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c',
- 'src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c',
'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c',
'src/core/ext/upb-generated/validate/validate.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/authority.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/context_params.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/resource.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c',
+ 'src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c',
'src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c',
'src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c',
'src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c',
'src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c',
'src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c',
- 'src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c',
'src/core/ext/upbdefs-generated/validate/validate.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c',
+ 'src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c',
'src/core/ext/xds/certificate_provider_registry.cc',
'src/core/ext/xds/certificate_provider_store.cc',
'src/core/ext/xds/file_watcher_certificate_provider_factory.cc',
'src/core/lib/gprpp/stat_windows.cc',
'src/core/lib/gprpp/thd_posix.cc',
'src/core/lib/gprpp/thd_windows.cc',
+ 'src/core/lib/gprpp/time_util.cc',
'src/core/lib/http/format_request.cc',
'src/core/lib/http/httpcli.cc',
'src/core/lib/http/httpcli_security_connector.cc',
'src/core/lib/profiling/stap_timers.cc',
'src/core/lib/security/authorization/authorization_engine.cc',
'src/core/lib/security/authorization/evaluate_args.cc',
+ 'src/core/lib/security/authorization/matchers.cc',
'src/core/lib/security/context/security_context.cc',
'src/core/lib/security/credentials/alts/alts_credentials.cc',
'src/core/lib/security/credentials/alts/check_gcp_environment.cc',
'third_party/boringssl-with-bazel/src/crypto/bio/printf.c',
'third_party/boringssl-with-bazel/src/crypto/bio/socket.c',
'third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c',
+ 'third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c',
'third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c',
'third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c',
'third_party/boringssl-with-bazel/src/crypto/buf/buf.c',
'third_party/boringssl-with-bazel/src/crypto/conf/conf.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c',
+ 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-arm.c',
'third_party/boringssl-with-bazel/src/crypto/cpu-intel.c',
'third_party/boringssl-with-bazel/src/crypto/crypto.c',
'third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c',
'third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c',
- 'third_party/boringssl-with-bazel/src/crypto/dh/check.c',
- 'third_party/boringssl-with-bazel/src/crypto/dh/dh.c',
- 'third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c',
- 'third_party/boringssl-with-bazel/src/crypto/dh/params.c',
+ 'third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c',
+ 'third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c',
'third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c',
'third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c',
'third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c',
+ 'third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c',
'third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c',
'third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c',
'third_party/boringssl-with-bazel/mac-x86_64/crypto/fipsmodule/x86_64-mont5.S',
'third_party/boringssl-with-bazel/mac-x86_64/crypto/test/trampoline-x86_64.S',
],
+ 'crypto_win_aarch64': [
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/chacha/chacha-armv8.S',
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/aesv8-armx64.S',
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/armv8-mont.S',
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/ghash-neon-armv8.S',
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/ghashv8-armx64.S',
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/sha1-armv8.S',
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/sha256-armv8.S',
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/sha512-armv8.S',
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/vpaes-armv8.S',
+ 'third_party/boringssl-with-bazel/win-aarch64/crypto/test/trampoline-armv8.S',
+ ],
'crypto_win_x86': [
'third_party/boringssl-with-bazel/win-x86/crypto/chacha/chacha-x86.asm',
'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/aesni-x86.asm',
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!!
-VERSION = '1.35.0'
+VERSION = '1.36.0'
"""AsyncIO servicer for handling RPCs for service statuses."""
@staticmethod
- async def GetTopChannels(request: _channelz_pb2.GetTopChannelsRequest,
- context: aio.ServicerContext
- ) -> _channelz_pb2.GetTopChannelsResponse:
+ async def GetTopChannels(
+ request: _channelz_pb2.GetTopChannelsRequest,
+ context: aio.ServicerContext
+ ) -> _channelz_pb2.GetTopChannelsResponse:
return _SyncChannelzServicer.GetTopChannels(request, context)
@staticmethod
- async def GetServers(request: _channelz_pb2.GetServersRequest,
- context: aio.ServicerContext
- ) -> _channelz_pb2.GetServersResponse:
+ async def GetServers(
+ request: _channelz_pb2.GetServersRequest,
+ context: aio.ServicerContext) -> _channelz_pb2.GetServersResponse:
return _SyncChannelzServicer.GetServers(request, context)
@staticmethod
- async def GetServer(request: _channelz_pb2.GetServerRequest,
- context: aio.ServicerContext
- ) -> _channelz_pb2.GetServerResponse:
+ async def GetServer(
+ request: _channelz_pb2.GetServerRequest,
+ context: aio.ServicerContext) -> _channelz_pb2.GetServerResponse:
return _SyncChannelzServicer.GetServer(request, context)
@staticmethod
- async def GetServerSockets(request: _channelz_pb2.GetServerSocketsRequest,
- context: aio.ServicerContext
- ) -> _channelz_pb2.GetServerSocketsResponse:
+ async def GetServerSockets(
+ request: _channelz_pb2.GetServerSocketsRequest,
+ context: aio.ServicerContext
+ ) -> _channelz_pb2.GetServerSocketsResponse:
return _SyncChannelzServicer.GetServerSockets(request, context)
@staticmethod
- async def GetChannel(request: _channelz_pb2.GetChannelRequest,
- context: aio.ServicerContext
- ) -> _channelz_pb2.GetChannelResponse:
+ async def GetChannel(
+ request: _channelz_pb2.GetChannelRequest,
+ context: aio.ServicerContext) -> _channelz_pb2.GetChannelResponse:
return _SyncChannelzServicer.GetChannel(request, context)
@staticmethod
- async def GetSubchannel(request: _channelz_pb2.GetSubchannelRequest,
- context: aio.ServicerContext
- ) -> _channelz_pb2.GetSubchannelResponse:
+ async def GetSubchannel(
+ request: _channelz_pb2.GetSubchannelRequest,
+ context: aio.ServicerContext
+ ) -> _channelz_pb2.GetSubchannelResponse:
return _SyncChannelzServicer.GetSubchannel(request, context)
@staticmethod
- async def GetSocket(request: _channelz_pb2.GetSocketRequest,
- context: aio.ServicerContext
- ) -> _channelz_pb2.GetSocketResponse:
+ async def GetSocket(
+ request: _channelz_pb2.GetSocketRequest,
+ context: aio.ServicerContext) -> _channelz_pb2.GetSocketResponse:
return _SyncChannelzServicer.GetSocket(request, context)
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_channelz/grpc_version.py.template`!!!
-VERSION = '1.35.0'
+VERSION = '1.36.0'
if request.service in self._server_watchers:
del self._server_watchers[request.service]
- async def _set(self, service: str,
- status: _health_pb2.HealthCheckResponse.ServingStatus
- ) -> None:
+ async def _set(
+ self, service: str,
+ status: _health_pb2.HealthCheckResponse.ServingStatus) -> None:
if service in self._server_watchers:
condition = self._server_watchers.get(service)
async with condition:
else:
self._server_status[service] = status
- async def set(self, service: str,
- status: _health_pb2.HealthCheckResponse.ServingStatus
- ) -> None:
+ async def set(
+ self, service: str,
+ status: _health_pb2.HealthCheckResponse.ServingStatus) -> None:
"""Sets the status of a service.
Args:
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_health_checking/grpc_version.py.template`!!!
-VERSION = '1.35.0'
+VERSION = '1.36.0'
"""Servicer handling RPCs for service statuses."""
async def ServerReflectionInfo(
- self, request_iterator: AsyncIterable[
- _reflection_pb2.ServerReflectionRequest], unused_context
+ self, request_iterator: AsyncIterable[
+ _reflection_pb2.ServerReflectionRequest], unused_context
) -> AsyncIterable[_reflection_pb2.ServerReflectionResponse]:
async for request in request_iterator:
if request.HasField('file_by_filename'):
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_reflection/grpc_version.py.template`!!!
-VERSION = '1.35.0'
+VERSION = '1.36.0'
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_status/grpc_version.py.template`!!!
-VERSION = '1.35.0'
+VERSION = '1.36.0'
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_testing/grpc_version.py.template`!!!
-VERSION = '1.35.0'
+VERSION = '1.36.0'
# AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_tests/grpc_version.py.template`!!!
-VERSION = '1.35.0'
+VERSION = '1.36.0'
"unit._session_cache_test.SSLSessionCacheTest",
"unit._signal_handling_test.SignalHandlingTest",
"unit._version_test.VersionTest",
+ "unit._xds_credentials_test.XdsCredentialsTest",
"unit.beta._beta_features_test.BetaFeaturesTest",
"unit.beta._beta_features_test.ContextManagementAndLifecycleTest",
"unit.beta._connectivity_channel_test.ConnectivityStatesTest",
"_server_shutdown_test.py",
"_server_wait_for_termination_test.py",
"_session_cache_test.py",
+ "_xds_credentials_test.py",
]
py_library(
test_constants.THREAD_CONCURRENCY)
server_completion_queue = cygrpc.CompletionQueue()
- server = cygrpc.Server([
- (
- b'grpc.so_reuseport',
- 0,
- ),
- ])
+ server = cygrpc.Server([(
+ b'grpc.so_reuseport',
+ 0,
+ )], False)
server.register_completion_queue(server_completion_queue)
port = server.add_http2_port(b'[::]:0')
server.start()
def setUp(self):
self.server_completion_queue = cygrpc.CompletionQueue()
- self.server = cygrpc.Server([(b'grpc.so_reuseport', 0)])
+ self.server = cygrpc.Server([(b'grpc.so_reuseport', 0)], False)
self.server.register_completion_queue(self.server_completion_queue)
port = self.server.add_http2_port(b'[::]:0')
self.server.start()
server = cygrpc.Server([(
b'grpc.so_reuseport',
0,
- )])
+ )], False)
server.register_completion_queue(server_completion_queue)
port = server.add_http2_port(b'[::]:0')
server.start()
def test_lonely_server(self):
server_call_completion_queue = cygrpc.CompletionQueue()
server_shutdown_completion_queue = cygrpc.CompletionQueue()
- server = cygrpc.Server(None)
+ server = cygrpc.Server(None, False)
server.register_completion_queue(server_call_completion_queue)
server.register_completion_queue(server_shutdown_completion_queue)
port = server.add_http2_port(b'[::]:0')
del completion_queue
def testServerUpDown(self):
- server = cygrpc.Server(set([
- (
- b'grpc.so_reuseport',
- 0,
- ),
- ]))
+ server = cygrpc.Server(set([(
+ b'grpc.so_reuseport',
+ 0,
+ )]), False)
del server
def testChannelUpDown(self):
b'test plugin name!')
def testServerStartNoExplicitShutdown(self):
- server = cygrpc.Server([
- (
- b'grpc.so_reuseport',
- 0,
- ),
- ])
+ server = cygrpc.Server([(
+ b'grpc.so_reuseport',
+ 0,
+ )], False)
completion_queue = cygrpc.CompletionQueue()
server.register_completion_queue(completion_queue)
port = server.add_http2_port(b'[::]:0')
b'grpc.so_reuseport',
0,
),
- ])
+ ], False)
server.add_http2_port(b'[::]:0')
server.register_completion_queue(completion_queue)
server.start()
def setUpMixin(self, server_credentials, client_credentials, host_override):
self.server_completion_queue = cygrpc.CompletionQueue()
- self.server = cygrpc.Server([
- (
- b'grpc.so_reuseport',
- 0,
- ),
- ])
+ self.server = cygrpc.Server([(
+ b'grpc.so_reuseport',
+ 0,
+ )], False)
self.server.register_completion_queue(self.server_completion_queue)
if server_credentials:
self.port = self.server.add_http2_port(b'[::]:0',
--- /dev/null
+# Copyright 2021 The 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.
+"""Tests xDS server and channel credentials."""
+
+import unittest
+
+import logging
+from concurrent import futures
+import contextlib
+
+import grpc
+import grpc.experimental
+from tests.unit import test_common
+from tests.unit import resources
+
+
+class _GenericHandler(grpc.GenericRpcHandler):
+
+ def service(self, handler_call_details):
+ return grpc.unary_unary_rpc_method_handler(
+ lambda request, unused_context: request)
+
+
+@contextlib.contextmanager
+def xds_channel_server_without_xds(server_fallback_creds):
+ server = grpc.server(futures.ThreadPoolExecutor())
+ server.add_generic_rpc_handlers((_GenericHandler(),))
+ server_server_fallback_creds = grpc.ssl_server_credentials(
+ ((resources.private_key(), resources.certificate_chain()),))
+ server_creds = grpc.xds_server_credentials(server_fallback_creds)
+ port = server.add_secure_port("localhost:0", server_creds)
+ server.start()
+ try:
+ yield "localhost:{}".format(port)
+ finally:
+ server.stop(None)
+
+
+class XdsCredentialsTest(unittest.TestCase):
+
+ def test_xds_creds_fallback_ssl(self):
+ # Since there is no xDS server, the fallback credentials will be used.
+ # In this case, SSL credentials.
+ server_fallback_creds = grpc.ssl_server_credentials(
+ ((resources.private_key(), resources.certificate_chain()),))
+ with xds_channel_server_without_xds(
+ server_fallback_creds) as server_address:
+ override_options = (("grpc.ssl_target_name_override",
+ "foo.test.google.fr"),)
+ channel_fallback_creds = grpc.ssl_channel_credentials(
+ root_certificates=resources.test_root_certificates(),
+ private_key=resources.private_key(),
+ certificate_chain=resources.certificate_chain())
+ channel_creds = grpc.xds_channel_credentials(channel_fallback_creds)
+ with grpc.secure_channel(server_address,
+ channel_creds,
+ options=override_options) as channel:
+ request = b"abc"
+ response = channel.unary_unary("/test/method")(
+ request, wait_for_ready=True)
+ self.assertEqual(response, request)
+
+ def test_xds_creds_fallback_insecure(self):
+ # Since there is no xDS server, the fallback credentials will be used.
+ # In this case, insecure.
+ server_fallback_creds = grpc.insecure_server_credentials()
+ with xds_channel_server_without_xds(
+ server_fallback_creds) as server_address:
+ channel_fallback_creds = grpc.experimental.insecure_channel_credentials(
+ )
+ channel_creds = grpc.xds_channel_credentials(channel_fallback_creds)
+ with grpc.secure_channel(server_address, channel_creds) as channel:
+ request = b"abc"
+ response = channel.unary_unary("/test/method")(
+ request, wait_for_ready=True)
+ self.assertEqual(response, request)
+
+ def test_start_xds_server(self):
+ server = grpc.server(futures.ThreadPoolExecutor(), xds=True)
+ server.add_generic_rpc_handlers((_GenericHandler(),))
+ server_fallback_creds = grpc.insecure_server_credentials()
+ server_creds = grpc.xds_server_credentials(server_fallback_creds)
+ port = server.add_secure_port("localhost:0", server_creds)
+ server.start()
+ server.stop(None)
+ # No exceptions thrown. A more comprehensive suite of tests will be
+ # provided by the interop tests.
+
+
+if __name__ == "__main__":
+ logging.basicConfig()
+ unittest.main()
return server, port
-def _get_client_status(start_time: float, end_time: float,
- qps_data: histogram.Histogram
- ) -> control_pb2.ClientStatus:
+def _get_client_status(
+ start_time: float, end_time: float,
+ qps_data: histogram.Histogram) -> control_pb2.ClientStatus:
"""Creates ClientStatus proto message."""
latencies = qps_data.get_data()
end_time = time.monotonic()
return control_pb2.ClientStatus(stats=stats)
-def _create_client(server: str, config: control_pb2.ClientConfig,
- qps_data: histogram.Histogram
- ) -> benchmark_client.BenchmarkClient:
+def _create_client(
+ server: str, config: control_pb2.ClientConfig,
+ qps_data: histogram.Histogram) -> benchmark_client.BenchmarkClient:
"""Creates a client object according to the ClientConfig."""
if config.load_params.WhichOneof('load') != 'closed_loop':
raise NotImplementedError(
await self._run_single_server(config, request_iterator, context)
else:
# If server_processes > 1, offload to other processes.
- sub_workers = await asyncio.gather(*(
- _create_sub_worker() for _ in range(config.server_processes)))
+ sub_workers = await asyncio.gather(
+ *[_create_sub_worker() for _ in range(config.server_processes)])
calls = [worker.stub.RunServer() for worker in sub_workers]
await self._run_single_client(config, request_iterator, context)
else:
# If client_processes > 1, offload the work to other processes.
- sub_workers = await asyncio.gather(*(
- _create_sub_worker() for _ in range(config.client_processes)))
+ sub_workers = await asyncio.gather(
+ *[_create_sub_worker() for _ in range(config.client_processes)])
calls = [worker.stub.RunClient() for worker in sub_workers]
await _expect_status_details(call, expected_details)
-def _validate_payload_type_and_length(
- response: Union[messages_pb2.SimpleResponse, messages_pb2.
- StreamingOutputCallResponse], expected_type: Any,
- expected_length: int) -> None:
+def _validate_payload_type_and_length(response: Union[
+ messages_pb2.SimpleResponse, messages_pb2.StreamingOutputCallResponse],
+ expected_type: Any,
+ expected_length: int) -> None:
if response.payload.type is not expected_type:
raise ValueError('expected payload type %s, got %s' %
(expected_type, type(response.payload.type)))
async def _large_unary_common_behavior(
- stub: test_pb2_grpc.TestServiceStub, fill_username: bool,
- fill_oauth_scope: bool, call_credentials: Optional[grpc.CallCredentials]
+ stub: test_pb2_grpc.TestServiceStub, fill_username: bool,
+ fill_oauth_scope: bool, call_credentials: Optional[grpc.CallCredentials]
) -> messages_pb2.SimpleResponse:
size = 314159
request = messages_pb2.SimpleRequest(
}
-async def test_interoperability(case: TestCase,
- stub: test_pb2_grpc.TestServiceStub,
- args: Optional[argparse.Namespace] = None
- ) -> None:
+async def test_interoperability(
+ case: TestCase,
+ stub: test_pb2_grpc.TestServiceStub,
+ args: Optional[argparse.Namespace] = None) -> None:
method = _TEST_CASE_IMPLEMENTATION_MAPPING.get(case)
if method is None:
raise NotImplementedError(f'Test case "{case}" not implemented!')
self.record = record
async def intercept_service(
- self, continuation: Callable[[grpc.HandlerCallDetails], Awaitable[
- grpc.RpcMethodHandler]],
+ self, continuation: Callable[[grpc.HandlerCallDetails],
+ Awaitable[grpc.RpcMethodHandler]],
handler_call_details: grpc.HandlerCallDetails
) -> grpc.RpcMethodHandler:
self.record.append(self.tag + ':intercept_service')
class _GenericInterceptor(aio.ServerInterceptor):
- def __init__(self, fn: Callable[[
- Callable[[grpc.HandlerCallDetails], Awaitable[grpc.
- RpcMethodHandler]],
- grpc.HandlerCallDetails
- ], Any]) -> None:
+ def __init__(
+ self, fn: Callable[[
+ Callable[[grpc.HandlerCallDetails],
+ Awaitable[grpc.RpcMethodHandler]], grpc.HandlerCallDetails
+ ], Any]
+ ) -> None:
self._fn = fn
async def intercept_service(
- self, continuation: Callable[[grpc.HandlerCallDetails], Awaitable[
- grpc.RpcMethodHandler]],
+ self, continuation: Callable[[grpc.HandlerCallDetails],
+ Awaitable[grpc.RpcMethodHandler]],
handler_call_details: grpc.HandlerCallDetails
) -> grpc.RpcMethodHandler:
return await self._fn(continuation, handler_call_details)
-def _filter_server_interceptor(condition: Callable,
- interceptor: aio.ServerInterceptor
- ) -> aio.ServerInterceptor:
+def _filter_server_interceptor(
+ condition: Callable,
+ interceptor: aio.ServerInterceptor) -> aio.ServerInterceptor:
async def intercept_service(
- continuation: Callable[[grpc.HandlerCallDetails], Awaitable[
- grpc.RpcMethodHandler]],
+ continuation: Callable[[grpc.HandlerCallDetails],
+ Awaitable[grpc.RpcMethodHandler]],
handler_call_details: grpc.HandlerCallDetails
) -> grpc.RpcMethodHandler:
if condition(handler_call_details):
self.cache_store = cache_store or {}
async def intercept_service(
- self, continuation: Callable[[grpc.HandlerCallDetails], Awaitable[
- grpc.RpcMethodHandler]],
+ self, continuation: Callable[[grpc.HandlerCallDetails],
+ Awaitable[grpc.RpcMethodHandler]],
handler_call_details: grpc.HandlerCallDetails
) -> grpc.RpcMethodHandler:
# Get the actual handler
return handler
def wrapper(behavior: Callable[
- [messages_pb2.SimpleRequest, aio.
- ServicerContext], messages_pb2.SimpleResponse]):
+ [messages_pb2.SimpleRequest, aio.ServicerContext],
+ messages_pb2.SimpleResponse]):
@functools.wraps(behavior)
- async def wrapper(request: messages_pb2.SimpleRequest,
- context: aio.ServicerContext
- ) -> messages_pb2.SimpleResponse:
+ async def wrapper(
+ request: messages_pb2.SimpleRequest,
+ context: aio.ServicerContext
+ ) -> messages_pb2.SimpleResponse:
if request.response_size not in self.cache_store:
self.cache_store[request.response_size] = await behavior(
request, context)
async def _create_server_stub_pair(
- *interceptors: aio.ServerInterceptor
+ *interceptors: aio.ServerInterceptor
) -> Tuple[aio.Server, test_pb2_grpc.TestServiceStub]:
"""Creates a server-stub pair with given interceptors.
self._rpcs_needed -= 1
self._condition.notify()
- def await_rpc_stats_response(self, timeout_sec: int
- ) -> messages_pb2.LoadBalancerStatsResponse:
+ def await_rpc_stats_response(
+ self, timeout_sec: int) -> messages_pb2.LoadBalancerStatsResponse:
"""Blocks until a full response has been collected."""
with self._condition:
self._condition.wait_for(lambda: not self._rpcs_needed,
_global_rpcs_succeeded: Mapping[str, int] = collections.defaultdict(int)
_global_rpcs_failed: Mapping[str, int] = collections.defaultdict(int)
+# Mapping[method, Mapping[status_code, count]]
+_global_rpc_statuses: Mapping[str, Mapping[int, int]] = collections.defaultdict(
+ lambda: collections.defaultdict(int))
+
def _handle_sigint(sig, frame) -> None:
_stop_event.set()
def __init__(self):
super(_LoadBalancerStatsServicer).__init__()
- def GetClientStats(self, request: messages_pb2.LoadBalancerStatsRequest,
- context: grpc.ServicerContext
- ) -> messages_pb2.LoadBalancerStatsResponse:
+ def GetClientStats(
+ self, request: messages_pb2.LoadBalancerStatsRequest,
+ context: grpc.ServicerContext
+ ) -> messages_pb2.LoadBalancerStatsResponse:
logger.info("Received stats request.")
start = None
end = None
return response
def GetClientAccumulatedStats(
- self, request: messages_pb2.LoadBalancerAccumulatedStatsRequest,
- context: grpc.ServicerContext
+ self, request: messages_pb2.LoadBalancerAccumulatedStatsRequest,
+ context: grpc.ServicerContext
) -> messages_pb2.LoadBalancerAccumulatedStatsResponse:
logger.info("Received cumulative stats request.")
response = messages_pb2.LoadBalancerAccumulatedStatsResponse()
caps_method] = _global_rpcs_succeeded[method]
response.num_rpcs_failed_by_method[
caps_method] = _global_rpcs_failed[method]
+ response.stats_per_method[
+ caps_method].rpcs_started = _global_rpcs_started[method]
+ for code, count in _global_rpc_statuses[method].items():
+ response.stats_per_method[caps_method].result[code] = count
logger.info("Returning cumulative stats response.")
return response
def _start_rpc(method: str, metadata: Sequence[Tuple[str, str]],
request_id: int, stub: test_pb2_grpc.TestServiceStub,
- timeout: float,
- futures: Mapping[int, Tuple[grpc.Future, str]]) -> None:
+ timeout: float, futures: Mapping[int, Tuple[grpc.Future,
+ str]]) -> None:
logger.info(f"Sending {method} request to backend: {request_id}")
if method == "UnaryCall":
future = stub.UnaryCall.future(messages_pb2.SimpleRequest(),
print_response: bool) -> None:
exception = future.exception()
hostname = ""
+ _global_rpc_statuses[method][future.code().value[0]] += 1
if exception is not None:
with _global_lock:
_global_rpcs_failed[method] += 1
When accessing any of its members, the lock member should be held.
"""
- def __init__(self, method: str, metadata: Sequence[Tuple[str, str]],
- qps: int, server: str, rpc_timeout_sec: int,
- print_response: bool):
+ def __init__(self, method: str, metadata: Sequence[Tuple[str,
+ str]], qps: int,
+ server: str, rpc_timeout_sec: int, print_response: bool):
# condition is signalled when a change is made to the config.
self.condition = threading.Condition()
self._per_method_configs = per_method_configs
self._qps = qps
- def Configure(self, request: messages_pb2.ClientConfigureRequest,
- context: grpc.ServicerContext
- ) -> messages_pb2.ClientConfigureResponse:
+ def Configure(
+ self, request: messages_pb2.ClientConfigureRequest,
+ context: grpc.ServicerContext
+ ) -> messages_pb2.ClientConfigureResponse:
logger.info("Received Configure RPC: %s", request)
method_strs = (_METHOD_ENUM_TO_STR[t] for t in request.types)
for method in _SUPPORTED_METHODS:
method_enum = _METHOD_STR_TO_ENUM[method]
+ channel_config = self._per_method_configs[method]
if method in method_strs:
qps = self._qps
metadata = ((md.key, md.value)
for md in request.metadata
if md.type == method_enum)
+ # For backward compatibility, do not change timeout when we
+ # receive a default value timeout.
+ if request.timeout_sec == 0:
+ timeout_sec = channel_config.rpc_timeout_sec
+ else:
+ timeout_sec = request.timeout_sec
else:
qps = 0
metadata = ()
- channel_config = self._per_method_configs[method]
+ # Leave timeout unchanged for backward compatibility.
+ timeout_sec = channel_config.rpc_timeout_sec
with channel_config.condition:
channel_config.qps = qps
channel_config.metadata = list(metadata)
+ channel_config.rpc_timeout_sec = timeout_sec
channel_config.condition.notify_all()
return messages_pb2.ClientConfigureResponse()
# GRPC contains the General RPC module.
module GRPC
- VERSION = '1.35.0'
+ VERSION = '1.36.0'
end
map :num_rpcs_started_by_method, :string, :int32, 1
map :num_rpcs_succeeded_by_method, :string, :int32, 2
map :num_rpcs_failed_by_method, :string, :int32, 3
+ map :stats_per_method, :string, :message, 4, "grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats"
+ end
+ add_message "grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats" do
+ optional :rpcs_started, :int32, 1
+ map :result, :int32, :int32, 2
end
add_message "grpc.testing.ClientConfigureRequest" do
repeated :types, :enum, 1, "grpc.testing.ClientConfigureRequest.RpcType"
repeated :metadata, :message, 2, "grpc.testing.ClientConfigureRequest.Metadata"
+ optional :timeout_sec, :int32, 3
end
add_message "grpc.testing.ClientConfigureRequest.Metadata" do
optional :type, :enum, 1, "grpc.testing.ClientConfigureRequest.RpcType"
LoadBalancerStatsResponse::RpcsByPeer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsResponse.RpcsByPeer").msgclass
LoadBalancerAccumulatedStatsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerAccumulatedStatsRequest").msgclass
LoadBalancerAccumulatedStatsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerAccumulatedStatsResponse").msgclass
+ LoadBalancerAccumulatedStatsResponse::MethodStats = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats").msgclass
ClientConfigureRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientConfigureRequest").msgclass
ClientConfigureRequest::Metadata = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientConfigureRequest.Metadata").msgclass
ClientConfigureRequest::RpcType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientConfigureRequest.RpcType").enummodule
map :num_rpcs_started_by_method, :string, :int32, 1
map :num_rpcs_succeeded_by_method, :string, :int32, 2
map :num_rpcs_failed_by_method, :string, :int32, 3
+ map :stats_per_method, :string, :message, 4, "grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats"
+ end
+ add_message "grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats" do
+ optional :rpcs_started, :int32, 1
+ map :result, :int32, :int32, 2
end
add_message "grpc.testing.ClientConfigureRequest" do
repeated :types, :enum, 1, "grpc.testing.ClientConfigureRequest.RpcType"
repeated :metadata, :message, 2, "grpc.testing.ClientConfigureRequest.Metadata"
+ optional :timeout_sec, :int32, 3
end
add_message "grpc.testing.ClientConfigureRequest.Metadata" do
optional :type, :enum, 1, "grpc.testing.ClientConfigureRequest.RpcType"
LoadBalancerStatsResponse::RpcsByPeer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsResponse.RpcsByPeer").msgclass
LoadBalancerAccumulatedStatsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerAccumulatedStatsRequest").msgclass
LoadBalancerAccumulatedStatsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerAccumulatedStatsResponse").msgclass
+ LoadBalancerAccumulatedStatsResponse::MethodStats = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerAccumulatedStatsResponse.MethodStats").msgclass
ClientConfigureRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientConfigureRequest").msgclass
ClientConfigureRequest::Metadata = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientConfigureRequest.Metadata").msgclass
ClientConfigureRequest::RpcType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientConfigureRequest.RpcType").enummodule
module GRPC
module Tools
- VERSION = '1.35.0'
+ VERSION = '1.36.0'
end
end
"third_party/upb/upb/table.c",
"third_party/upb/upb/text_encode.c",
"third_party/upb/upb/upb.c",
- "src/core/ext/upb-generated/google/protobuf/any.upb.c",
"src/core/ext/upb-generated/google/protobuf/descriptor.upb.c",
- "src/core/ext/upb-generated/google/protobuf/duration.upb.c",
- "src/core/ext/upb-generated/google/protobuf/empty.upb.c",
- "src/core/ext/upb-generated/google/protobuf/struct.upb.c",
- "src/core/ext/upb-generated/google/protobuf/timestamp.upb.c",
- "src/core/ext/upb-generated/google/protobuf/wrappers.upb.c",
- "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c",
"src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c",
- "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c",
],
'headers': [
"third_party/upb/upb/decode_fast.h",
"third_party/upb/upb/upb.hpp",
"third_party/upb/upb/upb.int.h",
"third_party/upb/third_party/wyhash/wyhash.h",
- "src/core/ext/upb-generated/google/protobuf/any.upb.h",
"src/core/ext/upb-generated/google/protobuf/descriptor.upb.h",
- "src/core/ext/upb-generated/google/protobuf/duration.upb.h",
- "src/core/ext/upb-generated/google/protobuf/empty.upb.h",
- "src/core/ext/upb-generated/google/protobuf/struct.upb.h",
- "src/core/ext/upb-generated/google/protobuf/timestamp.upb.h",
- "src/core/ext/upb-generated/google/protobuf/wrappers.upb.h",
- "src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h",
"src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h",
- "src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h",
],
'secure': False,
}]
ss.header_mappings_dir = '.'
ss.dependency "#{s.name}/Interface", version
ss.dependency 'gRPC-Core', version
- abseil_version = '1.20200923.2'
+ abseil_version = '1.20200923.3'
% for abseil_spec in grpcpp_abseil_specs:
ss.dependency '${abseil_spec}', abseil_version
% endfor
end
s.prepare_command = <<-END_OF_COMMAND
- sed -E -i '' 's;#include <openssl/(.*)>;#if COCOAPODS==1\\\n #include <openssl_grpc/\\1>\\\n#else\\\n #include <openssl/\\1>\\\n#endif;g' $(find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print | xargs grep -H -c '#include <openssl_grpc/' | grep 0$ | cut -d':' -f1)
+ find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include <openssl/(.*)>;#if COCOAPODS==1\\\n #include <openssl_grpc/\\1>\\\n#else\\\n #include <openssl/\\1>\\\n#endif;g'
find third_party/upb/ -type f \\( -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include "third_party/(.*)";#if COCOAPODS==1\\\n #include "third_party/upb/third_party/\\1"\\\n#else\\\n #include "third_party/\\1"\\\n#endif;g'
find src/core/ src/cpp/ third_party/upb/ -type f \\( -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include "upb/(.*)";#if COCOAPODS==1\\\n #include "third_party/upb/upb/\\1"\\\n#else\\\n #include "upb/\\1"\\\n#endif;g'
find src/core/ src/cpp/ third_party/upb/ -type f -name '*.grpc_back' -print0 | xargs -0 rm
s.requires_arc = false
name = 'grpc'
- abseil_version = '1.20200923.2'
+ abseil_version = '1.20200923.3'
# When creating a dynamic framework, name it grpc.framework instead of gRPC-Core.framework.
# This lets users write their includes like `#include <grpc/grpc.h>` as opposed to `#include
ss.header_mappings_dir = '.'
ss.libraries = 'z'
ss.dependency "#{s.name}/Interface", version
- ss.dependency 'BoringSSL-GRPC', '0.0.14'
+ ss.dependency 'BoringSSL-GRPC', '0.0.16'
% for abseil_spec in grpc_abseil_specs:
ss.dependency '${abseil_spec}', abseil_version
% endfor
# TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path?
s.prepare_command = <<-END_OF_COMMAND
- sed -E -i '' 's;#include <openssl/(.*)>;#if COCOAPODS==1\\\n #include <openssl_grpc/\\1>\\\n#else\\\n #include <openssl/\\1>\\\n#endif;g' $(find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print | xargs grep -H -c '#include <openssl_grpc/' | grep 0$ | cut -d':' -f1)
+ find src/core -type f \\( -path '*.h' -or -path '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include <openssl/(.*)>;#if COCOAPODS==1\\\n #include <openssl_grpc/\\1>\\\n#else\\\n #include <openssl/\\1>\\\n#endif;g'
find third_party/upb/ -type f \\( -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include "third_party/(.*)";#if COCOAPODS==1\\\n #include "third_party/upb/third_party/\\1"\\\n#else\\\n #include "third_party/\\1"\\\n#endif;g'
find src/core/ src/cpp/ third_party/upb/ -type f \\( -name '*.h' -or -name '*.hpp' -or -name '*.c' -or -name '*.cc' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include "upb/(.*)";#if COCOAPODS==1\\\n #include "third_party/upb/upb/\\1"\\\n#else\\\n #include "upb/\\1"\\\n#endif;g'
find src/core/ src/cpp/ third_party/upb/ -type f -name '*.grpc_back' -print0 | xargs -0 rm
s.description = 'Send RPCs from Ruby using GRPC'
s.license = 'Apache-2.0'
- s.required_ruby_version = '>= 2.3.0'
+ s.required_ruby_version = '>= 2.4.0'
s.files = %w( Makefile .yardopts )
s.files += %w( etc/roots.pem )
Pod::Spec.new do |s|
s.name = 'BoringSSL-GRPC'
- version = '0.0.14'
+ version = '0.0.16'
s.version = version
s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.'
# Adapted from the homepage:
# Cloning from a local path sets RepositoryUrl to a path and breaks Source Link.
# Override RepositoryUrl to a URL to fix Source Link. The value doesn't matter.
- dotnet build --configuration Debug --output ./output/InteropTestsWebsite testassets/InteropTestsWebsite/InteropTestsWebsite.csproj -p:RepositoryUrl=https://github.com/grpc/grpc-dotnet.git
- dotnet build --configuration Debug --output ./output/InteropTestsClient testassets/InteropTestsClient/InteropTestsClient.csproj -p:RepositoryUrl=https://github.com/grpc/grpc-dotnet.git
+ dotnet build --configuration Debug --output ./output/InteropTestsWebsite testassets/InteropTestsWebsite/InteropTestsWebsite.csproj -p:RepositoryUrl=https://github.com/grpc/grpc-dotnet.git -p:LatestFramework=true
+ dotnet build --configuration Debug --output ./output/InteropTestsClient testassets/InteropTestsClient/InteropTestsClient.csproj -p:RepositoryUrl=https://github.com/grpc/grpc-dotnet.git -p:LatestFramework=true
Json& array = (*parsed_json.mutable_object())["channel"];
ValidateJsonArraySize(array, kNumChannels - kMidQuery + 1);
std::vector<intptr_t> uuids = GetUuidListFromArray(array.array_value());
- for (int i = 0; i < uuids.size(); ++i) {
+ for (size_t i = 0; i < uuids.size(); ++i) {
EXPECT_EQ(static_cast<intptr_t>(kMidQuery + i), uuids[i]);
}
}
Json& array = (*parsed_json.mutable_object())["channel"];
ValidateJsonArraySize(array, 10);
std::vector<intptr_t> uuids = GetUuidListFromArray(array.array_value());
- for (int i = 0; i < uuids.size(); ++i) {
+ for (size_t i = 0; i < uuids.size(); ++i) {
EXPECT_EQ(static_cast<intptr_t>(51 + i), uuids[i]);
}
}
const char* name() const override { return "fake1"; }
RefCountedPtr<Config> CreateCertificateProviderConfig(
- const Json& config_json, grpc_error** error) override {
+ const Json& /*config_json*/, grpc_error** /*error*/) override {
return nullptr;
}
RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
- RefCountedPtr<Config> config) override {
+ RefCountedPtr<Config> /*config*/) override {
return nullptr;
}
};
const char* name() const override { return "fake2"; }
RefCountedPtr<Config> CreateCertificateProviderConfig(
- const Json& config_json, grpc_error** error) override {
+ const Json& /*config_json*/, grpc_error** /*error*/) override {
return nullptr;
}
RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
- RefCountedPtr<Config> config) override {
+ RefCountedPtr<Config> /*config*/) override {
return nullptr;
}
};
#include "test/core/util/test_config.h"
constexpr int kMinResolutionPeriodMs = 1000;
-// Provide some slack when checking intervals, to allow for test timing issues.
-constexpr int kMinResolutionPeriodForCheckMs = 900;
extern grpc_address_resolver_vtable* grpc_resolve_address_impl;
static grpc_address_resolver_vtable* default_resolve_address;
} else {
grpc_millis now =
grpc_timespec_to_millis_round_up(gpr_now(GPR_CLOCK_MONOTONIC));
- GPR_ASSERT(now - last_resolution_time >= kMinResolutionPeriodForCheckMs);
+ GPR_ASSERT(now - last_resolution_time >= kMinResolutionPeriodMs);
last_resolution_time = now;
}
+ // For correct time diff comparisons, make sure that any subsequent calls
+ // to grpc_core::ExecCtx::Get()->Now() on this thread don't return a time
+ // which is earlier than that returned by the call(s) to
+ // gpr_now(GPR_CLOCK_MONOTONIC) within this function. This is important
+ // because the resolver's last_resolution_timestamp_ will be taken from
+ // grpc_core::ExecCtx::Get()->Now() right after this returns.
+ grpc_core::ExecCtx::Get()->InvalidateNow();
}
static grpc_error* test_blocking_resolve_address_impl(
gpr_log(GPR_DEBUG,
"last_resolution_time:%" PRId64 " now:%" PRId64
" min_time_between:%d",
- last_resolution_time, now, kMinResolutionPeriodForCheckMs);
+ last_resolution_time, now, kMinResolutionPeriodMs);
if (last_resolution_time == 0) {
last_resolution_time =
grpc_timespec_to_millis_round_up(gpr_now(GPR_CLOCK_MONOTONIC));
} else {
- GPR_ASSERT(now - last_resolution_time >= kMinResolutionPeriodForCheckMs);
+ GPR_ASSERT(now - last_resolution_time >= kMinResolutionPeriodMs);
last_resolution_time = now;
}
+ // For correct time diff comparisons, make sure that any subsequent calls
+ // to grpc_core::ExecCtx::Get()->Now() on this thread don't return a time
+ // which is earlier than that returned by the call(s) to
+ // gpr_now(GPR_CLOCK_MONOTONIC) within this function. This is important
+ // because the resolver's last_resolution_timestamp_ will be taken from
+ // grpc_core::ExecCtx::Get()->Now() right after this returns.
+ grpc_core::ExecCtx::Get()->InvalidateNow();
return result;
}
void cq_maybe_expect_completion(cq_verifier* v, const char* file, int line,
void* tag, bool success, bool* seen) {
- v->maybe_expectations.emplace_back(file, line, GRPC_OP_COMPLETE, tag, true,
- true, seen);
+ v->maybe_expectations.emplace_back(file, line, GRPC_OP_COMPLETE, tag,
+ true /* check_success */, success, seen);
}
static void add(cq_verifier* v, const char* file, int line,
*
*/
+#include <inttypes.h>
#include <unistd.h>
#include "absl/strings/str_format.h"
grpc_channel_args* /*client_args*/, grpc_channel_args* /*server_args*/) {
grpc_end2end_test_fixture f =
grpc_end2end_local_chttp2_create_fixture_fullstack();
+ gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME);
static_cast<grpc_end2end_local_fullstack_fixture_data*>(f.fixture_data)
- ->localaddr = absl::StrFormat("unix:/tmp/grpc_fullstack_test.%d.%d",
- getpid(), unique++);
+ ->localaddr = absl::StrFormat(
+ "unix:/tmp/grpc_fullstack_test.%d.%" PRId64 ".%" PRId32 ".%d", getpid(),
+ now.tv_sec, now.tv_nsec, unique++);
return f;
}
#include "test/core/end2end/end2end_tests.h"
+#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
static grpc_end2end_test_fixture chttp2_create_fixture_fullstack(
grpc_channel_args* /*client_args*/, grpc_channel_args* /*server_args*/) {
+ gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME);
const std::string localaddr = absl::StrFormat(
- "unix:/tmp/grpc_fullstack_test.%d.%d", getpid(), unique++);
+ "unix:/tmp/grpc_fullstack_test.%d.%" PRId64 ".%" PRId32 ".%d", getpid(),
+ now.tv_sec, now.tv_nsec, unique++);
return chttp2_create_fixture_fullstack_base(localaddr);
}
static grpc_end2end_test_fixture
chttp2_create_fixture_fullstack_abstract_namespace(
grpc_channel_args* /*client_args*/, grpc_channel_args* /*server_args*/) {
+ gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME);
const std::string localaddr = absl::StrFormat(
- "unix-abstract:grpc_fullstack_test.%d.%d", getpid(), unique++);
+ "unix-abstract:grpc_fullstack_test.%d.%" PRId64 ".%" PRId32 ".%d",
+ getpid(), now.tv_sec, now.tv_nsec, unique++);
return chttp2_create_fixture_fullstack_base(localaddr);
}
auth, GRPC_SSL_SESSION_REUSED_PROPERTY);
const grpc_auth_property* property = grpc_auth_property_iterator_next(&it);
GPR_ASSERT(property != nullptr);
-
if (expect_session_reuse) {
GPR_ASSERT(strcmp(property->value, "true") == 0);
} else {
"//test/core/util:grpc_test_util",
],
)
+
+grpc_cc_test(
+ name = "time_util_test",
+ srcs = ["time_util_test.cc"],
+ external_deps = [
+ "gtest",
+ ],
+ language = "C++",
+ uses_polling = False,
+ deps = [
+ "//:gpr",
+ "//test/core/util:grpc_test_util",
+ ],
+)
EXPECT_NE(stack_trace, absl::nullopt);
gpr_log(GPR_INFO, "stack_trace=%s", stack_trace->c_str());
#if !defined(NDEBUG) && !defined(GPR_MUSL_LIBC_COMPAT)
- EXPECT_TRUE(stack_trace->find("GetCurrentStackTrace") != -1);
+ EXPECT_TRUE(stack_trace->find("GetCurrentStackTrace") != std::string::npos);
#endif
}
--- /dev/null
+//
+// Copyright 2021 the 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.
+//
+
+#include <stdio.h>
+#include <string.h>
+
+#include <gtest/gtest.h>
+
+#include <grpc/support/time.h>
+
+#include "absl/time/time.h"
+
+#include "src/core/lib/gprpp/time_util.h"
+
+TEST(TimeUtilTest, ToGprTimeSpecFromAbslDurationWithRegularValues) {
+ std::vector<int> times = {-10, -1, 0, 1, 10};
+ for (int t : times) {
+ EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_nanos(t, GPR_TIMESPAN),
+ grpc_core::ToGprTimeSpec(absl::Nanoseconds(t))));
+ EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_micros(t, GPR_TIMESPAN),
+ grpc_core::ToGprTimeSpec(absl::Microseconds(t))));
+ EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_millis(t, GPR_TIMESPAN),
+ grpc_core::ToGprTimeSpec(absl::Milliseconds(t))));
+ EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_seconds(t, GPR_TIMESPAN),
+ grpc_core::ToGprTimeSpec(absl::Seconds(t))));
+ EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_minutes(t, GPR_TIMESPAN),
+ grpc_core::ToGprTimeSpec(absl::Minutes(t))));
+ EXPECT_EQ(0, gpr_time_cmp(gpr_time_from_hours(t, GPR_TIMESPAN),
+ grpc_core::ToGprTimeSpec(absl::Hours(t))));
+ }
+}
+
+TEST(TimeUtilTest, ToGprTimeSpecFromAbslDurationWithInfinites) {
+ EXPECT_EQ(0,
+ gpr_time_cmp(gpr_inf_past(GPR_TIMESPAN),
+ grpc_core::ToGprTimeSpec(-absl::InfiniteDuration())));
+ EXPECT_EQ(0, gpr_time_cmp(gpr_time_0(GPR_TIMESPAN),
+ grpc_core::ToGprTimeSpec(absl::ZeroDuration())));
+}
+
+TEST(TimeUtilTest, ToGprTimeSpecFromAbslTimeWithRegularValues) {
+ std::vector<int> times = {0, 10, 100000000};
+ for (int t : times) {
+ EXPECT_EQ(0,
+ gpr_time_cmp(gpr_time_from_nanos(t, GPR_CLOCK_REALTIME),
+ grpc_core::ToGprTimeSpec(absl::FromUnixNanos(t))));
+ EXPECT_EQ(0,
+ gpr_time_cmp(gpr_time_from_micros(t, GPR_CLOCK_REALTIME),
+ grpc_core::ToGprTimeSpec(absl::FromUnixMicros(t))));
+ EXPECT_EQ(0,
+ gpr_time_cmp(gpr_time_from_millis(t, GPR_CLOCK_REALTIME),
+ grpc_core::ToGprTimeSpec(absl::FromUnixMillis(t))));
+ EXPECT_EQ(0,
+ gpr_time_cmp(gpr_time_from_seconds(t, GPR_CLOCK_REALTIME),
+ grpc_core::ToGprTimeSpec(absl::FromUnixSeconds(t))));
+ }
+}
+
+TEST(TimeUtilTest, ToGprTimeSpecFromAbslTimeWithInfinites) {
+ EXPECT_EQ(0, gpr_time_cmp(gpr_inf_future(GPR_CLOCK_REALTIME),
+ grpc_core::ToGprTimeSpec(absl::InfiniteFuture())));
+ EXPECT_EQ(0, gpr_time_cmp(gpr_inf_past(GPR_CLOCK_REALTIME),
+ grpc_core::ToGprTimeSpec(absl::InfinitePast())));
+}
+
+TEST(TimeUtilTest, ToAbslDurationWithRegularValues) {
+ std::vector<int> times = {-10, -1, 0, 1, 10};
+ for (int t : times) {
+ EXPECT_EQ(absl::Nanoseconds(t),
+ grpc_core::ToAbslDuration(gpr_time_from_nanos(t, GPR_TIMESPAN)));
+ EXPECT_EQ(absl::Microseconds(t),
+ grpc_core::ToAbslDuration(gpr_time_from_micros(t, GPR_TIMESPAN)));
+ EXPECT_EQ(absl::Milliseconds(t),
+ grpc_core::ToAbslDuration(gpr_time_from_millis(t, GPR_TIMESPAN)));
+ EXPECT_EQ(absl::Seconds(t), grpc_core::ToAbslDuration(
+ gpr_time_from_seconds(t, GPR_TIMESPAN)));
+ EXPECT_EQ(absl::Minutes(t), grpc_core::ToAbslDuration(
+ gpr_time_from_minutes(t, GPR_TIMESPAN)));
+ EXPECT_EQ(absl::Hours(t),
+ grpc_core::ToAbslDuration(gpr_time_from_hours(t, GPR_TIMESPAN)));
+ }
+}
+
+TEST(TimeUtilTest, ToAbslDurationWithInfinites) {
+ EXPECT_EQ(absl::InfiniteDuration(),
+ grpc_core::ToAbslDuration(gpr_inf_future(GPR_TIMESPAN)));
+ EXPECT_EQ(-absl::InfiniteDuration(),
+ grpc_core::ToAbslDuration(gpr_inf_past(GPR_TIMESPAN)));
+}
+
+TEST(TimeUtilTest, ToAbslTimeWithRegularValues) {
+ std::vector<int> times = {0, 10, 100000000};
+ for (int t : times) {
+ EXPECT_EQ(absl::FromUnixNanos(t), grpc_core::ToAbslTime(gpr_time_from_nanos(
+ t, GPR_CLOCK_REALTIME)));
+ EXPECT_EQ(
+ absl::FromUnixMicros(t),
+ grpc_core::ToAbslTime(gpr_time_from_micros(t, GPR_CLOCK_REALTIME)));
+ EXPECT_EQ(
+ absl::FromUnixMillis(t),
+ grpc_core::ToAbslTime(gpr_time_from_millis(t, GPR_CLOCK_REALTIME)));
+ EXPECT_EQ(
+ absl::FromUnixSeconds(t),
+ grpc_core::ToAbslTime(gpr_time_from_seconds(t, GPR_CLOCK_REALTIME)));
+ }
+}
+
+TEST(TimeUtilTest, ToAbslTimeWithInfinites) {
+ EXPECT_EQ(absl::InfiniteFuture(),
+ grpc_core::ToAbslTime(gpr_inf_future(GPR_CLOCK_REALTIME)));
+ EXPECT_EQ(absl::InfinitePast(),
+ grpc_core::ToAbslTime(gpr_inf_past(GPR_CLOCK_REALTIME)));
+ EXPECT_EQ(absl::UnixEpoch(),
+ grpc_core::ToAbslTime(gpr_time_0(GPR_CLOCK_REALTIME)));
+}
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ int ret = RUN_ALL_TESTS();
+ return ret;
+}
void Await() {
grpc_core::MutexLock lock(&mu_);
- cv_.WaitUntil(&mu_, [this] { return ready_; });
+ grpc_core::WaitUntil(&cv_, &mu_, [this] { return ready_; });
}
private:
for (int i = 1; i <= kNumMessagePingPongsPerCall; i++) {
{
grpc_core::MutexLock lock(&ping_pong_round_mu);
- ping_pong_round_cv.Broadcast();
- while (ping_pong_round != i) {
+ ping_pong_round_cv.SignalAll();
+ while (int(ping_pong_round) != i) {
ping_pong_round_cv.Wait(&ping_pong_round_mu);
}
}
{
grpc_core::MutexLock lock(&ping_pong_round_mu);
ping_pongs_done++;
- ping_pong_round_cv.Broadcast();
+ ping_pong_round_cv.SignalAll();
}
}
gpr_log(GPR_DEBUG, "now receive status on call with server address:%s",
ping_pong_round_cv.Wait(&ping_pong_round_mu);
}
ping_pong_round++;
- ping_pong_round_cv.Broadcast();
+ ping_pong_round_cv.SignalAll();
gpr_log(GPR_DEBUG, "initiate ping pong round: %ld", ping_pong_round);
}
}
return 0;
}
-static int do_nothing(thread_args* args) { return 0; }
+static int do_nothing(thread_args* /*args*/) { return 0; }
#ifdef __linux__
/* Special case for epoll, where we need to create the fd ahead of time. */
"//test/core/util:grpc_test_util",
],
)
+
+grpc_cc_test(
+ name = "matchers_test",
+ srcs = ["matchers_test.cc"],
+ external_deps = ["gtest"],
+ language = "C++",
+ deps = [
+ "//:gpr",
+ "//:grpc",
+ "//test/core/util:grpc_test_util",
+ ],
+)
~fake_call_creds() override { GRPC_MDELEM_UNREF(dummy_md_); }
- bool get_request_metadata(grpc_polling_entity* pollent,
- grpc_auth_metadata_context context,
+ bool get_request_metadata(grpc_polling_entity* /*pollent*/,
+ grpc_auth_metadata_context /*context*/,
grpc_credentials_mdelem_array* md_array,
- grpc_closure* on_request_metadata,
- grpc_error** error) override {
+ grpc_closure* /*on_request_metadata*/,
+ grpc_error** /*error*/) override {
grpc_credentials_mdelem_array_add(md_array, dummy_md_);
return true;
}
- void cancel_get_request_metadata(grpc_credentials_mdelem_array* md_array,
- grpc_error* error) override {}
+ void cancel_get_request_metadata(grpc_credentials_mdelem_array* /*md_array*/,
+ grpc_error* /*error*/) override {}
private:
grpc_mdelem dummy_md_;
static void validate_external_account_creds_token_exchage_request(
const grpc_httpcli_request* request, const char* body, size_t body_size,
- bool expect_actor_token) {
+ bool /*expect_actor_token*/) {
// Check that the body is constructed properly.
GPR_ASSERT(body != nullptr);
GPR_ASSERT(body_size != 0);
static void
validate_external_account_creds_token_exchage_request_with_url_encode(
const grpc_httpcli_request* request, const char* body, size_t body_size,
- bool expect_actor_token) {
+ bool /*expect_actor_token*/) {
// Check that the body is constructed properly.
GPR_ASSERT(body != nullptr);
GPR_ASSERT(body_size != 0);
static void
validate_external_account_creds_service_account_impersonation_request(
const grpc_httpcli_request* request, const char* body, size_t body_size,
- bool expect_actor_token) {
+ bool /*expect_actor_token*/) {
// Check that the body is constructed properly.
GPR_ASSERT(body != nullptr);
GPR_ASSERT(body_size != 0);
static int
external_account_creds_httpcli_post_failure_token_exchange_response_missing_access_token(
- const grpc_httpcli_request* request, const char* body, size_t body_size,
- grpc_millis /*deadline*/, grpc_closure* on_done,
+ const grpc_httpcli_request* request, const char* /*body*/,
+ size_t /*body_size*/, grpc_millis /*deadline*/, grpc_closure* on_done,
grpc_httpcli_response* response) {
if (strcmp(request->http.path, "/token") == 0) {
*response = http_response(200,
static void validate_aws_external_account_creds_token_exchage_request(
const grpc_httpcli_request* request, const char* body, size_t body_size,
- bool expect_actor_token) {
+ bool /*expect_actor_token*/) {
// Check that the body is constructed properly.
GPR_ASSERT(body != nullptr);
GPR_ASSERT(body_size != 0);
protected:
void RetrieveSubjectToken(
- HTTPRequestContext* ctx, const Options& options,
+ HTTPRequestContext* /*ctx*/, const Options& /*options*/,
std::function<void(std::string, grpc_error*)> cb) override {
cb("test_subject_token", GRPC_ERROR_NONE);
}
TEST_F(GrpcTlsCertificateDistributorTest, SetKeyMaterialsInCallback) {
distributor_.SetWatchStatusCallback([this](std::string cert_name,
- bool root_being_watched,
- bool identity_being_watched) {
+ bool /*root_being_watched*/,
+ bool /*identity_being_watched*/) {
distributor_.SetKeyMaterials(
cert_name, kRootCert1Contents,
MakeCertKeyPairs(kIdentityCert1PrivateKey, kIdentityCert1Contents));
TEST_F(GrpcTlsCertificateDistributorTest, SetErrorForCertInCallback) {
distributor_.SetWatchStatusCallback([this](std::string cert_name,
- bool root_being_watched,
- bool identity_being_watched) {
+ bool /*root_being_watched*/,
+ bool /*identity_being_watched*/) {
this->distributor_.SetErrorForCert(
cert_name, GRPC_ERROR_CREATE_FROM_STATIC_STRING(kRootErrorMessage),
GRPC_ERROR_CREATE_FROM_STATIC_STRING(kIdentityErrorMessage));
EXPECT_STREQ(error_details.error_details().c_str(), "test error details");
}
+TEST_F(GrpcTlsCredentialsOptionsTest, ClientOptionsOnDefaultRootCerts) {
+ auto options = MakeRefCounted<grpc_tls_credentials_options>();
+ options->set_server_verification_option(GRPC_TLS_SERVER_VERIFICATION);
+ auto credentials = MakeRefCounted<TlsCredentials>(options);
+ ASSERT_NE(credentials, nullptr);
+ grpc_channel_args* new_args = nullptr;
+ auto connector = credentials->create_security_connector(
+ nullptr, "random targets", nullptr, &new_args);
+ grpc_channel_args_destroy(new_args);
+ ASSERT_NE(connector, nullptr);
+ TlsChannelSecurityConnector* tls_connector =
+ static_cast<TlsChannelSecurityConnector*>(connector.get());
+ EXPECT_NE(tls_connector->ClientHandshakerFactoryForTesting(), nullptr);
+}
+
// Tests for StaticDataCertificateProvider.
TEST_F(GrpcTlsCredentialsOptionsTest,
ClientOptionsWithStaticDataProviderOnBothCerts) {
}
TEST_F(GrpcTlsCredentialsOptionsTest,
+ ClientOptionsWithDefaultRootAndStaticDataProviderOnIdentityCerts) {
+ auto options = MakeRefCounted<grpc_tls_credentials_options>();
+ auto provider = MakeRefCounted<StaticDataCertificateProvider>(
+ "", MakeCertKeyPairs(private_key_.c_str(), cert_chain_.c_str()));
+ options->set_certificate_provider(std::move(provider));
+ options->set_watch_identity_pair(true);
+ options->set_server_verification_option(GRPC_TLS_SERVER_VERIFICATION);
+ auto credentials = MakeRefCounted<TlsCredentials>(options);
+ ASSERT_NE(credentials, nullptr);
+ grpc_channel_args* new_args = nullptr;
+ auto connector = credentials->create_security_connector(
+ nullptr, "random targets", nullptr, &new_args);
+ grpc_channel_args_destroy(new_args);
+ ASSERT_NE(connector, nullptr);
+ TlsChannelSecurityConnector* tls_connector =
+ static_cast<TlsChannelSecurityConnector*>(connector.get());
+ EXPECT_NE(tls_connector->ClientHandshakerFactoryForTesting(), nullptr);
+}
+
+TEST_F(GrpcTlsCredentialsOptionsTest,
ServerOptionsWithStaticDataProviderOnBothCerts) {
auto options = MakeRefCounted<grpc_tls_credentials_options>();
auto provider = MakeRefCounted<StaticDataCertificateProvider>(
GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
auto credentials = MakeRefCounted<TlsServerCredentials>(options);
ASSERT_NE(credentials, nullptr);
- auto connector = credentials->create_security_connector();
+ auto connector = credentials->create_security_connector(nullptr);
ASSERT_NE(connector, nullptr);
TlsServerSecurityConnector* tls_connector =
static_cast<TlsServerSecurityConnector*>(connector.get());
options->set_cert_request_type(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE);
auto credentials = MakeRefCounted<TlsServerCredentials>(options);
ASSERT_NE(credentials, nullptr);
- auto connector = credentials->create_security_connector();
+ auto connector = credentials->create_security_connector(nullptr);
ASSERT_NE(connector, nullptr);
TlsServerSecurityConnector* tls_connector =
static_cast<TlsServerSecurityConnector*>(connector.get());
options->set_cert_request_type(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE);
auto credentials = MakeRefCounted<TlsServerCredentials>(options);
ASSERT_NE(credentials, nullptr);
- auto connector = credentials->create_security_connector();
+ auto connector = credentials->create_security_connector(nullptr);
ASSERT_NE(connector, nullptr);
TlsServerSecurityConnector* tls_connector =
static_cast<TlsServerSecurityConnector*>(connector.get());
EXPECT_EQ(tls_connector->ServerHandshakerFactoryForTesting(), nullptr);
}
-//// Tests for FileWatcherCertificateProvider.
+// Tests for FileWatcherCertificateProvider.
TEST_F(GrpcTlsCredentialsOptionsTest,
ClientOptionsWithCertWatcherProviderOnBothCerts) {
auto options = MakeRefCounted<grpc_tls_credentials_options>();
GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
auto credentials = MakeRefCounted<TlsServerCredentials>(options);
ASSERT_NE(credentials, nullptr);
- auto connector = credentials->create_security_connector();
+ auto connector = credentials->create_security_connector(nullptr);
ASSERT_NE(connector, nullptr);
TlsServerSecurityConnector* tls_connector =
static_cast<TlsServerSecurityConnector*>(connector.get());
options->set_cert_request_type(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE);
auto credentials = MakeRefCounted<TlsServerCredentials>(options);
ASSERT_NE(credentials, nullptr);
- auto connector = credentials->create_security_connector();
+ auto connector = credentials->create_security_connector(nullptr);
ASSERT_NE(connector, nullptr);
TlsServerSecurityConnector* tls_connector =
static_cast<TlsServerSecurityConnector*>(connector.get());
options->set_cert_request_type(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE);
auto credentials = MakeRefCounted<TlsServerCredentials>(options);
ASSERT_NE(credentials, nullptr);
- auto connector = credentials->create_security_connector();
+ auto connector = credentials->create_security_connector(nullptr);
ASSERT_NE(connector, nullptr);
TlsServerSecurityConnector* tls_connector =
static_cast<TlsServerSecurityConnector*>(connector.get());
options->set_cert_request_type(GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE);
auto credentials = MakeRefCounted<TlsServerCredentials>(options);
ASSERT_NE(credentials, nullptr);
- auto connector = credentials->create_security_connector();
+ auto connector = credentials->create_security_connector(nullptr);
ASSERT_NE(connector, nullptr);
TlsServerSecurityConnector* tls_connector =
static_cast<TlsServerSecurityConnector*>(connector.get());
int main(int argc, char** argv) {
grpc::testing::TestEnvironment env(argc, argv);
+ GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, CA_CERT_PATH);
::testing::InitGoogleTest(&argc, argv);
grpc_init();
int ret = RUN_ALL_TESTS();
--- /dev/null
+// Copyright 2021 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.
+
+#include "src/core/lib/security/authorization/matchers.h"
+
+#include <gtest/gtest.h>
+
+namespace grpc_core {
+
+TEST(StringMatcherTest, ExactMatchCaseSensitive) {
+ auto string_matcher =
+ StringMatcher::Create(StringMatcher::Type::EXACT,
+ /*matcher=*/"exact", /*case_sensitive=*/true);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("exact"));
+ EXPECT_FALSE(string_matcher->Match("Exact"));
+ EXPECT_FALSE(string_matcher->Match("exacz"));
+}
+
+TEST(StringMatcherTest, ExactMatchCaseInsensitive) {
+ auto string_matcher =
+ StringMatcher::Create(StringMatcher::Type::EXACT,
+ /*matcher=*/"exact", /*case_sensitive=*/false);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("Exact"));
+ EXPECT_FALSE(string_matcher->Match("Exacz"));
+}
+
+TEST(StringMatcherTest, PrefixMatchCaseSensitive) {
+ auto string_matcher = StringMatcher::Create(StringMatcher::Type::PREFIX,
+ /*matcher=*/"prefix",
+ /*case_sensitive=*/true);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("prefix-test"));
+ EXPECT_FALSE(string_matcher->Match("xx-prefix-test"));
+ EXPECT_FALSE(string_matcher->Match("Prefix-test"));
+ EXPECT_FALSE(string_matcher->Match("pre-test"));
+}
+
+TEST(StringMatcherTest, PrefixMatchCaseInsensitive) {
+ auto string_matcher = StringMatcher::Create(StringMatcher::Type::PREFIX,
+ /*matcher=*/"prefix",
+ /*case_sensitive=*/false);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("PREfix-test"));
+ EXPECT_FALSE(string_matcher->Match("xx-PREfix-test"));
+ EXPECT_FALSE(string_matcher->Match("PRE-test"));
+}
+
+TEST(StringMatcherTest, SuffixMatchCaseSensitive) {
+ auto string_matcher = StringMatcher::Create(StringMatcher::Type::SUFFIX,
+ /*matcher=*/"suffix",
+ /*case_sensitive=*/true);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("test-suffix"));
+ EXPECT_FALSE(string_matcher->Match("test-Suffix"));
+ EXPECT_FALSE(string_matcher->Match("test-suffix-xx"));
+ EXPECT_FALSE(string_matcher->Match("test-suffiz"));
+}
+
+TEST(StringMatcherTest, SuffixMatchCaseInSensitive) {
+ auto string_matcher = StringMatcher::Create(StringMatcher::Type::SUFFIX,
+ /*matcher=*/"suffix",
+ /*case_sensitive=*/false);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("Test-SUFFIX"));
+ EXPECT_FALSE(string_matcher->Match("Test-SUFFIX-xx"));
+ EXPECT_FALSE(string_matcher->Match("Test-SUFFIZ"));
+}
+
+TEST(StringMatcherTest, InvalidRegex) {
+ auto string_matcher = StringMatcher::Create(StringMatcher::Type::SAFE_REGEX,
+ /*matcher=*/"a[b-a]",
+ /*case_sensitive=*/true);
+ EXPECT_FALSE(string_matcher.ok());
+ EXPECT_EQ(string_matcher.status().code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(string_matcher.status().message(),
+ "Invalid regex string specified in matcher.");
+}
+
+TEST(StringMatcherTest, SafeRegexMatchCaseSensitive) {
+ auto string_matcher = StringMatcher::Create(StringMatcher::Type::SAFE_REGEX,
+ /*matcher=*/"regex.*",
+ /*case_sensitive=*/true);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("regex-test"));
+ EXPECT_FALSE(string_matcher->Match("xx-regex-test"));
+ EXPECT_FALSE(string_matcher->Match("Regex-test"));
+ EXPECT_FALSE(string_matcher->Match("test-regex"));
+}
+
+TEST(StringMatcherTest, SafeRegexMatchCaseInSensitive) {
+ auto string_matcher = StringMatcher::Create(StringMatcher::Type::SAFE_REGEX,
+ /*matcher=*/"regex.*",
+ /*case_sensitive=*/false);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("regex-test"));
+ EXPECT_TRUE(string_matcher->Match("Regex-test"));
+ EXPECT_FALSE(string_matcher->Match("xx-Regex-test"));
+ EXPECT_FALSE(string_matcher->Match("test-regex"));
+}
+
+TEST(StringMatcherTest, ContainsMatchCaseSensitive) {
+ auto string_matcher = StringMatcher::Create(StringMatcher::Type::CONTAINS,
+ /*matcher=*/"contains",
+ /*case_sensitive=*/true);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("test-contains"));
+ EXPECT_TRUE(string_matcher->Match("test-contains-test"));
+ EXPECT_FALSE(string_matcher->Match("test-Contains"));
+ EXPECT_FALSE(string_matcher->Match("test-containz"));
+}
+
+TEST(StringMatcherTest, ContainsMatchCaseInSensitive) {
+ auto string_matcher = StringMatcher::Create(StringMatcher::Type::CONTAINS,
+ /*matcher=*/"contains",
+ /*case_sensitive=*/false);
+ ASSERT_TRUE(string_matcher.ok());
+ EXPECT_TRUE(string_matcher->Match("Test-Contains"));
+ EXPECT_TRUE(string_matcher->Match("Test-Contains-Test"));
+ EXPECT_FALSE(string_matcher->Match("Test-Containz"));
+}
+
+TEST(HeaderMatcherTest, StringMatcher) {
+ auto header_matcher =
+ HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::EXACT,
+ /*matcher=*/"exact");
+ ASSERT_TRUE(header_matcher.ok());
+ EXPECT_TRUE(header_matcher->Match("exact"));
+ EXPECT_FALSE(header_matcher->Match("Exact"));
+ EXPECT_FALSE(header_matcher->Match("exacz"));
+}
+
+TEST(HeaderMatcherTest, StringMatcherWithInvertMatch) {
+ auto header_matcher =
+ HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::EXACT,
+ /*matcher=*/"exact",
+ /*range_start=*/0, /*range_end=*/0,
+ /*present_match=*/false, /*invert_match=*/true);
+ ASSERT_TRUE(header_matcher.ok());
+ EXPECT_FALSE(header_matcher->Match("exact"));
+ EXPECT_TRUE(header_matcher->Match("Exact"));
+ EXPECT_TRUE(header_matcher->Match("exacz"));
+}
+
+TEST(HeaderMatcherTest, InvalidRegex) {
+ auto header_matcher =
+ HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::SAFE_REGEX,
+ /*matcher=*/"a[b-a]",
+ /*range_start=*/0, /*range_end=*/0,
+ /*present_match=*/false, /*invert_match=*/true);
+ EXPECT_FALSE(header_matcher.ok());
+ EXPECT_EQ(header_matcher.status().code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(header_matcher.status().message(),
+ "Invalid regex string specified in matcher.");
+}
+
+TEST(HeaderMatcherTest, RangeMatcherValidRange) {
+ auto header_matcher =
+ HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::RANGE,
+ /*matcher=*/"", /*range_start=*/10,
+ /*range_end*/ 20);
+ ASSERT_TRUE(header_matcher.ok());
+ EXPECT_TRUE(header_matcher->Match("16"));
+ EXPECT_TRUE(header_matcher->Match("10"));
+ EXPECT_FALSE(header_matcher->Match("3"));
+ EXPECT_FALSE(header_matcher->Match("20"));
+}
+
+TEST(HeaderMatcherTest, RangeMatcherInvalidRange) {
+ auto header_matcher =
+ HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::RANGE,
+ /*matcher=*/"", /*range_start=*/20,
+ /*range_end*/ 10);
+ EXPECT_FALSE(header_matcher.ok());
+ EXPECT_EQ(header_matcher.status().code(), absl::StatusCode::kInvalidArgument);
+ EXPECT_EQ(
+ header_matcher.status().message(),
+ "Invalid range specifier specified: end cannot be smaller than start.");
+}
+
+TEST(HeaderMatcherTest, PresentMatcherTrue) {
+ auto header_matcher =
+ HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::PRESENT,
+ /*matcher=*/"", /*range_start=*/0,
+ /*range_end=*/0, /*present_match=*/true);
+ ASSERT_TRUE(header_matcher.ok());
+ EXPECT_TRUE(header_matcher->Match("any_value"));
+ EXPECT_FALSE(header_matcher->Match(absl::nullopt));
+}
+
+TEST(HeaderMatcherTest, PresentMatcherFalse) {
+ auto header_matcher =
+ HeaderMatcher::Create(/*name=*/"key", HeaderMatcher::Type::PRESENT,
+ /*matcher=*/"", /*range_start=*/0,
+ /*range_end=*/0, /*present_match=*/false);
+ ASSERT_TRUE(header_matcher.ok());
+ EXPECT_FALSE(header_matcher->Match("any_value"));
+ EXPECT_TRUE(header_matcher->Match(absl::nullopt));
+}
+
+} // namespace grpc_core
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
// Create security connector
grpc_core::RefCountedPtr<grpc_server_security_connector> sc =
- creds->create_security_connector();
+ creds->create_security_connector(nullptr);
GPR_ASSERT(sc != nullptr);
grpc_millis deadline = GPR_MS_PER_SEC + grpc_core::ExecCtx::Get()->Now();
grpc_channel_args_destroy(new_args);
}
-// Note that on client side, we don't have tests watching identity certs only,
-// because in TLS, the trust certs should always be presented. If we don't
-// provide, it will try to load certs from some default system locations, and
-// will hence fail on some systems.
+TEST_F(TlsSecurityConnectorTest,
+ SystemRootsWhenCreateChannelSecurityConnector) {
+ // Create options watching for no certificates.
+ grpc_core::RefCountedPtr<grpc_tls_credentials_options> root_options =
+ grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+ grpc_core::RefCountedPtr<TlsCredentials> root_credential =
+ grpc_core::MakeRefCounted<TlsCredentials>(root_options);
+ grpc_channel_args* root_new_args = nullptr;
+ grpc_core::RefCountedPtr<grpc_channel_security_connector> root_connector =
+ root_credential->create_security_connector(nullptr, "some_target",
+ nullptr, &root_new_args);
+ EXPECT_NE(root_connector, nullptr);
+ grpc_core::TlsChannelSecurityConnector* tls_root_connector =
+ static_cast<grpc_core::TlsChannelSecurityConnector*>(
+ root_connector.get());
+ EXPECT_NE(tls_root_connector->ClientHandshakerFactoryForTesting(), nullptr);
+ grpc_channel_args_destroy(root_new_args);
+}
+
+TEST_F(TlsSecurityConnectorTest,
+ SystemRootsAndIdentityCertsObtainedWhenCreateChannelSecurityConnector) {
+ grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
+ grpc_core::MakeRefCounted<grpc_tls_certificate_distributor>();
+ distributor->SetKeyMaterials(kIdentityCertName, absl::nullopt,
+ identity_pairs_0_);
+ grpc_core::RefCountedPtr<::grpc_tls_certificate_provider> provider =
+ grpc_core::MakeRefCounted<TlsTestCertificateProvider>(distributor);
+ // Create options only watching for identity certificates.
+ grpc_core::RefCountedPtr<grpc_tls_credentials_options> root_options =
+ grpc_core::MakeRefCounted<grpc_tls_credentials_options>();
+ root_options->set_certificate_provider(provider);
+ root_options->set_watch_identity_pair(true);
+ root_options->set_identity_cert_name(kIdentityCertName);
+ grpc_core::RefCountedPtr<TlsCredentials> root_credential =
+ grpc_core::MakeRefCounted<TlsCredentials>(root_options);
+ grpc_channel_args* root_new_args = nullptr;
+ grpc_core::RefCountedPtr<grpc_channel_security_connector> root_connector =
+ root_credential->create_security_connector(nullptr, "some_target",
+ nullptr, &root_new_args);
+ EXPECT_NE(root_connector, nullptr);
+ grpc_core::TlsChannelSecurityConnector* tls_root_connector =
+ static_cast<grpc_core::TlsChannelSecurityConnector*>(
+ root_connector.get());
+ EXPECT_NE(tls_root_connector->ClientHandshakerFactoryForTesting(), nullptr);
+ EXPECT_EQ(tls_root_connector->KeyCertPairListForTesting(), identity_pairs_0_);
+ // If we have a root update, we shouldn't receive them in security connector,
+ // since we claimed to use default system roots.
+ distributor->SetKeyMaterials(kRootCertName, root_cert_1_, absl::nullopt);
+ EXPECT_NE(tls_root_connector->ClientHandshakerFactoryForTesting(), nullptr);
+ EXPECT_NE(tls_root_connector->RootCertsForTesting(), root_cert_1_);
+ grpc_channel_args_destroy(root_new_args);
+}
+
TEST_F(TlsSecurityConnectorTest,
RootCertsObtainedWhenCreateChannelSecurityConnector) {
grpc_core::RefCountedPtr<grpc_tls_certificate_distributor> distributor =
grpc_core::RefCountedPtr<TlsServerCredentials> credential =
grpc_core::MakeRefCounted<TlsServerCredentials>(options);
grpc_core::RefCountedPtr<grpc_server_security_connector> connector =
- credential->create_security_connector();
+ credential->create_security_connector(nullptr);
EXPECT_NE(connector, nullptr);
grpc_core::TlsServerSecurityConnector* tls_connector =
static_cast<grpc_core::TlsServerSecurityConnector*>(connector.get());
grpc_core::RefCountedPtr<TlsServerCredentials> identity_credential =
grpc_core::MakeRefCounted<TlsServerCredentials>(identity_options);
grpc_core::RefCountedPtr<grpc_server_security_connector> identity_connector =
- identity_credential->create_security_connector();
+ identity_credential->create_security_connector(nullptr);
EXPECT_NE(identity_connector, nullptr);
grpc_core::TlsServerSecurityConnector* tls_identity_connector =
static_cast<grpc_core::TlsServerSecurityConnector*>(
grpc_core::RefCountedPtr<TlsServerCredentials> credential =
grpc_core::MakeRefCounted<TlsServerCredentials>(options);
grpc_core::RefCountedPtr<grpc_server_security_connector> connector =
- credential->create_security_connector();
+ credential->create_security_connector(nullptr);
EXPECT_NE(connector, nullptr);
grpc_core::TlsServerSecurityConnector* tls_connector =
static_cast<grpc_core::TlsServerSecurityConnector*>(connector.get());
grpc_core::RefCountedPtr<TlsServerCredentials> credential =
grpc_core::MakeRefCounted<TlsServerCredentials>(options);
grpc_core::RefCountedPtr<grpc_server_security_connector> connector =
- credential->create_security_connector();
+ credential->create_security_connector(nullptr);
EXPECT_NE(connector, nullptr);
grpc_core::TlsServerSecurityConnector* tls_connector =
static_cast<grpc_core::TlsServerSecurityConnector*>(connector.get());
int main(int argc, char** argv) {
grpc::testing::TestEnvironment env(argc, argv);
+ GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, CA_CERT_PATH);
::testing::InitGoogleTest(&argc, argv);
grpc_init();
int ret = RUN_ALL_TESTS();
namespace {
-XdsApi::StringMatcher ExactMatcher(const char* string) {
- return XdsApi::StringMatcher(XdsApi::StringMatcher::StringMatcherType::EXACT,
- string);
+StringMatcher ExactMatcher(const char* string) {
+ return StringMatcher::Create(StringMatcher::Type::EXACT, string).value();
}
-XdsApi::StringMatcher PrefixMatcher(const char* string,
- bool ignore_case = false) {
- return XdsApi::StringMatcher(XdsApi::StringMatcher::StringMatcherType::PREFIX,
- string, ignore_case);
+StringMatcher PrefixMatcher(const char* string, bool case_sensitive = true) {
+ return StringMatcher::Create(StringMatcher::Type::PREFIX, string,
+ case_sensitive)
+ .value();
}
-XdsApi::StringMatcher SuffixMatcher(const char* string,
- bool ignore_case = false) {
- return XdsApi::StringMatcher(XdsApi::StringMatcher::StringMatcherType::SUFFIX,
- string, ignore_case);
+StringMatcher SuffixMatcher(const char* string, bool case_sensitive = true) {
+ return StringMatcher::Create(StringMatcher::Type::SUFFIX, string,
+ case_sensitive)
+ .value();
}
-XdsApi::StringMatcher ContainsMatcher(const char* string,
- bool ignore_case = false) {
- return XdsApi::StringMatcher(
- XdsApi::StringMatcher::StringMatcherType::CONTAINS, string, ignore_case);
+StringMatcher ContainsMatcher(const char* string, bool case_sensitive = true) {
+ return StringMatcher::Create(StringMatcher::Type::CONTAINS, string,
+ case_sensitive)
+ .value();
}
-XdsApi::StringMatcher SafeRegexMatcher(const char* string) {
- return XdsApi::StringMatcher(
- XdsApi::StringMatcher::StringMatcherType::SAFE_REGEX, string);
+StringMatcher SafeRegexMatcher(const char* string) {
+ return StringMatcher::Create(StringMatcher::Type::SAFE_REGEX, string).value();
}
TEST(XdsSanMatchingTest, EmptySansList) {
std::vector<const char*> sans = {"aBc.cOm"};
EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {PrefixMatcher("AbC", true /* ignore_case */)}));
+ {PrefixMatcher("AbC", false /* case_sensitive */)}));
sans = {"abc.com"};
EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {PrefixMatcher("AbC", true /* ignore_case */)}));
+ {PrefixMatcher("AbC", false /* case_sensitive */)}));
sans = {"xyz.com"};
EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {PrefixMatcher("AbC", true /* ignore_case */)}));
+ {PrefixMatcher("AbC", false /* case_sensitive */)}));
}
TEST(XdsSanMatchingTest, SuffixMatch) {
std::vector<const char*> sans = {"abc.com"};
EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {SuffixMatcher(".CoM", true /* ignore_case */)}));
+ {SuffixMatcher(".CoM", false /* case_sensitive */)}));
sans = {"AbC.cOm"};
EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {SuffixMatcher(".CoM", true /* ignore_case */)}));
+ {SuffixMatcher(".CoM", false /* case_sensitive */)}));
sans = {"abc.xyz"};
EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {SuffixMatcher(".CoM", true /* ignore_case */)}));
+ {SuffixMatcher(".CoM", false /* case_sensitive */)}));
}
TEST(XdsSanMatchingTest, ContainsMatch) {
std::vector<const char*> sans = {"abc.com"};
EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {ContainsMatcher("AbC", true /* ignore_case */)}));
+ {ContainsMatcher("AbC", false /* case_sensitive */)}));
sans = {"xyz.abc.com"};
EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {ContainsMatcher("AbC", true /* ignore_case */)}));
+ {ContainsMatcher("AbC", false /* case_sensitive */)}));
sans = {"foo.aBc.com"};
EXPECT_TRUE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {ContainsMatcher("AbC", true /* ignore_case */)}));
+ {ContainsMatcher("AbC", false /* case_sensitive */)}));
sans = {"foo.Ab.com"};
EXPECT_FALSE(TestOnlyXdsVerifySubjectAlternativeNames(
sans.data(), sans.size(),
- {ContainsMatcher("AbC", true /* ignore_case */)}));
+ {ContainsMatcher("AbC", false /* case_sensitive */)}));
}
TEST(XdsSanMatchingTest, RegexMatch) {
: expected_max_concurrent_rpcs_(expected_max_concurrent_rpcs) {}
Status DoHandshake(
- ServerContext* server_context,
+ ServerContext* /*server_context*/,
ServerReaderWriter<HandshakerResp, HandshakerReq>* stream) override {
ConcurrentRpcsCheck concurrent_rpcs_check(this);
Status status;
0x00, // flags
0x00, 0x00, 0x00, 0x00 // stream identifier
};
- if (total_bytes_sent_ < kEmptyHttp2SettingsFrame.size()) {
+ if (total_bytes_sent_ < int(kEmptyHttp2SettingsFrame.size())) {
int bytes_to_send = kEmptyHttp2SettingsFrame.size() - total_bytes_sent_;
int bytes_sent =
send(fd_, kEmptyHttp2SettingsFrame.data() + total_bytes_sent_,
GPR_ASSERT(0);
} else if (bytes_sent > 0) {
total_bytes_sent_ += bytes_sent;
- GPR_ASSERT(total_bytes_sent_ <= kEmptyHttp2SettingsFrame.size());
+ GPR_ASSERT(total_bytes_sent_ <= int(kEmptyHttp2SettingsFrame.size()));
}
}
}
destroy_config(config);
}
-static void tsi_cb_assert_tsi_internal_error(tsi_result status, void* user_data,
- const unsigned char* bytes_to_send,
- size_t bytes_to_send_size,
- tsi_handshaker_result* result) {
+static void tsi_cb_assert_tsi_internal_error(
+ tsi_result status, void* /*user_data*/,
+ const unsigned char* /*bytes_to_send*/, size_t /*bytes_to_send_size*/,
+ tsi_handshaker_result* /*result*/) {
GPR_ASSERT(status == TSI_INTERNAL_ERROR);
}
return tsi::SslSessionPtr(cb(ssl_context_));
}
- static void DestroyExData(void* parent, void* ptr, CRYPTO_EX_DATA* ad,
- int index, long argl, void* argp) {
+ static void DestroyExData(void* /*parent*/, void* ptr, CRYPTO_EX_DATA* /*ad*/,
+ int /*index*/, long /*argl*/, void* /*argp*/) {
SessionExDataId* data = static_cast<SessionExDataId*>(ptr);
data->tracker->alive_sessions_.erase(data->id);
delete data;
STACK_OF(X509_INFO)* certInfos =
PEM_X509_INFO_read_bio(bio, nullptr, nullptr, nullptr);
GPR_ASSERT(certInfos != nullptr);
- for (int i = 0; i < sk_X509_INFO_num(certInfos); i++) {
+ for (size_t i = 0; i < sk_X509_INFO_num(certInfos); i++) {
X509_INFO* certInfo = sk_X509_INFO_value(certInfos, i);
if (certInfo->x509 != nullptr) {
GPR_ASSERT(sk_X509_push(cert_chain, certInfo->x509) != 0);
base_.vtable = &vtable_;
}
grpc_endpoint* base() const { return const_cast<grpc_endpoint*>(&base_); }
- static void Read(grpc_endpoint* ep, grpc_slice_buffer* slices,
- grpc_closure* cb, bool unused) {}
- static void Write(grpc_endpoint* ep, grpc_slice_buffer* slices,
- grpc_closure* cb, void* unused) {}
- static void AddToPollset(grpc_endpoint* ep, grpc_pollset* unused) {}
- static void AddToPollsetSet(grpc_endpoint* ep, grpc_pollset_set* unused) {}
- static void DeleteFromPollsetSet(grpc_endpoint* ep,
- grpc_pollset_set* unused) {}
- static void Shutdown(grpc_endpoint* ep, grpc_error* why) {}
+ static void Read(grpc_endpoint* /*ep*/, grpc_slice_buffer* /*slices*/,
+ grpc_closure* /*cb*/, bool /*unused*/) {}
+ static void Write(grpc_endpoint* /*ep*/, grpc_slice_buffer* /*slices*/,
+ grpc_closure* /*cb*/, void* /*unused*/) {}
+ static void AddToPollset(grpc_endpoint* /*ep*/, grpc_pollset* /*unused*/) {}
+ static void AddToPollsetSet(grpc_endpoint* /*ep*/,
+ grpc_pollset_set* /*unused*/) {}
+ static void DeleteFromPollsetSet(grpc_endpoint* /*ep*/,
+ grpc_pollset_set* /*unused*/) {}
+ static void Shutdown(grpc_endpoint* /*ep*/, grpc_error* /*why*/) {}
static void Destroy(grpc_endpoint* ep) {
EvalArgsMockEndpoint* m = reinterpret_cast<EvalArgsMockEndpoint*>(ep);
delete m;
return m->local_address_;
}
- static grpc_resource_user* GetResourceUser(grpc_endpoint* ep) {
+ static grpc_resource_user* GetResourceUser(grpc_endpoint* /*ep*/) {
return nullptr;
}
- static int GetFd(grpc_endpoint* unused) { return -1; }
- static bool CanTrackErr(grpc_endpoint* unused) { return false; }
+ static int GetFd(grpc_endpoint* /*unused*/) { return -1; }
+ static bool CanTrackErr(grpc_endpoint* /*unused*/) { return false; }
private:
static constexpr grpc_endpoint_vtable vtable_ = {
grpc_tcp_server_acceptor* acceptor) {
gpr_free(acceptor);
absl::string_view peer;
- int last_colon;
+ absl::string_view::size_type last_colon;
reconnect_server* server = static_cast<reconnect_server*>(arg);
gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME);
timestamp_list* new_tail;
#include <string>
#include "absl/debugging/symbolize.h"
+#include "absl/strings/match.h"
#include <grpc/support/log.h>
std::string stack_trace = grpc_core::testing::GetCurrentStackTrace();
gpr_log(GPR_INFO, "stack_trace=%s", stack_trace.c_str());
#if !defined(NDEBUG) && !defined(GPR_MUSL_LIBC_COMPAT)
- EXPECT_TRUE(stack_trace.find("Basic") != -1);
+ EXPECT_TRUE(absl::StrContains(stack_trace, "Basic"));
#endif
}
GPR_TIMESPAN));
}
-void grpc_test_init(int argc, char** argv) {
+void grpc_test_init(int /*argc*/, char** argv) {
grpc_core::testing::InitializeStackTracer(argv[0]);
absl::FailureSignalHandlerOptions options;
absl::InstallFailureSignalHandler(options);
const char* name() const override { return "fake1"; }
RefCountedPtr<CertificateProviderFactory::Config>
- CreateCertificateProviderConfig(const Json& config_json,
- grpc_error** error) override {
+ CreateCertificateProviderConfig(const Json& /*config_json*/,
+ grpc_error** /*error*/) override {
return MakeRefCounted<Config>();
}
RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
- RefCountedPtr<CertificateProviderFactory::Config> config) override {
+ RefCountedPtr<CertificateProviderFactory::Config> /*config*/) override {
return MakeRefCounted<FakeCertificateProvider>();
}
};
const char* name() const override { return "fake2"; }
RefCountedPtr<CertificateProviderFactory::Config>
- CreateCertificateProviderConfig(const Json& config_json,
- grpc_error** error) override {
+ CreateCertificateProviderConfig(const Json& /*config_json*/,
+ grpc_error** /*error*/) override {
return MakeRefCounted<Config>();
}
RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
- RefCountedPtr<CertificateProviderFactory::Config> config) override {
+ RefCountedPtr<CertificateProviderFactory::Config> /*config*/) override {
return MakeRefCounted<FakeCertificateProvider>();
}
};
}
RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
- RefCountedPtr<CertificateProviderFactory::Config> config) override {
+ RefCountedPtr<CertificateProviderFactory::Config> /*config*/) override {
return nullptr;
}
};
MakeRefCounted<grpc_tls_certificate_distributor>();
auto identity_cert_distributor =
MakeRefCounted<grpc_tls_certificate_distributor>();
- XdsCertificateProvider provider("root", root_cert_distributor, "identity",
- identity_cert_distributor, {});
+ XdsCertificateProvider provider;
+ provider.UpdateRootCertNameAndDistributor("", "root", root_cert_distributor);
+ provider.UpdateIdentityCertNameAndDistributor("", "identity",
+ identity_cert_distributor);
auto* watcher = new TestCertificatesWatcher;
provider.distributor()->WatchTlsCertificates(
std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
MakeRefCounted<grpc_tls_certificate_distributor>();
auto identity_cert_distributor =
MakeRefCounted<grpc_tls_certificate_distributor>();
- XdsCertificateProvider provider("test", root_cert_distributor, "test",
- identity_cert_distributor, {});
+ XdsCertificateProvider provider;
+ provider.UpdateRootCertNameAndDistributor("", "test", root_cert_distributor);
+ provider.UpdateIdentityCertNameAndDistributor("", "test",
+ identity_cert_distributor);
auto* watcher = new TestCertificatesWatcher;
provider.distributor()->WatchTlsCertificates(
std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
TEST(XdsCertificateProviderTest,
RootCertDistributorSameAsIdentityCertDistributorDifferentCertNames) {
auto distributor = MakeRefCounted<grpc_tls_certificate_distributor>();
- XdsCertificateProvider provider("root", distributor, "identity", distributor,
- {});
+ XdsCertificateProvider provider;
+ provider.UpdateRootCertNameAndDistributor("", "root", distributor);
+ provider.UpdateIdentityCertNameAndDistributor("", "identity", distributor);
auto* watcher = new TestCertificatesWatcher;
provider.distributor()->WatchTlsCertificates(
std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
TEST(XdsCertificateProviderTest,
RootCertDistributorSameAsIdentityCertDistributorSameCertNames) {
auto distributor = MakeRefCounted<grpc_tls_certificate_distributor>();
- XdsCertificateProvider provider("", distributor, "", distributor, {});
+ XdsCertificateProvider provider;
+ provider.UpdateRootCertNameAndDistributor("", "", distributor);
+ provider.UpdateIdentityCertNameAndDistributor("", "", distributor);
auto* watcher = new TestCertificatesWatcher;
provider.distributor()->WatchTlsCertificates(
std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
TEST(XdsCertificateProviderTest, SwapOutDistributorsMultipleTimes) {
auto distributor = MakeRefCounted<grpc_tls_certificate_distributor>();
distributor->SetKeyMaterials("", kRootCert1, MakeKeyCertPairsType1());
- XdsCertificateProvider provider("", nullptr, "", nullptr, {});
+ XdsCertificateProvider provider;
auto* watcher = new TestCertificatesWatcher;
provider.distributor()->WatchTlsCertificates(
std::unique_ptr<TestCertificatesWatcher>(watcher), "", "");
::testing::HasSubstr(
"No certificate provider available for identity certificates"));
// Update root cert distributor.
- provider.UpdateRootCertNameAndDistributor("", distributor);
+ provider.UpdateRootCertNameAndDistributor("", "", distributor);
EXPECT_EQ(watcher->root_certs(), kRootCert1);
EXPECT_EQ(watcher->key_cert_pairs(), absl::nullopt);
EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
::testing::HasSubstr(
"No certificate provider available for identity certificates"));
// Update identity cert distributor
- provider.UpdateIdentityCertNameAndDistributor("", distributor);
+ provider.UpdateIdentityCertNameAndDistributor("", "", distributor);
EXPECT_EQ(watcher->root_certs(), kRootCert1);
EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
// Remove root cert provider
- provider.UpdateRootCertNameAndDistributor("", nullptr);
+ provider.UpdateRootCertNameAndDistributor("", "", nullptr);
distributor->SetKeyMaterials("", kRootCert2, MakeKeyCertPairsType2());
EXPECT_EQ(watcher->root_certs(), kRootCert1); // not updated
EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
"No certificate provider available for root certificates"));
EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
// Remove identity cert provider too
- provider.UpdateIdentityCertNameAndDistributor("", nullptr);
+ provider.UpdateIdentityCertNameAndDistributor("", "", nullptr);
distributor->SetKeyMaterials("", kRootCert1, MakeKeyCertPairsType1());
EXPECT_EQ(watcher->root_certs(), kRootCert1);
EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2()); // not updated
::testing::HasSubstr(
"No certificate provider available for identity certificates"));
// Change certificate names being watched, without any certificate updates.
- provider.UpdateRootCertNameAndDistributor("root", distributor);
- provider.UpdateIdentityCertNameAndDistributor("identity", distributor);
+ provider.UpdateRootCertNameAndDistributor("", "root", distributor);
+ provider.UpdateIdentityCertNameAndDistributor("", "identity", distributor);
EXPECT_EQ(watcher->root_certs(), kRootCert1);
EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType2());
EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
MakeRefCounted<grpc_tls_certificate_distributor>();
auto identity_cert_distributor =
MakeRefCounted<grpc_tls_certificate_distributor>();
- provider.UpdateRootCertNameAndDistributor("root", root_cert_distributor);
- provider.UpdateIdentityCertNameAndDistributor("identity",
+ provider.UpdateRootCertNameAndDistributor("", "root", root_cert_distributor);
+ provider.UpdateIdentityCertNameAndDistributor("", "identity",
identity_cert_distributor);
EXPECT_EQ(watcher->root_certs(), kRootCert2);
EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
EXPECT_EQ(watcher->root_cert_error(), GRPC_ERROR_NONE);
EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
// Change certificate names without any certificate updates.
- provider.UpdateRootCertNameAndDistributor("test", root_cert_distributor);
- provider.UpdateIdentityCertNameAndDistributor("test",
+ provider.UpdateRootCertNameAndDistributor("", "test", root_cert_distributor);
+ provider.UpdateIdentityCertNameAndDistributor("", "test",
identity_cert_distributor);
EXPECT_EQ(watcher->root_certs(), kRootCert2);
EXPECT_EQ(watcher->key_cert_pairs(), MakeKeyCertPairsType1());
EXPECT_EQ(watcher->identity_cert_error(), GRPC_ERROR_NONE);
}
-TEST(XdsCertificateProviderTest, CertificateNameNotEmpty) {
- XdsCertificateProvider provider("", nullptr, "", nullptr, {});
+TEST(XdsCertificateProviderTest, MultipleCertNames) {
+ XdsCertificateProvider provider;
+ // Start watch for "test1". There are no underlying distributors for
+ // that cert name, so it will return an error.
+ auto* watcher1 = new TestCertificatesWatcher;
+ provider.distributor()->WatchTlsCertificates(
+ std::unique_ptr<TestCertificatesWatcher>(watcher1), "test1", "test1");
+ EXPECT_EQ(watcher1->root_certs(), absl::nullopt);
+ EXPECT_EQ(watcher1->key_cert_pairs(), absl::nullopt);
+ EXPECT_THAT(grpc_error_string(watcher1->root_cert_error()),
+ ::testing::HasSubstr(
+ "No certificate provider available for root certificates"));
+ EXPECT_THAT(
+ grpc_error_string(watcher1->identity_cert_error()),
+ ::testing::HasSubstr(
+ "No certificate provider available for identity certificates"));
+ // Add distributor for "test1". This will return data to the watcher.
+ auto cert_distributor1 = MakeRefCounted<grpc_tls_certificate_distributor>();
+ cert_distributor1->SetKeyMaterials("root", kRootCert1, absl::nullopt);
+ cert_distributor1->SetKeyMaterials("identity", absl::nullopt,
+ MakeKeyCertPairsType1());
+ provider.UpdateRootCertNameAndDistributor("test1", "root", cert_distributor1);
+ provider.UpdateIdentityCertNameAndDistributor("test1", "identity",
+ cert_distributor1);
+ EXPECT_EQ(watcher1->root_certs(), kRootCert1);
+ EXPECT_EQ(watcher1->key_cert_pairs(), MakeKeyCertPairsType1());
+ EXPECT_EQ(watcher1->root_cert_error(), GRPC_ERROR_NONE);
+ EXPECT_EQ(watcher1->identity_cert_error(), GRPC_ERROR_NONE);
+ // Add distributor for "test2".
+ auto cert_distributor2 = MakeRefCounted<grpc_tls_certificate_distributor>();
+ cert_distributor2->SetKeyMaterials("root2", kRootCert2, absl::nullopt);
+ cert_distributor2->SetKeyMaterials("identity2", absl::nullopt,
+ MakeKeyCertPairsType2());
+ provider.UpdateRootCertNameAndDistributor("test2", "root2",
+ cert_distributor2);
+ provider.UpdateIdentityCertNameAndDistributor("test2", "identity2",
+ cert_distributor2);
+ // Add watcher for "test2". This one should return data immediately.
+ auto* watcher2 = new TestCertificatesWatcher;
+ provider.distributor()->WatchTlsCertificates(
+ std::unique_ptr<TestCertificatesWatcher>(watcher2), "test2", "test2");
+ EXPECT_EQ(watcher2->root_certs(), kRootCert2);
+ EXPECT_EQ(watcher2->key_cert_pairs(), MakeKeyCertPairsType2());
+ EXPECT_EQ(watcher2->root_cert_error(), GRPC_ERROR_NONE);
+ EXPECT_EQ(watcher2->identity_cert_error(), GRPC_ERROR_NONE);
+ // The presence of "test2" should not affect "test1".
+ EXPECT_EQ(watcher1->root_certs(), kRootCert1);
+ EXPECT_EQ(watcher1->key_cert_pairs(), MakeKeyCertPairsType1());
+ EXPECT_EQ(watcher1->root_cert_error(), GRPC_ERROR_NONE);
+ EXPECT_EQ(watcher1->identity_cert_error(), GRPC_ERROR_NONE);
+}
+
+TEST(XdsCertificateProviderTest, UnknownCertName) {
+ XdsCertificateProvider provider;
auto* watcher = new TestCertificatesWatcher;
provider.distributor()->WatchTlsCertificates(
std::unique_ptr<TestCertificatesWatcher>(watcher), "test", "test");
EXPECT_THAT(grpc_error_string(watcher->root_cert_error()),
- ::testing::HasSubstr("Illegal certificate name: \'test\'"));
- EXPECT_THAT(grpc_error_string(watcher->identity_cert_error()),
- ::testing::HasSubstr("Illegal certificate name: \'test\'"));
+ ::testing::HasSubstr(
+ "No certificate provider available for root certificates"));
+ EXPECT_THAT(
+ grpc_error_string(watcher->identity_cert_error()),
+ ::testing::HasSubstr(
+ "No certificate provider available for identity certificates"));
}
} // namespace
"\"access_token\"}},\"quota_project_id\":\"quota_"
"project_id\",\"client_id\":\"client_id\",\"client_secret\":\"client_"
"secret\"}");
- auto url_creds = grpc::experimental::ExternalAccountCredentials(
- url_options_string, {"scope1", "scope2"});
+ auto url_creds = grpc::ExternalAccountCredentials(url_options_string,
+ {"scope1", "scope2"});
EXPECT_TRUE(url_creds != nullptr);
// file credentials
std::string file_options_string(
"\"quota_project_id\":\"quota_"
"project_id\",\"client_id\":\"client_id\",\"client_secret\":\"client_"
"secret\"}");
- auto file_creds = grpc::experimental::ExternalAccountCredentials(
- file_options_string, {"scope1", "scope2"});
+ auto file_creds = grpc::ExternalAccountCredentials(file_options_string,
+ {"scope1", "scope2"});
EXPECT_TRUE(file_creds != nullptr);
// aws credentials
std::string aws_options_string(
"\"quota_project_id\":\"quota_"
"project_id\",\"client_id\":\"client_id\",\"client_secret\":\"client_"
"secret\"}");
- auto aws_creds = grpc::experimental::ExternalAccountCredentials(
- aws_options_string, {"scope1", "scope2"});
+ auto aws_creds = grpc::ExternalAccountCredentials(aws_options_string,
+ {"scope1", "scope2"});
EXPECT_TRUE(aws_creds != nullptr);
}
gpr_free(const_cast<char*>(c_arg.peer_cert));
}
+TEST(CredentialsTest, TlsChannelCredentialsWithDefaultRoots) {
+ grpc::experimental::TlsChannelCredentialsOptions options;
+ options.set_server_verification_option(GRPC_TLS_SERVER_VERIFICATION);
+ auto test_server_authorization_check =
+ std::make_shared<TestTlsServerAuthorizationCheck>();
+ auto server_authorization_check_config =
+ std::make_shared<TlsServerAuthorizationCheckConfig>(
+ test_server_authorization_check);
+ options.set_server_authorization_check_config(
+ server_authorization_check_config);
+ auto channel_credentials = grpc::experimental::TlsCredentials(options);
+ GPR_ASSERT(channel_credentials.get() != nullptr);
+}
+
TEST(
CredentialsTest,
TlsChannelCredentialsWithStaticDataCertificateProviderLoadingRootAndIdentity) {
auto server_authorization_check_config =
std::make_shared<TlsServerAuthorizationCheckConfig>(
test_server_authorization_check);
- grpc::experimental::TlsChannelCredentialsOptions options(
- certificate_provider);
+ grpc::experimental::TlsChannelCredentialsOptions options;
+ options.set_certificate_provider(certificate_provider);
options.watch_root_certs();
options.set_root_cert_name(kRootCertName);
options.watch_identity_key_cert_pairs();
GPR_ASSERT(channel_credentials.get() != nullptr);
}
-// ChannelCredentials should always have root credential presented.
-// Otherwise the system root certificates will be loaded, which will cause
-// failure in some tests under MacOS/Windows.
TEST(CredentialsTest,
TlsChannelCredentialsWithStaticDataCertificateProviderLoadingRootOnly) {
auto certificate_provider =
test_server_authorization_check);
GPR_ASSERT(certificate_provider != nullptr);
GPR_ASSERT(certificate_provider->c_provider() != nullptr);
- grpc::experimental::TlsChannelCredentialsOptions options(
- certificate_provider);
+ grpc::experimental::TlsChannelCredentialsOptions options;
+ options.set_certificate_provider(certificate_provider);
options.watch_root_certs();
options.set_root_cert_name(kRootCertName);
options.set_server_verification_option(GRPC_TLS_SERVER_VERIFICATION);
TEST(
CredentialsTest,
+ TlsChannelCredentialsWithDefaultRootsAndStaticDataCertificateProviderLoadingIdentityOnly) {
+ experimental::IdentityKeyCertPair key_cert_pair;
+ key_cert_pair.private_key = kIdentityCertPrivateKey;
+ key_cert_pair.certificate_chain = kIdentityCertContents;
+ std::vector<experimental::IdentityKeyCertPair> identity_key_cert_pairs;
+ identity_key_cert_pairs.emplace_back(key_cert_pair);
+ auto certificate_provider =
+ std::make_shared<StaticDataCertificateProvider>(identity_key_cert_pairs);
+ auto test_server_authorization_check =
+ std::make_shared<TestTlsServerAuthorizationCheck>();
+ auto server_authorization_check_config =
+ std::make_shared<TlsServerAuthorizationCheckConfig>(
+ test_server_authorization_check);
+ grpc::experimental::TlsChannelCredentialsOptions options;
+ options.set_certificate_provider(certificate_provider);
+ options.watch_identity_key_cert_pairs();
+ options.set_identity_cert_name(kIdentityCertName);
+ options.set_server_verification_option(GRPC_TLS_SERVER_VERIFICATION);
+ options.set_server_authorization_check_config(
+ server_authorization_check_config);
+ auto channel_credentials = grpc::experimental::TlsCredentials(options);
+ GPR_ASSERT(channel_credentials.get() != nullptr);
+}
+
+TEST(
+ CredentialsTest,
TlsChannelCredentialsWithFileWatcherCertificateProviderLoadingRootAndIdentity) {
auto certificate_provider = std::make_shared<FileWatcherCertificateProvider>(
SERVER_KEY_PATH, SERVER_CERT_PATH, CA_CERT_PATH, 1);
- grpc::experimental::TlsChannelCredentialsOptions options(
- certificate_provider);
+ grpc::experimental::TlsChannelCredentialsOptions options;
+ options.set_certificate_provider(certificate_provider);
options.watch_root_certs();
options.set_root_cert_name(kRootCertName);
options.watch_identity_key_cert_pairs();
GPR_ASSERT(channel_credentials.get() != nullptr);
}
-// ChannelCredentials should always have root credential presented.
-// Otherwise the system root certificates will be loaded, which will cause
-// failure in some tests under MacOS/Windows.
TEST(CredentialsTest,
TlsChannelCredentialsWithFileWatcherCertificateProviderLoadingRootOnly) {
auto certificate_provider =
std::make_shared<FileWatcherCertificateProvider>(CA_CERT_PATH, 1);
- grpc::experimental::TlsChannelCredentialsOptions options(
- certificate_provider);
+ grpc::experimental::TlsChannelCredentialsOptions options;
+ options.set_certificate_provider(certificate_provider);
options.watch_root_certs();
options.set_root_cert_name(kRootCertName);
options.set_server_verification_option(GRPC_TLS_SERVER_VERIFICATION);
for (int i = 0; i < kNumThreads; i++) {
threads.emplace_back(new std::thread(TryConnectAndDestroy));
}
- for (int i = 0; i < threads.size(); i++) {
+ for (size_t i = 0; i < threads.size(); i++) {
threads[i]->join();
}
grpc_shutdown();
#include "src/core/lib/iomgr/timer_manager.h"
#include "test/core/util/test_config.h"
+#include "absl/time/time.h"
+
extern char** environ;
#ifdef GPR_ANDROID
run_cmd(cmd.str().c_str());
});
gpr_timespec before = gpr_now(GPR_CLOCK_MONOTONIC);
- int timedout = cond.Wait(
- &mu, grpc_millis_to_timespec(kWaitTimeMs, GPR_CLOCK_REALTIME));
+ bool timedout = cond.WaitWithTimeout(&mu, absl::Milliseconds(kWaitTimeMs));
gpr_timespec after = gpr_now(GPR_CLOCK_MONOTONIC);
int32_t elapsed_ms = gpr_time_to_millis(gpr_time_sub(after, before));
gpr_log(GPR_DEBUG, "After wait, timedout = %d elapsed_ms = %d", timedout,
"//src/proto/grpc/testing/xds:lds_rds_for_test_proto",
"//src/proto/grpc/testing/xds:lrs_for_test_proto",
"//src/proto/grpc/testing/xds/v3:ads_proto",
+ "//src/proto/grpc/testing/xds/v3:aggregate_cluster_proto",
"//src/proto/grpc/testing/xds/v3:cluster_proto",
"//src/proto/grpc/testing/xds/v3:discovery_proto",
"//src/proto/grpc/testing/xds/v3:endpoint_proto",
)
grpc_cc_test(
+ name = "context_allocator_end2end_test",
+ srcs = ["context_allocator_end2end_test.cc"],
+ external_deps = [
+ "gtest",
+ ],
+ deps = [
+ ":test_service_impl",
+ "//:gpr",
+ "//:grpc",
+ "//:grpc++",
+ "//src/proto/grpc/testing:echo_messages_proto",
+ "//src/proto/grpc/testing:echo_proto",
+ "//src/proto/grpc/testing:simple_messages_proto",
+ "//test/core/util:grpc_test_util",
+ "//test/cpp/util:test_util",
+ ],
+)
+
+grpc_cc_test(
name = "port_sharing_end2end_test",
srcs = ["port_sharing_end2end_test.cc"],
external_deps = [
rpc_state[index].done = true;
rpc_state[index].cv.notify_all();
// Call the next level of nesting if possible
- if (index + 1 < rpc_state.size()) {
+ if (index + 1 < int(rpc_state.size())) {
nested_call(index + 1);
}
});
--- /dev/null
+/*
+ *
+ * Copyright 2020 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.
+ *
+ */
+
+#include <grpc/impl/codegen/log.h>
+#include <grpcpp/channel.h>
+#include <grpcpp/client_context.h>
+#include <grpcpp/create_channel.h>
+#include <grpcpp/server.h>
+#include <grpcpp/server_builder.h>
+#include <grpcpp/server_context.h>
+#include <grpcpp/support/client_callback.h>
+#include <grpcpp/support/message_allocator.h>
+#include <gtest/gtest.h>
+
+#include <algorithm>
+#include <atomic>
+#include <condition_variable>
+#include <functional>
+#include <memory>
+#include <mutex>
+#include <sstream>
+#include <thread>
+
+#include "src/core/lib/iomgr/iomgr.h"
+#include "src/proto/grpc/testing/echo.grpc.pb.h"
+#include "test/core/util/port.h"
+#include "test/core/util/test_config.h"
+#include "test/cpp/end2end/test_service_impl.h"
+#include "test/cpp/util/test_credentials_provider.h"
+
+// MAYBE_SKIP_TEST is a macro to determine if this particular test configuration
+// should be skipped based on a decision made at SetUp time. In particular, any
+// callback tests can only be run if the iomgr can run in the background or if
+// the transport is in-process.
+#define MAYBE_SKIP_TEST \
+ do { \
+ if (do_not_test_) { \
+ return; \
+ } \
+ } while (0)
+
+namespace grpc {
+namespace testing {
+namespace {
+
+enum class Protocol { INPROC, TCP };
+
+#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL
+using experimental::GenericCallbackServerContext;
+#endif
+
+class TestScenario {
+ public:
+ TestScenario(Protocol protocol, const std::string& creds_type)
+ : protocol(protocol), credentials_type(creds_type) {}
+ void Log() const;
+ Protocol protocol;
+ const std::string credentials_type;
+};
+
+static std::ostream& operator<<(std::ostream& out,
+ const TestScenario& scenario) {
+ return out << "TestScenario{protocol="
+ << (scenario.protocol == Protocol::INPROC ? "INPROC" : "TCP")
+ << "," << scenario.credentials_type << "}";
+}
+
+void TestScenario::Log() const {
+ std::ostringstream out;
+ out << *this;
+ gpr_log(GPR_INFO, "%s", out.str().c_str());
+}
+
+class ContextAllocatorEnd2endTestBase
+ : public ::testing::TestWithParam<TestScenario> {
+ protected:
+ static void SetUpTestCase() { grpc_init(); }
+ static void TearDownTestCase() { grpc_shutdown(); }
+ ContextAllocatorEnd2endTestBase() {}
+
+ ~ContextAllocatorEnd2endTestBase() override = default;
+
+ void SetUp() override {
+ GetParam().Log();
+ if (GetParam().protocol == Protocol::TCP) {
+ if (!grpc_iomgr_run_in_background()) {
+ do_not_test_ = true;
+ return;
+ }
+ }
+ }
+
+ void CreateServer(std::unique_ptr<grpc::ContextAllocator> context_allocator) {
+ ServerBuilder builder;
+
+ auto server_creds = GetCredentialsProvider()->GetServerCredentials(
+ GetParam().credentials_type);
+ if (GetParam().protocol == Protocol::TCP) {
+ picked_port_ = grpc_pick_unused_port_or_die();
+ server_address_ << "localhost:" << picked_port_;
+ builder.AddListeningPort(server_address_.str(), server_creds);
+ }
+ builder.experimental().SetContextAllocator(std::move(context_allocator));
+ builder.RegisterService(&callback_service_);
+
+ server_ = builder.BuildAndStart();
+ }
+
+ void DestroyServer() {
+ if (server_) {
+ server_->Shutdown();
+ server_.reset();
+ }
+ }
+
+ void ResetStub() {
+ ChannelArguments args;
+ auto channel_creds = GetCredentialsProvider()->GetChannelCredentials(
+ GetParam().credentials_type, &args);
+ switch (GetParam().protocol) {
+ case Protocol::TCP:
+ channel_ = ::grpc::CreateCustomChannel(server_address_.str(),
+ channel_creds, args);
+ break;
+ case Protocol::INPROC:
+ channel_ = server_->InProcessChannel(args);
+ break;
+ default:
+ assert(false);
+ }
+ stub_ = EchoTestService::NewStub(channel_);
+ }
+
+ void TearDown() override {
+ DestroyServer();
+ if (picked_port_ > 0) {
+ grpc_recycle_unused_port(picked_port_);
+ }
+ }
+
+ void SendRpcs(int num_rpcs) {
+ std::string test_string("");
+ for (int i = 0; i < num_rpcs; i++) {
+ EchoRequest request;
+ EchoResponse response;
+ ClientContext cli_ctx;
+
+ test_string += std::string(1024, 'x');
+ request.set_message(test_string);
+ std::string val;
+ cli_ctx.set_compression_algorithm(GRPC_COMPRESS_GZIP);
+
+ std::mutex mu;
+ std::condition_variable cv;
+ bool done = false;
+ stub_->experimental_async()->Echo(
+ &cli_ctx, &request, &response,
+ [&request, &response, &done, &mu, &cv, val](Status s) {
+ GPR_ASSERT(s.ok());
+
+ EXPECT_EQ(request.message(), response.message());
+ std::lock_guard<std::mutex> l(mu);
+ done = true;
+ cv.notify_one();
+ });
+ std::unique_lock<std::mutex> l(mu);
+ while (!done) {
+ cv.wait(l);
+ }
+ }
+ }
+
+ bool do_not_test_{false};
+ int picked_port_{0};
+ std::shared_ptr<Channel> channel_;
+ std::unique_ptr<EchoTestService::Stub> stub_;
+ CallbackTestServiceImpl callback_service_;
+ std::unique_ptr<Server> server_;
+ std::ostringstream server_address_;
+};
+
+class DefaultContextAllocatorTest : public ContextAllocatorEnd2endTestBase {};
+
+TEST_P(DefaultContextAllocatorTest, SimpleRpc) {
+ MAYBE_SKIP_TEST;
+ const int kRpcCount = 10;
+ CreateServer(nullptr);
+ ResetStub();
+ SendRpcs(kRpcCount);
+}
+
+class NullContextAllocatorTest : public ContextAllocatorEnd2endTestBase {
+ public:
+ class NullAllocator : public grpc::ContextAllocator {
+ public:
+ NullAllocator(std::atomic<int>* allocation_count,
+ std::atomic<int>* deallocation_count)
+ : allocation_count_(allocation_count),
+ deallocation_count_(deallocation_count) {}
+ grpc::CallbackServerContext* NewCallbackServerContext() override {
+ allocation_count_->fetch_add(1, std::memory_order_relaxed);
+ return nullptr;
+ }
+
+ GenericCallbackServerContext* NewGenericCallbackServerContext() override {
+ allocation_count_->fetch_add(1, std::memory_order_relaxed);
+ return nullptr;
+ }
+
+ void Release(
+ grpc::CallbackServerContext* /*callback_server_context*/) override {
+ deallocation_count_->fetch_add(1, std::memory_order_relaxed);
+ }
+
+ void Release(
+ GenericCallbackServerContext* /*generic_callback_server_context*/)
+ override {
+ deallocation_count_->fetch_add(1, std::memory_order_relaxed);
+ }
+
+ std::atomic<int>* allocation_count_;
+ std::atomic<int>* deallocation_count_;
+ };
+};
+
+TEST_P(NullContextAllocatorTest, UnaryRpc) {
+ MAYBE_SKIP_TEST;
+ const int kRpcCount = 10;
+ std::atomic<int> allocation_count{0};
+ std::atomic<int> deallocation_count{0};
+ std::unique_ptr<NullAllocator> allocator(
+ new NullAllocator(&allocation_count, &deallocation_count));
+ CreateServer(std::move(allocator));
+ ResetStub();
+ SendRpcs(kRpcCount);
+ // messages_deallocaton_count is updated in Release after server side
+ // OnDone.
+ DestroyServer();
+ EXPECT_EQ(kRpcCount, allocation_count);
+ EXPECT_EQ(kRpcCount, deallocation_count);
+}
+
+class SimpleContextAllocatorTest : public ContextAllocatorEnd2endTestBase {
+ public:
+ class SimpleAllocator : public grpc::ContextAllocator {
+ public:
+ SimpleAllocator(std::atomic<int>* allocation_count,
+ std::atomic<int>* deallocation_count)
+ : allocation_count_(allocation_count),
+ deallocation_count_(deallocation_count) {}
+ grpc::CallbackServerContext* NewCallbackServerContext() override {
+ allocation_count_->fetch_add(1, std::memory_order_relaxed);
+ return new grpc::CallbackServerContext();
+ }
+ GenericCallbackServerContext* NewGenericCallbackServerContext() override {
+ allocation_count_->fetch_add(1, std::memory_order_relaxed);
+ return new GenericCallbackServerContext();
+ }
+
+ void Release(
+ grpc::CallbackServerContext* callback_server_context) override {
+ deallocation_count_->fetch_add(1, std::memory_order_relaxed);
+ delete callback_server_context;
+ }
+
+ void Release(GenericCallbackServerContext* generic_callback_server_context)
+ override {
+ deallocation_count_->fetch_add(1, std::memory_order_relaxed);
+ delete generic_callback_server_context;
+ }
+
+ std::atomic<int>* allocation_count_;
+ std::atomic<int>* deallocation_count_;
+ };
+};
+
+TEST_P(SimpleContextAllocatorTest, UnaryRpc) {
+ MAYBE_SKIP_TEST;
+ const int kRpcCount = 10;
+ std::atomic<int> allocation_count{0};
+ std::atomic<int> deallocation_count{0};
+ std::unique_ptr<SimpleAllocator> allocator(
+ new SimpleAllocator(&allocation_count, &deallocation_count));
+ CreateServer(std::move(allocator));
+ ResetStub();
+ SendRpcs(kRpcCount);
+ // messages_deallocaton_count is updated in Release after server side
+ // OnDone.
+ DestroyServer();
+ EXPECT_EQ(kRpcCount, allocation_count);
+ EXPECT_EQ(kRpcCount, deallocation_count);
+}
+
+std::vector<TestScenario> CreateTestScenarios(bool test_insecure) {
+ std::vector<TestScenario> scenarios;
+ std::vector<std::string> credentials_types{
+ GetCredentialsProvider()->GetSecureCredentialsTypeList()};
+ auto insec_ok = [] {
+ // Only allow insecure credentials type when it is registered with the
+ // provider. User may create providers that do not have insecure.
+ return GetCredentialsProvider()->GetChannelCredentials(
+ kInsecureCredentialsType, nullptr) != nullptr;
+ };
+ if (test_insecure && insec_ok()) {
+ credentials_types.push_back(kInsecureCredentialsType);
+ }
+ GPR_ASSERT(!credentials_types.empty());
+
+ Protocol parr[]{Protocol::INPROC, Protocol::TCP};
+ for (Protocol p : parr) {
+ for (const auto& cred : credentials_types) {
+ if (p == Protocol::INPROC &&
+ (cred != kInsecureCredentialsType || !insec_ok())) {
+ continue;
+ }
+ scenarios.emplace_back(p, cred);
+ }
+ }
+ return scenarios;
+}
+
+// TODO(ddyihai): adding client streaming/server streaming/bidi streaming
+// test.
+
+INSTANTIATE_TEST_SUITE_P(DefaultContextAllocatorTest,
+ DefaultContextAllocatorTest,
+ ::testing::ValuesIn(CreateTestScenarios(true)));
+INSTANTIATE_TEST_SUITE_P(NullContextAllocatorTest, NullContextAllocatorTest,
+ ::testing::ValuesIn(CreateTestScenarios(true)));
+INSTANTIATE_TEST_SUITE_P(SimpleContextAllocatorTest, SimpleContextAllocatorTest,
+ ::testing::ValuesIn(CreateTestScenarios(true)));
+
+} // namespace
+} // namespace testing
+} // namespace grpc
+
+int main(int argc, char** argv) {
+ grpc::testing::TestEnvironment env(argc, argv);
+ ::testing::InitGoogleTest(&argc, argv);
+ int ret = RUN_ALL_TESTS();
+ return ret;
+}
gpr_tls_destroy(&g_is_nonblocking_poll);
return ret;
#else // GRPC_POSIX_SOCKET
+ (void)argc;
+ (void)argv;
return 0;
#endif // GRPC_POSIX_SOCKET
}
auto stub = EchoTestService::NewStub(
grpc::CreateChannel(server_address_, InsecureChannelCredentials()));
std::string lb_token = lb_id + lb_tag;
- for (int i = 0; i < num_requests; ++i) {
+ for (size_t i = 0; i < num_requests; ++i) {
ClientContext ctx;
if (!lb_token.empty()) ctx.AddMetadata(GRPC_LB_TOKEN_MD_KEY, lb_token);
EchoRequest request;
#include <gmock/gmock.h>
#include <gtest/gtest.h>
+#include "absl/functional/bind_front.h"
#include "absl/memory/memory.h"
#include "absl/strings/str_cat.h"
+#include "absl/strings/str_join.h"
#include "absl/types/optional.h"
#include <grpc/grpc.h>
#include <grpcpp/security/tls_certificate_provider.h>
#include <grpcpp/server.h>
#include <grpcpp/server_builder.h>
+#include <grpcpp/xds_server_builder.h>
#include "src/core/ext/filters/client_channel/backup_poller.h"
+#include "src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h"
#include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
#include "src/core/ext/filters/client_channel/server_address.h"
#include "src/core/ext/xds/certificate_provider_registry.h"
#include "src/core/ext/xds/xds_client.h"
#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/gpr/env.h"
+#include "src/core/lib/gpr/time_precise.h"
#include "src/core/lib/gpr/tmpfile.h"
#include "src/core/lib/gprpp/ref_counted_ptr.h"
#include "src/core/lib/gprpp/sync.h"
#include "src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.h"
#include "src/proto/grpc/testing/xds/v3/ads.grpc.pb.h"
+#include "src/proto/grpc/testing/xds/v3/aggregate_cluster.grpc.pb.h"
#include "src/proto/grpc/testing/xds/v3/cluster.grpc.pb.h"
#include "src/proto/grpc/testing/xds/v3/discovery.grpc.pb.h"
#include "src/proto/grpc/testing/xds/v3/endpoint.grpc.pb.h"
using ::envoy::config::cluster::v3::CircuitBreakers;
using ::envoy::config::cluster::v3::Cluster;
+using ::envoy::config::cluster::v3::CustomClusterType;
using ::envoy::config::cluster::v3::RoutingPriority;
using ::envoy::config::endpoint::v3::ClusterLoadAssignment;
using ::envoy::config::endpoint::v3::HealthStatus;
using ::envoy::config::listener::v3::Listener;
using ::envoy::config::route::v3::RouteConfiguration;
+using ::envoy::extensions::clusters::aggregate::v3::ClusterConfig;
using ::envoy::extensions::filters::network::http_connection_manager::v3::
HttpConnectionManager;
+using ::envoy::extensions::transport_sockets::tls::v3::DownstreamTlsContext;
using ::envoy::extensions::transport_sockets::tls::v3::UpstreamTlsContext;
using ::envoy::type::matcher::v3::StringMatcher;
using ::envoy::type::v3::FractionalPercent;
std::map<std::string, uint64_t> dropped_requests_;
};
-// TODO(roth) move all of the code that deals with default resource contents out
-// of AdsServiceImpl and into XdsEnd2EndTest.
class AdsServiceImpl : public std::enable_shared_from_this<AdsServiceImpl> {
public:
struct ResponseState {
void NotifyDoneWithAdsCallLocked() {
if (!ads_done_) {
ads_done_ = true;
- ads_cond_.Broadcast();
+ ads_cond_.SignalAll();
}
}
// If we didn't find anything to do, delay before the next loop
// iteration; otherwise, check whether we should exit and then
// immediately continue.
- gpr_timespec deadline =
- grpc_timeout_milliseconds_to_deadline(did_work ? 0 : 10);
+ absl::Duration timeout = absl::Milliseconds(did_work ? 0 : 10);
{
grpc_core::MutexLock lock(&parent_->ads_mu_);
- if (!parent_->ads_cond_.WaitUntil(
- &parent_->ads_mu_, [this] { return parent_->ads_done_; },
- deadline)) {
+ if (!grpc_core::WaitUntilWithTimeout(
+ &parent_->ads_cond_, &parent_->ads_mu_,
+ [this] { return parent_->ads_done_; }, timeout)) {
break;
}
}
SubscriptionMap* subscription_map,
SentState* sent_state,
absl::optional<DiscoveryResponse>* response) {
- // Determine client resource type version.
- int client_resource_type_version = 0;
- if (!request.version_info().empty()) {
- GPR_ASSERT(absl::SimpleAtoi(request.version_info(),
- &client_resource_type_version));
- }
// Check the nonce sent by the client, if any.
// (This will be absent on the first request on a stream.)
if (request.response_nonce().empty()) {
+ int client_resource_type_version = 0;
+ if (!request.version_info().empty()) {
+ GPR_ASSERT(absl::SimpleAtoi(request.version_info(),
+ &client_resource_type_version));
+ }
EXPECT_GE(client_resource_type_version,
parent_->resource_type_min_versions_[v3_resource_type])
<< "resource_type: " << v3_resource_type;
// Check for ACK or NACK.
auto it = parent_->resource_type_response_state_.find(v3_resource_type);
if (it != parent_->resource_type_response_state_.end()) {
- if (client_resource_type_version ==
- sent_state->resource_type_version) {
+ if (!request.has_error_detail()) {
it->second.state = ResponseState::ACKED;
it->second.error_message.clear();
gpr_log(GPR_INFO,
&subscription_state, &resource_state,
update_queue) ||
ClientNeedsResourceUpdate(resource_type_state, resource_state,
- client_resource_type_version,
- &subscription_state)) {
+ sent_state->resource_type_version)) {
gpr_log(GPR_INFO, "ADS[%p]: Sending update for type=%s name=%s", this,
request.type_url().c_str(), resource_name.c_str());
resources_added_to_response.emplace(resource_name);
auto& resource_name_map = resource_type_state.resource_name_map;
auto it = subscription_name_map.find(resource_name);
if (it != subscription_name_map.end()) {
- SubscriptionState& subscription_state = it->second;
ResourceState& resource_state = resource_name_map[resource_name];
if (ClientNeedsResourceUpdate(resource_type_state, resource_state,
- sent_state->resource_type_version,
- &subscription_state)) {
+ sent_state->resource_type_version)) {
gpr_log(GPR_INFO, "ADS[%p]: Sending update for type=%s name=%s", this,
resource_type.c_str(), resource_name.c_str());
response->emplace();
}
static void CheckBuildVersion(
- const ::envoy::service::discovery::v3::DiscoveryRequest& request) {}
+ const ::envoy::service::discovery::v3::DiscoveryRequest& /*request*/) {}
AdsServiceImpl* parent_;
const bool is_v2_;
// the resource.
static bool ClientNeedsResourceUpdate(
const ResourceTypeState& resource_type_state,
- const ResourceState& resource_state, int client_resource_type_version,
- SubscriptionState* subscription_state) {
+ const ResourceState& resource_state, int client_resource_type_version) {
return client_resource_type_version <
resource_type_state.resource_type_version &&
resource_state.resource_type_version <=
grpc_core::CondVar cv;
if (result_queue_.empty()) {
load_report_cond_ = &cv;
- load_report_cond_->WaitUntil(&load_report_mu_,
- [this] { return !result_queue_.empty(); });
+ grpc_core::WaitUntil(load_report_cond_, &load_report_mu_,
+ [this] { return !result_queue_.empty(); });
load_report_cond_ = nullptr;
}
std::vector<ClientStats> result = std::move(result_queue_.front());
}
// Wait until notified done.
grpc_core::MutexLock lock(&parent_->lrs_mu_);
- parent_->lrs_cv_.WaitUntil(&parent_->lrs_mu_,
- [this] { return parent_->lrs_done_; });
+ grpc_core::WaitUntil(&parent_->lrs_cv_, &parent_->lrs_mu_,
+ [this] { return parent_->lrs_done_; });
}
gpr_log(GPR_INFO, "LRS[%p]: StreamLoadStats done", this);
return Status::OK;
void NotifyDoneWithLrsCallLocked() {
if (!lrs_done_) {
lrs_done_ = true;
- lrs_cv_.Broadcast();
+ lrs_cv_.SignalAll();
}
}
const char* name() const override { return name_; }
grpc_core::RefCountedPtr<grpc_core::CertificateProviderFactory::Config>
- CreateCertificateProviderConfig(const grpc_core::Json& config_json,
- grpc_error** error) override {
+ CreateCertificateProviderConfig(const grpc_core::Json& /*config_json*/,
+ grpc_error** /*error*/) override {
return grpc_core::MakeRefCounted<Config>(name_);
}
grpc_core::RefCountedPtr<grpc_tls_certificate_provider>
CreateCertificateProvider(
grpc_core::RefCountedPtr<grpc_core::CertificateProviderFactory::Config>
- config) override {
+ /*config*/) override {
if (*cert_data_map_ == nullptr) return nullptr;
return grpc_core::MakeRefCounted<FakeCertificateProvider>(**cert_data_map_);
}
return channel_creds;
}
+namespace {
+
+void* response_generator_arg_copy(void* p) {
+ auto* generator = static_cast<grpc_core::FakeResolverResponseGenerator*>(p);
+ generator->Ref().release();
+ return p;
+}
+
+void response_generator_arg_destroy(void* p) {
+ auto* generator = static_cast<grpc_core::FakeResolverResponseGenerator*>(p);
+ generator->Unref();
+}
+
+int response_generator_cmp(void* a, void* b) { return GPR_ICMP(a, b); }
+
+const grpc_arg_pointer_vtable
+ kLogicalDnsClusterResolverResponseGeneratorVtable = {
+ response_generator_arg_copy, response_generator_arg_destroy,
+ response_generator_cmp};
+
+} // namespace
+
class XdsEnd2endTest : public ::testing::TestWithParam<TestType> {
protected:
XdsEnd2endTest(size_t num_backends, size_t num_balancers,
- int client_load_reporting_interval_seconds = 100)
+ int client_load_reporting_interval_seconds = 100,
+ bool use_xds_enabled_server = false,
+ bool bootstrap_contents_from_env_var = false)
: num_backends_(num_backends),
num_balancers_(num_balancers),
client_load_reporting_interval_seconds_(
- client_load_reporting_interval_seconds) {}
-
- static void SetUpTestCase() {
- // Make the backup poller poll very frequently in order to pick up
- // updates from all the subchannels's FDs.
- GPR_GLOBAL_CONFIG_SET(grpc_client_channel_backup_poll_interval_ms, 1);
-#if TARGET_OS_IPHONE
- // Workaround Apple CFStream bug
- gpr_setenv("grpc_cfstream", "0");
-#endif
- grpc_init();
- }
-
- static void TearDownTestCase() { grpc_shutdown(); }
+ client_load_reporting_interval_seconds),
+ use_xds_enabled_server_(use_xds_enabled_server),
+ bootstrap_contents_from_env_var_(bootstrap_contents_from_env_var) {}
void SetUp() override {
- gpr_setenv("GRPC_XDS_EXPERIMENTAL_V3_SUPPORT", "true");
- gpr_setenv("GRPC_XDS_BOOTSTRAP",
- GetParam().use_v2() ? g_bootstrap_file_v2 : g_bootstrap_file_v3);
+ if (bootstrap_contents_from_env_var_) {
+ gpr_setenv("GRPC_XDS_BOOTSTRAP_CONFIG",
+ GetParam().use_v2() ? kBootstrapFileV2 : kBootstrapFileV3);
+ } else {
+ gpr_setenv("GRPC_XDS_BOOTSTRAP", GetParam().use_v2()
+ ? g_bootstrap_file_v2
+ : g_bootstrap_file_v3);
+ }
g_port_saver->Reset();
bool localhost_resolves_to_ipv4 = false;
bool localhost_resolves_to_ipv6 = false;
xds_channel_args_to_add_.emplace_back(
grpc_core::FakeResolverResponseGenerator::MakeChannelArg(
lb_channel_response_generator_.get()));
+ // Inject xDS logical cluster resolver response generator.
+ logical_dns_cluster_resolver_response_generator_ =
+ grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
if (xds_resource_does_not_exist_timeout_ms_ > 0) {
xds_channel_args_to_add_.emplace_back(grpc_channel_arg_integer_create(
const_cast<char*>(GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS),
}
// Start the backends.
for (size_t i = 0; i < num_backends_; ++i) {
- backends_.emplace_back(new BackendServerThread);
+ backends_.emplace_back(new BackendServerThread(use_xds_enabled_server_));
backends_.back()->Start();
}
// Start the load balancers.
// Clear global xDS channel args, since they will go out of scope
// when this test object is destroyed.
grpc_core::internal::SetXdsChannelArgsForTest(nullptr);
+ gpr_unsetenv("GRPC_XDS_BOOTSTRAP");
+ gpr_unsetenv("GRPC_XDS_BOOTSTRAP_CONFIG");
}
void StartAllBackends() {
args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
response_generator);
}
+ args.SetPointerWithVtable(
+ GRPC_ARG_XDS_LOGICAL_DNS_CLUSTER_FAKE_RESOLVER_RESPONSE_GENERATOR,
+ logical_dns_cluster_resolver_response_generator_.get(),
+ &kLogicalDnsClusterResolverResponseGeneratorVtable);
std::string uri = absl::StrCat(
GetParam().use_xds_resolver() ? "xds" : "fake", ":///", server_name);
std::shared_ptr<ChannelCredentials> channel_creds =
protected:
class ServerThread {
public:
- ServerThread() : port_(g_port_saver->GetPort()) {}
+ explicit ServerThread(bool use_xds_enabled_server = false)
+ : port_(g_port_saver->GetPort()),
+ use_xds_enabled_server_(use_xds_enabled_server) {}
virtual ~ServerThread(){};
void Start() {
grpc_core::MutexLock lock(mu);
std::ostringstream server_address;
server_address << "localhost:" << port_;
- ServerBuilder builder;
- builder.AddListeningPort(server_address.str(), Credentials());
- RegisterAllServices(&builder);
- server_ = builder.BuildAndStart();
+ if (use_xds_enabled_server_) {
+ experimental::XdsServerBuilder builder;
+ builder.AddListeningPort(server_address.str(), Credentials());
+ RegisterAllServices(&builder);
+ server_ = builder.BuildAndStart();
+ } else {
+ ServerBuilder builder;
+ builder.AddListeningPort(server_address.str(), Credentials());
+ RegisterAllServices(&builder);
+ server_ = builder.BuildAndStart();
+ }
cond->Signal();
}
int port() const { return port_; }
+ bool use_xds_enabled_server() const { return use_xds_enabled_server_; }
+
private:
virtual void RegisterAllServices(ServerBuilder* builder) = 0;
virtual void StartAllServices() = 0;
std::unique_ptr<Server> server_;
std::unique_ptr<std::thread> thread_;
bool running_ = false;
+ const bool use_xds_enabled_server_;
};
class BackendServerThread : public ServerThread {
public:
+ explicit BackendServerThread(bool use_xds_enabled_server)
+ : ServerThread(use_xds_enabled_server) {}
+
BackendServiceImpl<::grpc::testing::EchoTestService::Service>*
backend_service() {
return &backend_service_;
std::shared_ptr<ServerCredentials> Credentials() override {
if (GetParam().use_xds_credentials()) {
- std::string root_cert = ReadFile(kCaCertPath);
- std::string identity_cert = ReadFile(kServerCertPath);
- std::string private_key = ReadFile(kServerKeyPath);
- std::vector<experimental::IdentityKeyCertPair> identity_key_cert_pairs =
- {{private_key, identity_cert}};
- auto certificate_provider =
- std::make_shared<grpc::experimental::StaticDataCertificateProvider>(
- root_cert, identity_key_cert_pairs);
- grpc::experimental::TlsServerCredentialsOptions options(
- certificate_provider);
- options.watch_root_certs();
- options.watch_identity_key_cert_pairs();
- options.set_cert_request_type(
- GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY);
- return grpc::experimental::TlsServerCredentials(options);
+ if (use_xds_enabled_server()) {
+ // We are testing server's use of XdsServerCredentials
+ return experimental::XdsServerCredentials(
+ InsecureServerCredentials());
+ } else {
+ // We are testing client's use of XdsCredentials
+ std::string root_cert = ReadFile(kCaCertPath);
+ std::string identity_cert = ReadFile(kServerCertPath);
+ std::string private_key = ReadFile(kServerKeyPath);
+ std::vector<experimental::IdentityKeyCertPair>
+ identity_key_cert_pairs = {{private_key, identity_cert}};
+ auto certificate_provider = std::make_shared<
+ grpc::experimental::StaticDataCertificateProvider>(
+ root_cert, identity_key_cert_pairs);
+ grpc::experimental::TlsServerCredentialsOptions options(
+ certificate_provider);
+ options.watch_root_certs();
+ options.watch_identity_key_cert_pairs();
+ options.set_cert_request_type(
+ GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY);
+ return grpc::experimental::TlsServerCredentials(options);
+ }
}
return ServerThread::Credentials();
}
response_generator_;
grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator>
lb_channel_response_generator_;
+ grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator>
+ logical_dns_cluster_resolver_response_generator_;
int xds_resource_does_not_exist_timeout_ms_ = 0;
absl::InlinedVector<grpc_arg, 2> xds_channel_args_to_add_;
grpc_channel_args xds_channel_args_;
Listener default_listener_;
RouteConfiguration default_route_config_;
Cluster default_cluster_;
+ bool use_xds_enabled_server_;
+ bool bootstrap_contents_from_env_var_;
};
class BasicTest : public XdsEnd2endTest {
const auto& response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "Listener has no ApiListener.");
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr("Listener has neither address nor ApiListener"));
}
// Tests that LDS client should send a NACK if the route_specifier in the
const auto& response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "HttpConnectionManager neither has inlined route_config nor RDS.");
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr(
+ "HttpConnectionManager neither has inlined route_config nor RDS."));
}
// Tests that LDS client should send a NACK if the rds message in the
const auto& response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "HttpConnectionManager missing config_source for RDS.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "HttpConnectionManager missing config_source for RDS."));
}
// Tests that LDS client should send a NACK if the rds message in the
const auto& response_state =
balancers_[0]->ads_service()->lds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "HttpConnectionManager ConfigSource for RDS does not specify ADS.");
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr(
+ "HttpConnectionManager ConfigSource for RDS does not specify ADS."));
+}
+
+// Tests that the NACK for multiple bad LDS resources includes both errors.
+TEST_P(LdsTest, MultipleBadResources) {
+ constexpr char kServerName2[] = "server.other.com";
+ auto listener = default_listener_;
+ listener.clear_api_listener();
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ listener.set_name(kServerName2);
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ SetNextResolutionForLbChannelAllBalancers();
+ CheckRpcSendFailure();
+ // Need to create a second channel to subscribe to a second LDS resource.
+ auto channel2 = CreateChannel(0, kServerName2);
+ auto stub2 = grpc::testing::EchoTestService::NewStub(channel2);
+ ClientContext context;
+ EchoRequest request;
+ request.set_message(kRequestMessage);
+ EchoResponse response;
+ grpc::Status status = stub2->Echo(&context, request, &response);
+ EXPECT_FALSE(status.ok());
+ const auto& response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::AllOf(
+ ::testing::HasSubstr(absl::StrCat(
+ kServerName, ": Listener has neither address nor ApiListener")),
+ ::testing::HasSubstr(
+ absl::StrCat(kServerName2,
+ ": Listener has neither address nor ApiListener"))));
}
using LdsRdsTest = BasicTest;
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Tests that LDS client should send a ACK if route match has a prefix
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Tests that LDS client should ignore route which has a prefix
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Tests that LDS client should ignore route which has a prefix
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Tests that LDS client should ignore route which has path
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Tests that LDS client should ignore route which has path
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Tests that LDS client should ignore route which has path
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Tests that LDS client should ignore route which has path
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Tests that LDS client should ignore route which has path
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Tests that LDS client should ignore route which has path
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No valid routes specified.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No valid routes specified."));
}
// Test that LDS client should reject route which has invalid path regex.
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "Invalid regex string specified in path matcher.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "path matcher: Invalid regex string specified in matcher."));
}
// Tests that LDS client should send a NACK if route has an action other than
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "No RouteAction found in route.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("No RouteAction found in route."));
}
TEST_P(LdsRdsTest, RouteActionClusterHasEmptyClusterName) {
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "RouteAction cluster contains empty cluster name.");
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr("RouteAction cluster contains empty cluster name."));
}
TEST_P(LdsRdsTest, RouteActionWeightedTargetHasIncorrectTotalWeightSet) {
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "RouteAction weighted_cluster has incorrect total weight");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "RouteAction weighted_cluster has incorrect total weight"));
}
TEST_P(LdsRdsTest, RouteActionWeightedClusterHasZeroTotalWeight) {
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "RouteAction weighted_cluster has no valid clusters specified.");
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr(
+ "RouteAction weighted_cluster has no valid clusters specified."));
}
TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasEmptyClusterName) {
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(
+ EXPECT_THAT(
response_state.error_message,
- "RouteAction weighted_cluster cluster contains empty cluster name.");
+ ::testing::HasSubstr(
+ "RouteAction weighted_cluster cluster contains empty cluster name."));
}
TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasNoWeight) {
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "RouteAction weighted_cluster cluster missing weight");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "RouteAction weighted_cluster cluster missing weight"));
}
TEST_P(LdsRdsTest, RouteHeaderMatchInvalidRegex) {
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "Invalid regex string specified in header matcher.");
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr(
+ "header matcher: Invalid regex string specified in matcher."));
}
TEST_P(LdsRdsTest, RouteHeaderMatchInvalidRange) {
CheckRpcSendFailure();
const auto& response_state = RouteConfigurationResponseState(0);
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "Invalid range header matcher specifier specified: end "
- "cannot be smaller than start.");
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr(
+ "header matcher: Invalid range specifier specified: end cannot be "
+ "smaller than start."));
}
// Tests that LDS client should choose the default route (with no matching
}
TEST_P(LdsRdsTest, XdsRoutingApplyXdsTimeout) {
- // TODO(https://github.com/grpc/grpc/issues/24549): TSAN won't work here.
- if (BuiltUnderAsan() || BuiltUnderTsan()) return;
-
gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT", "true");
- const int64_t kTimeoutNano = 500000000;
+ const int64_t kTimeoutMillis = 500;
+ const int64_t kTimeoutNano = kTimeoutMillis * 1000000;
const int64_t kTimeoutGrpcTimeoutHeaderMaxSecond = 1;
const int64_t kTimeoutMaxStreamDurationSecond = 2;
const int64_t kTimeoutHttpMaxStreamDurationSecond = 3;
// Set listener and route config.
SetListenerAndRouteConfiguration(0, std::move(listener), new_route_config);
// Test grpc_timeout_header_max of 1.5 seconds applied
- auto t0 = system_clock::now();
+ gpr_cycle_counter now = gpr_get_cycle_counter();
+ grpc_millis t0 = grpc_cycle_counter_to_millis_round_up(now);
+ grpc_millis t1 =
+ t0 + kTimeoutGrpcTimeoutHeaderMaxSecond * 1000 + kTimeoutMillis;
+ grpc_millis t2 = t0 + kTimeoutMaxStreamDurationSecond * 1000 + kTimeoutMillis;
CheckRpcSendFailure(1,
RpcOptions()
.set_rpc_service(SERVICE_ECHO1)
.set_wait_for_ready(true)
.set_timeout_ms(kTimeoutApplicationSecond * 1000),
StatusCode::DEADLINE_EXCEEDED);
- auto ellapsed_nano_seconds =
- std::chrono::duration_cast<std::chrono::nanoseconds>(system_clock::now() -
- t0);
- EXPECT_GT(ellapsed_nano_seconds.count(),
- kTimeoutGrpcTimeoutHeaderMaxSecond * 1000000000 + kTimeoutNano);
- EXPECT_LT(ellapsed_nano_seconds.count(),
- kTimeoutMaxStreamDurationSecond * 1000000000);
+ now = gpr_get_cycle_counter();
+ t0 = grpc_cycle_counter_to_millis_round_up(now);
+ EXPECT_GE(t0, t1);
+ EXPECT_LT(t0, t2);
// Test max_stream_duration of 2.5 seconds applied
- t0 = system_clock::now();
+ now = gpr_get_cycle_counter();
+ t0 = grpc_cycle_counter_to_millis_round_up(now);
+ t1 = t0 + kTimeoutMaxStreamDurationSecond * 1000 + kTimeoutMillis;
+ t2 = t0 + kTimeoutHttpMaxStreamDurationSecond * 1000 + kTimeoutMillis;
CheckRpcSendFailure(1,
RpcOptions()
.set_rpc_service(SERVICE_ECHO2)
.set_wait_for_ready(true)
.set_timeout_ms(kTimeoutApplicationSecond * 1000),
StatusCode::DEADLINE_EXCEEDED);
- ellapsed_nano_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>(
- system_clock::now() - t0);
- EXPECT_GT(ellapsed_nano_seconds.count(),
- kTimeoutMaxStreamDurationSecond * 1000000000 + kTimeoutNano);
- EXPECT_LT(ellapsed_nano_seconds.count(),
- kTimeoutHttpMaxStreamDurationSecond * 1000000000);
+ now = gpr_get_cycle_counter();
+ t0 = grpc_cycle_counter_to_millis_round_up(now);
+ EXPECT_GE(t0, t1);
+ EXPECT_LT(t0, t2);
// Test http_stream_duration of 3.5 seconds applied
- t0 = system_clock::now();
+ now = gpr_get_cycle_counter();
+ t0 = grpc_cycle_counter_to_millis_round_up(now);
+ t1 = t0 + kTimeoutHttpMaxStreamDurationSecond * 1000 + kTimeoutMillis;
+ t2 = t0 + kTimeoutApplicationSecond * 1000 + kTimeoutMillis;
CheckRpcSendFailure(1,
RpcOptions().set_wait_for_ready(true).set_timeout_ms(
kTimeoutApplicationSecond * 1000),
StatusCode::DEADLINE_EXCEEDED);
- ellapsed_nano_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>(
- system_clock::now() - t0);
- EXPECT_GT(ellapsed_nano_seconds.count(),
- kTimeoutHttpMaxStreamDurationSecond * 1000000000 + kTimeoutNano);
- EXPECT_LT(ellapsed_nano_seconds.count(),
- kTimeoutApplicationSecond * 1000000000);
+ now = gpr_get_cycle_counter();
+ t0 = grpc_cycle_counter_to_millis_round_up(now);
+ EXPECT_GE(t0, t1);
+ EXPECT_LT(t0, t2);
gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT");
}
header_matcher4->set_present_match(false);
auto* header_matcher5 = route1->mutable_match()->add_headers();
header_matcher5->set_name("header5");
- header_matcher5->set_prefix_match("/grpc");
+ header_matcher5->set_present_match(true);
auto* header_matcher6 = route1->mutable_match()->add_headers();
header_matcher6->set_name("header6");
- header_matcher6->set_suffix_match(".cc");
- header_matcher6->set_invert_match(true);
+ header_matcher6->set_prefix_match("/grpc");
+ auto* header_matcher7 = route1->mutable_match()->add_headers();
+ header_matcher7->set_name("header7");
+ header_matcher7->set_suffix_match(".cc");
+ header_matcher7->set_invert_match(true);
route1->mutable_route()->set_cluster(kNewClusterName);
auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes();
default_route->mutable_match()->set_prefix("");
default_route->mutable_route()->set_cluster(kDefaultClusterName);
SetRouteConfiguration(0, route_config);
std::vector<std::pair<std::string, std::string>> metadata = {
- {"header1", "POST"}, {"header2", "blah"},
- {"header3", "1"}, {"header5", "/grpc.testing.EchoTest1Service/"},
- {"header1", "PUT"}, {"header6", "grpc.java"},
+ {"header1", "POST"},
+ {"header2", "blah"},
+ {"header3", "1"},
+ {"header5", "anything"},
+ {"header6", "/grpc.testing.EchoTest1Service/"},
+ {"header1", "PUT"},
+ {"header7", "grpc.java"},
{"header1", "GET"},
};
const auto header_match_rpc_options = RpcOptions()
AdsServiceImpl::ResponseState::ACKED);
}
+TEST_P(CdsTest, LogicalDNSClusterType) {
+ gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER",
+ "true");
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Create Logical DNS Cluster
+ auto cluster = default_cluster_;
+ cluster.set_type(Cluster::LOGICAL_DNS);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
+ // Set Logical DNS result
+ {
+ grpc_core::ExecCtx exec_ctx;
+ grpc_core::Resolver::Result result;
+ result.addresses = CreateAddressListFromPortList(GetBackendPorts(1, 2));
+ logical_dns_cluster_resolver_response_generator_->SetResponse(
+ std::move(result));
+ }
+ // Wait for traffic to go to backend 1.
+ WaitForBackend(1);
+ gpr_unsetenv(
+ "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER");
+}
+
+TEST_P(CdsTest, AggregateClusterType) {
+ gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER",
+ "true");
+ const char* kNewCluster1Name = "new_cluster_1";
+ const char* kNewEdsService1Name = "new_eds_service_name_1";
+ const char* kNewCluster2Name = "new_cluster_2";
+ const char* kNewEdsService2Name = "new_eds_service_name_2";
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args1({
+ {"locality0", GetBackendPorts(1, 2)},
+ });
+ AdsServiceImpl::EdsResourceArgs args2({
+ {"locality0", GetBackendPorts(2, 3)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(
+ BuildEdsResource(args1, kNewEdsService1Name));
+ balancers_[0]->ads_service()->SetEdsResource(
+ BuildEdsResource(args2, kNewEdsService2Name));
+ // Populate new CDS resources.
+ Cluster new_cluster1 = default_cluster_;
+ new_cluster1.set_name(kNewCluster1Name);
+ new_cluster1.mutable_eds_cluster_config()->set_service_name(
+ kNewEdsService1Name);
+ balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
+ Cluster new_cluster2 = default_cluster_;
+ new_cluster2.set_name(kNewCluster2Name);
+ new_cluster2.mutable_eds_cluster_config()->set_service_name(
+ kNewEdsService2Name);
+ balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
+ // Create Aggregate Cluster
+ auto cluster = default_cluster_;
+ CustomClusterType* custom_cluster = cluster.mutable_cluster_type();
+ custom_cluster->set_name("envoy.clusters.aggregate");
+ ClusterConfig cluster_config;
+ cluster_config.add_clusters(kNewCluster1Name);
+ cluster_config.add_clusters(kNewCluster2Name);
+ custom_cluster->mutable_typed_config()->PackFrom(cluster_config);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
+ // Wait for traffic to go to backend 1.
+ WaitForBackend(1);
+ // Shutdown backend 1 and wait for all traffic to go to backend 2.
+ ShutdownBackend(1);
+ WaitForBackend(2);
+ EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state().state,
+ AdsServiceImpl::ResponseState::ACKED);
+ // Bring backend 1 back and ensure all traffic go back to it.
+ StartBackend(1);
+ WaitForBackend(1);
+ gpr_unsetenv(
+ "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER");
+}
+
+TEST_P(CdsTest, AggregateClusterEdsToLogicalDns) {
+ gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER",
+ "true");
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ const char* kNewCluster1Name = "new_cluster_1";
+ const char* kNewEdsService1Name = "new_eds_service_name_1";
+ const char* kLogicalDNSClusterName = "logical_dns_cluster";
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args1({
+ {"locality0", GetBackendPorts(1, 2)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(
+ BuildEdsResource(args1, kNewEdsService1Name));
+ // Populate new CDS resources.
+ Cluster new_cluster1 = default_cluster_;
+ new_cluster1.set_name(kNewCluster1Name);
+ new_cluster1.mutable_eds_cluster_config()->set_service_name(
+ kNewEdsService1Name);
+ balancers_[0]->ads_service()->SetCdsResource(new_cluster1);
+ // Create Logical DNS Cluster
+ auto logical_dns_cluster = default_cluster_;
+ logical_dns_cluster.set_name(kLogicalDNSClusterName);
+ logical_dns_cluster.set_type(Cluster::LOGICAL_DNS);
+ balancers_[0]->ads_service()->SetCdsResource(logical_dns_cluster);
+ // Create Aggregate Cluster
+ auto cluster = default_cluster_;
+ CustomClusterType* custom_cluster = cluster.mutable_cluster_type();
+ custom_cluster->set_name("envoy.clusters.aggregate");
+ ClusterConfig cluster_config;
+ cluster_config.add_clusters(kNewCluster1Name);
+ cluster_config.add_clusters(kLogicalDNSClusterName);
+ custom_cluster->mutable_typed_config()->PackFrom(cluster_config);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
+ // Set Logical DNS result
+ {
+ grpc_core::ExecCtx exec_ctx;
+ grpc_core::Resolver::Result result;
+ result.addresses = CreateAddressListFromPortList(GetBackendPorts(2, 3));
+ logical_dns_cluster_resolver_response_generator_->SetResponse(
+ std::move(result));
+ }
+ // Wait for traffic to go to backend 1.
+ WaitForBackend(1);
+ // Shutdown backend 1 and wait for all traffic to go to backend 2.
+ ShutdownBackend(1);
+ WaitForBackend(2);
+ EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state().state,
+ AdsServiceImpl::ResponseState::ACKED);
+ // Bring backend 1 back and ensure all traffic go back to it.
+ StartBackend(1);
+ WaitForBackend(1);
+ gpr_unsetenv(
+ "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER");
+}
+
+TEST_P(CdsTest, AggregateClusterLogicalDnsToEds) {
+ gpr_setenv("GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER",
+ "true");
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ const char* kNewCluster2Name = "new_cluster_2";
+ const char* kNewEdsService2Name = "new_eds_service_name_2";
+ const char* kLogicalDNSClusterName = "logical_dns_cluster";
+ // Populate new EDS resources.
+ AdsServiceImpl::EdsResourceArgs args2({
+ {"locality0", GetBackendPorts(2, 3)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(
+ BuildEdsResource(args2, kNewEdsService2Name));
+ // Populate new CDS resources.
+ Cluster new_cluster2 = default_cluster_;
+ new_cluster2.set_name(kNewCluster2Name);
+ new_cluster2.mutable_eds_cluster_config()->set_service_name(
+ kNewEdsService2Name);
+ balancers_[0]->ads_service()->SetCdsResource(new_cluster2);
+ // Create Logical DNS Cluster
+ auto logical_dns_cluster = default_cluster_;
+ logical_dns_cluster.set_name(kLogicalDNSClusterName);
+ logical_dns_cluster.set_type(Cluster::LOGICAL_DNS);
+ balancers_[0]->ads_service()->SetCdsResource(logical_dns_cluster);
+ // Create Aggregate Cluster
+ auto cluster = default_cluster_;
+ CustomClusterType* custom_cluster = cluster.mutable_cluster_type();
+ custom_cluster->set_name("envoy.clusters.aggregate");
+ ClusterConfig cluster_config;
+ cluster_config.add_clusters(kLogicalDNSClusterName);
+ cluster_config.add_clusters(kNewCluster2Name);
+ custom_cluster->mutable_typed_config()->PackFrom(cluster_config);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
+ // Set Logical DNS result
+ {
+ grpc_core::ExecCtx exec_ctx;
+ grpc_core::Resolver::Result result;
+ result.addresses = CreateAddressListFromPortList(GetBackendPorts(1, 2));
+ logical_dns_cluster_resolver_response_generator_->SetResponse(
+ std::move(result));
+ }
+ // Wait for traffic to go to backend 1.
+ WaitForBackend(1);
+ // Shutdown backend 1 and wait for all traffic to go to backend 2.
+ ShutdownBackend(1);
+ WaitForBackend(2);
+ EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state().state,
+ AdsServiceImpl::ResponseState::ACKED);
+ // Bring backend 1 back and ensure all traffic go back to it.
+ StartBackend(1);
+ WaitForBackend(1);
+ gpr_unsetenv(
+ "GRPC_XDS_EXPERIMENTAL_ENABLE_AGGREGATE_AND_LOGICAL_DNS_CLUSTER");
+}
+
+// Test that CDS client should send a NACK if cluster type is Logical DNS but
+// the feature is not yet supported.
+TEST_P(CdsTest, LogicalDNSClusterTypeDisabled) {
+ auto cluster = default_cluster_;
+ cluster.set_type(Cluster::LOGICAL_DNS);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ CheckRpcSendFailure();
+ const auto& response_state =
+ balancers_[0]->ads_service()->cds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("DiscoveryType is not valid."));
+}
+
+// Test that CDS client should send a NACK if cluster type is AGGREGATE but
+// the feature is not yet supported.
+TEST_P(CdsTest, AggregateClusterTypeDisabled) {
+ auto cluster = default_cluster_;
+ CustomClusterType* custom_cluster = cluster.mutable_cluster_type();
+ custom_cluster->set_name("envoy.clusters.aggregate");
+ ClusterConfig cluster_config;
+ cluster_config.add_clusters("cluster1");
+ cluster_config.add_clusters("cluster2");
+ custom_cluster->mutable_typed_config()->PackFrom(cluster_config);
+ cluster.set_type(Cluster::LOGICAL_DNS);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ CheckRpcSendFailure();
+ const auto& response_state =
+ balancers_[0]->ads_service()->cds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("DiscoveryType is not valid."));
+}
+
// Tests that CDS client should send a NACK if the cluster type in CDS response
-// is other than EDS.
-TEST_P(CdsTest, WrongClusterType) {
+// is unsupported.
+TEST_P(CdsTest, UnsupportedClusterType) {
auto cluster = default_cluster_;
cluster.set_type(Cluster::STATIC);
balancers_[0]->ads_service()->SetCdsResource(cluster);
const auto& response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "DiscoveryType is not EDS.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("DiscoveryType is not valid."));
+}
+
+// Tests that the NACK for multiple bad resources includes both errors.
+TEST_P(CdsTest, MultipleBadResources) {
+ constexpr char kClusterName2[] = "cluster_name_2";
+ // Use unsupported type for default cluster.
+ auto cluster = default_cluster_;
+ cluster.set_type(Cluster::STATIC);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
+ // Add second cluster with the same error.
+ cluster.set_name(kClusterName2);
+ balancers_[0]->ads_service()->SetCdsResource(cluster);
+ // Change RouteConfig to point to both clusters.
+ RouteConfiguration route_config = default_route_config_;
+ auto* route = route_config.mutable_virtual_hosts(0)->add_routes();
+ route->mutable_match()->set_prefix("");
+ route->mutable_route()->set_cluster(kClusterName2);
+ SetRouteConfiguration(0, route_config);
+ // Send RPC.
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ CheckRpcSendFailure();
+ const auto& response_state =
+ balancers_[0]->ads_service()->cds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::AllOf(
+ ::testing::HasSubstr(absl::StrCat(
+ kDefaultClusterName, ": DiscoveryType is not valid.")),
+ ::testing::HasSubstr(absl::StrCat(
+ kClusterName2, ": DiscoveryType is not valid."))));
}
// Tests that CDS client should send a NACK if the eds_config in CDS response is
const auto& response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "EDS ConfigSource is not ADS.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("EDS ConfigSource is not ADS."));
}
// Tests that CDS client should send a NACK if the lb_policy in CDS response is
const auto& response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "LB policy is not ROUND_ROBIN.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("LB policy is not supported."));
}
// Tests that CDS client should send a NACK if the lrs_server in CDS response is
const auto& response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message, "LRS ConfigSource is not self.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("LRS ConfigSource is not self."));
}
class XdsSecurityTest : public BasicTest {
static void SetUpTestCase() {
gpr_setenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT", "true");
BasicTest::SetUpTestCase();
- grpc_core::CertificateProviderRegistry::RegisterCertificateProviderFactory(
- absl::make_unique<FakeCertificateProviderFactory>(
- "fake1", &g_fake1_cert_data_map));
- grpc_core::CertificateProviderRegistry::RegisterCertificateProviderFactory(
- absl::make_unique<FakeCertificateProviderFactory>(
- "fake2", &g_fake2_cert_data_map));
}
static void TearDownTestCase() {
}
balancers_[0]->ads_service()->SetCdsResource(cluster);
// The updates might take time to have an effect, so use a retry loop.
- constexpr int kRetryCount = 10;
+ constexpr int kRetryCount = 100;
int num_tries = 0;
for (; num_tries < kRetryCount; num_tries++) {
// Give some time for the updates to propagate.
gpr_sleep_until(grpc_timeout_milliseconds_to_deadline(100));
- ShutdownBackend(0);
- StartBackend(0);
- ResetBackendCounters();
if (test_expects_failure) {
- if (!SendRpc().ok()) break;
+ // Restart the servers to force a reconnection so that previously
+ // connected subchannels are not used for the RPC.
+ ShutdownBackend(0);
+ StartBackend(0);
+ if (SendRpc().ok()) {
+ gpr_log(GPR_ERROR, "RPC succeeded. Failure expected. Trying again.");
+ continue;
+ }
} else {
WaitForBackend(0);
- if (SendRpc().ok() &&
- backends_[0]->backend_service()->request_count() == 1UL &&
- backends_[0]->backend_service()->last_peer_identity() ==
- expected_authenticated_identity) {
- break;
+ Status status = SendRpc();
+ if (!status.ok()) {
+ gpr_log(GPR_ERROR, "RPC failed. code=%d message=%s Trying again.",
+ status.error_code(), status.error_message().c_str());
+ continue;
+ }
+ if (backends_[0]->backend_service()->last_peer_identity() !=
+ expected_authenticated_identity) {
+ gpr_log(
+ GPR_ERROR,
+ "Expected client identity does not match. (actual) %s vs "
+ "(expected) %s Trying again.",
+ absl::StrJoin(
+ backends_[0]->backend_service()->last_peer_identity(), ",")
+ .c_str(),
+ absl::StrJoin(expected_authenticated_identity, ",").c_str());
+ continue;
}
}
+ break;
}
- EXPECT_TRUE(num_tries < kRetryCount);
+ EXPECT_LT(num_tries, kRetryCount);
}
std::string root_cert_;
const auto& response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "TLS configuration provided but no "
- "validation_context_certificate_provider_instance found.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "TLS configuration provided but no "
+ "validation_context_certificate_provider_instance found."));
}
TEST_P(
const auto& response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "TLS configuration provided but no "
- "validation_context_certificate_provider_instance found.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "TLS configuration provided but no "
+ "validation_context_certificate_provider_instance found."));
}
TEST_P(
const auto& response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "TLS configuration provided but no "
- "validation_context_certificate_provider_instance found.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "TLS configuration provided but no "
+ "validation_context_certificate_provider_instance found."));
}
TEST_P(XdsSecurityTest, RegexSanMatcherDoesNotAllowIgnoreCase) {
const auto& response_state =
balancers_[0]->ads_service()->cds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "StringMatcher: ignore_case has no effect for SAFE_REGEX.");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "StringMatcher: ignore_case has no effect for SAFE_REGEX."));
}
TEST_P(XdsSecurityTest, UnknownRootCertificateProvider) {
authenticated_identity_);
}
+class XdsEnabledServerTest : public XdsEnd2endTest {
+ protected:
+ XdsEnabledServerTest()
+ : XdsEnd2endTest(1, 1, 100, true /* use_xds_enabled_server */) {}
+
+ void SetUp() override {
+ XdsEnd2endTest::SetUp();
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", GetBackendPorts(0, 1)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(
+ BuildEdsResource(args, DefaultEdsServiceName()));
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ }
+};
+
+TEST_P(XdsEnabledServerTest, Basic) {
+ Listener listener;
+ listener.set_name(
+ absl::StrCat("grpc/server?xds.resource.listening_address=",
+ ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()));
+ listener.mutable_address()->mutable_socket_address()->set_address(
+ ipv6_only_ ? "::1" : "127.0.0.1");
+ listener.mutable_address()->mutable_socket_address()->set_port_value(
+ backends_[0]->port());
+ listener.add_filter_chains();
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ listener.set_name(
+ absl::StrCat("grpc/server?xds.resource.listening_address=[::1]:",
+ backends_[0]->port()));
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ WaitForBackend(0);
+ CheckRpcSendOk();
+}
+
+TEST_P(XdsEnabledServerTest, BadLdsUpdateNoApiListenerNorAddress) {
+ Listener listener;
+ listener.set_name(
+ absl::StrCat("grpc/server?xds.resource.listening_address=",
+ ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()));
+ listener.add_filter_chains();
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ CheckRpcSendFailure(1, RpcOptions().set_wait_for_ready(true));
+ const auto& response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr("Listener has neither address nor ApiListener"));
+}
+
+TEST_P(XdsEnabledServerTest, BadLdsUpdateBothApiListenerAndAddress) {
+ Listener listener;
+ listener.set_name(
+ absl::StrCat("grpc/server?xds.resource.listening_address=",
+ ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()));
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ listener.mutable_address()->mutable_socket_address()->set_address(
+ ipv6_only_ ? "::1" : "127.0.0.1");
+ listener.mutable_address()->mutable_socket_address()->set_port_value(
+ backends_[0]->port());
+ auto* filter_chain = listener.add_filter_chains();
+ auto* transport_socket = filter_chain->mutable_transport_socket();
+ transport_socket->set_name("envoy.transport_sockets.tls");
+ listener.mutable_api_listener();
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ CheckRpcSendFailure(1, RpcOptions().set_wait_for_ready(true));
+ const auto& response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(
+ response_state.error_message,
+ ::testing::HasSubstr("Listener has both address and ApiListener"));
+}
+
+class XdsServerSecurityTest : public XdsEnd2endTest {
+ protected:
+ XdsServerSecurityTest()
+ : XdsEnd2endTest(1, 1, 100, true /* use_xds_enabled_server */) {}
+
+ static void SetUpTestCase() {
+ gpr_setenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT", "true");
+ XdsEnd2endTest::SetUpTestCase();
+ }
+
+ static void TearDownTestCase() {
+ XdsEnd2endTest::TearDownTestCase();
+ gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_SECURITY_SUPPORT");
+ }
+
+ void SetUp() override {
+ XdsEnd2endTest::SetUp();
+ root_cert_ = ReadFile(kCaCertPath);
+ bad_root_cert_ = ReadFile(kBadClientCertPath);
+ identity_pair_ = ReadTlsIdentityPair(kServerKeyPath, kServerCertPath);
+ bad_identity_pair_ =
+ ReadTlsIdentityPair(kBadClientKeyPath, kBadClientCertPath);
+ identity_pair_2_ = ReadTlsIdentityPair(kClientKeyPath, kClientCertPath);
+ server_authenticated_identity_ = {"*.test.google.fr",
+ "waterzooi.test.google.be",
+ "*.test.youtube.com", "192.168.1.3"};
+ server_authenticated_identity_2_ = {"testclient"};
+ client_authenticated_identity_ = {"*.test.google.fr",
+ "waterzooi.test.google.be",
+ "*.test.youtube.com", "192.168.1.3"};
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", GetBackendPorts(0, 1)},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(
+ BuildEdsResource(args, DefaultEdsServiceName()));
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ }
+
+ void TearDown() override {
+ g_fake1_cert_data_map = nullptr;
+ g_fake2_cert_data_map = nullptr;
+ XdsEnd2endTest::TearDown();
+ }
+
+ void SetLdsUpdate(absl::string_view root_instance_name,
+ absl::string_view root_certificate_name,
+ absl::string_view identity_instance_name,
+ absl::string_view identity_certificate_name,
+ bool require_client_certificates) {
+ Listener listener;
+ listener.set_name(
+ absl::StrCat("grpc/server?xds.resource.listening_address=127.0.0.1:",
+ backends_[0]->port()));
+ listener.mutable_address()->mutable_socket_address()->set_address(
+ "127.0.0.1");
+ listener.mutable_address()->mutable_socket_address()->set_port_value(
+ backends_[0]->port());
+ auto* filter_chain = listener.add_filter_chains();
+ if (!identity_instance_name.empty()) {
+ auto* transport_socket = filter_chain->mutable_transport_socket();
+ transport_socket->set_name("envoy.transport_sockets.tls");
+ DownstreamTlsContext downstream_tls_context;
+ downstream_tls_context.mutable_common_tls_context()
+ ->mutable_tls_certificate_certificate_provider_instance()
+ ->set_instance_name(std::string(identity_instance_name));
+ downstream_tls_context.mutable_common_tls_context()
+ ->mutable_tls_certificate_certificate_provider_instance()
+ ->set_certificate_name(std::string(identity_certificate_name));
+ if (!root_instance_name.empty()) {
+ downstream_tls_context.mutable_common_tls_context()
+ ->mutable_combined_validation_context()
+ ->mutable_validation_context_certificate_provider_instance()
+ ->set_instance_name(std::string(root_instance_name));
+ downstream_tls_context.mutable_common_tls_context()
+ ->mutable_combined_validation_context()
+ ->mutable_validation_context_certificate_provider_instance()
+ ->set_certificate_name(std::string(root_certificate_name));
+ downstream_tls_context.mutable_require_client_certificate()->set_value(
+ require_client_certificates);
+ }
+ transport_socket->mutable_typed_config()->PackFrom(
+ downstream_tls_context);
+ }
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ listener.set_name(
+ absl::StrCat("grpc/server?xds.resource.listening_address=[::1]:",
+ backends_[0]->port()));
+ listener.mutable_address()->mutable_socket_address()->set_address("[::1]");
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ }
+
+ std::shared_ptr<grpc::Channel> CreateMtlsChannel() {
+ ChannelArguments args;
+ // Override target name for host name check
+ args.SetString(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
+ ipv6_only_ ? "::1" : "127.0.0.1");
+ args.SetInt(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL, 1);
+ std::string uri = absl::StrCat(
+ ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", backends_[0]->port());
+ // TODO(yashykt): Switch to using C++ API once b/173823806 is fixed.
+ grpc_tls_credentials_options* options =
+ grpc_tls_credentials_options_create();
+ grpc_tls_credentials_options_set_server_verification_option(
+ options, GRPC_TLS_SKIP_HOSTNAME_VERIFICATION);
+ grpc_tls_credentials_options_set_certificate_provider(
+ options,
+ grpc_core::MakeRefCounted<grpc_core::StaticDataCertificateProvider>(
+ ReadFile(kCaCertPath),
+ ReadTlsIdentityPair(kServerKeyPath, kServerCertPath))
+ .get());
+ grpc_tls_credentials_options_watch_root_certs(options);
+ grpc_tls_credentials_options_watch_identity_key_cert_pairs(options);
+ grpc_tls_server_authorization_check_config* check_config =
+ grpc_tls_server_authorization_check_config_create(
+ nullptr, ServerAuthCheckSchedule, nullptr, nullptr);
+ grpc_tls_credentials_options_set_server_authorization_check_config(
+ options, check_config);
+ auto channel_creds = std::make_shared<SecureChannelCredentials>(
+ grpc_tls_credentials_create(options));
+ grpc_tls_server_authorization_check_config_release(check_config);
+ return CreateCustomChannel(uri, channel_creds, args);
+ }
+
+ std::shared_ptr<grpc::Channel> CreateTlsChannel() {
+ ChannelArguments args;
+ // Override target name for host name check
+ args.SetString(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
+ ipv6_only_ ? "::1" : "127.0.0.1");
+ args.SetInt(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL, 1);
+ std::string uri = absl::StrCat(
+ ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", backends_[0]->port());
+ // TODO(yashykt): Switch to using C++ API once b/173823806 is fixed.
+ grpc_tls_credentials_options* options =
+ grpc_tls_credentials_options_create();
+ grpc_tls_credentials_options_set_server_verification_option(
+ options, GRPC_TLS_SKIP_HOSTNAME_VERIFICATION);
+ grpc_tls_credentials_options_set_certificate_provider(
+ options,
+ grpc_core::MakeRefCounted<grpc_core::StaticDataCertificateProvider>(
+ ReadFile(kCaCertPath),
+ ReadTlsIdentityPair(kServerKeyPath, kServerCertPath))
+ .get());
+ grpc_tls_credentials_options_watch_root_certs(options);
+ grpc_tls_server_authorization_check_config* check_config =
+ grpc_tls_server_authorization_check_config_create(
+ nullptr, ServerAuthCheckSchedule, nullptr, nullptr);
+ grpc_tls_credentials_options_set_server_authorization_check_config(
+ options, check_config);
+ auto channel_creds = std::make_shared<SecureChannelCredentials>(
+ grpc_tls_credentials_create(options));
+ grpc_tls_server_authorization_check_config_release(check_config);
+ return CreateCustomChannel(uri, channel_creds, args);
+ }
+
+ std::shared_ptr<grpc::Channel> CreateInsecureChannel() {
+ ChannelArguments args;
+ // Override target name for host name check
+ args.SetString(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG,
+ ipv6_only_ ? "::1" : "127.0.0.1");
+ args.SetInt(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL, 1);
+ std::string uri = absl::StrCat(
+ ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", backends_[0]->port());
+ return CreateCustomChannel(uri, InsecureChannelCredentials(), args);
+ }
+
+ void SendRpc(std::function<std::shared_ptr<grpc::Channel>()> channel_creator,
+ std::vector<std::string> expected_server_identity,
+ std::vector<std::string> expected_client_identity,
+ bool test_expects_failure = false) {
+ gpr_log(GPR_INFO, "Sending RPC");
+ int num_tries = 0;
+ constexpr int kRetryCount = 10;
+ for (; num_tries < kRetryCount; num_tries++) {
+ auto channel = channel_creator();
+ auto stub = grpc::testing::EchoTestService::NewStub(channel);
+ ClientContext context;
+ context.set_wait_for_ready(true);
+ context.set_deadline(grpc_timeout_milliseconds_to_deadline(2000));
+ EchoRequest request;
+ request.set_message(kRequestMessage);
+ EchoResponse response;
+ Status status = stub->Echo(&context, request, &response);
+ if (test_expects_failure) {
+ if (status.ok()) {
+ gpr_log(GPR_ERROR, "RPC succeeded. Failure expected. Trying again.");
+ continue;
+ }
+ } else {
+ if (!status.ok()) {
+ gpr_log(GPR_ERROR, "RPC failed. code=%d message=%s Trying again.",
+ status.error_code(), status.error_message().c_str());
+ continue;
+ }
+ EXPECT_EQ(response.message(), kRequestMessage);
+ std::vector<std::string> peer_identity;
+ for (const auto& entry : context.auth_context()->GetPeerIdentity()) {
+ peer_identity.emplace_back(
+ std::string(entry.data(), entry.size()).c_str());
+ }
+ if (peer_identity != expected_server_identity) {
+ gpr_log(GPR_ERROR,
+ "Expected server identity does not match. (actual) %s vs "
+ "(expected) %s Trying again.",
+ absl::StrJoin(peer_identity, ",").c_str(),
+ absl::StrJoin(expected_server_identity, ",").c_str());
+ continue;
+ }
+ if (backends_[0]->backend_service()->last_peer_identity() !=
+ expected_client_identity) {
+ gpr_log(
+ GPR_ERROR,
+ "Expected client identity does not match. (actual) %s vs "
+ "(expected) %s Trying again.",
+ absl::StrJoin(
+ backends_[0]->backend_service()->last_peer_identity(), ",")
+ .c_str(),
+ absl::StrJoin(expected_client_identity, ",").c_str());
+ continue;
+ }
+ }
+ break;
+ }
+ EXPECT_LT(num_tries, kRetryCount);
+ }
+
+ std::string root_cert_;
+ std::string bad_root_cert_;
+ grpc_core::PemKeyCertPairList identity_pair_;
+ grpc_core::PemKeyCertPairList bad_identity_pair_;
+ grpc_core::PemKeyCertPairList identity_pair_2_;
+ std::vector<std::string> server_authenticated_identity_;
+ std::vector<std::string> server_authenticated_identity_2_;
+ std::vector<std::string> client_authenticated_identity_;
+};
+
+TEST_P(XdsServerSecurityTest, TlsConfigurationWithoutRootProviderInstance) {
+ Listener listener;
+ listener.set_name(
+ absl::StrCat("grpc/server?xds.resource.listening_address=",
+ ipv6_only_ ? "[::1]:" : "127.0.0.1:", backends_[0]->port()));
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ auto* socket_address = listener.mutable_address()->mutable_socket_address();
+ socket_address->set_address(ipv6_only_ ? "::1" : "127.0.0.1");
+ socket_address->set_port_value(backends_[0]->port());
+ auto* filter_chain = listener.add_filter_chains();
+ auto* transport_socket = filter_chain->mutable_transport_socket();
+ transport_socket->set_name("envoy.transport_sockets.tls");
+ DownstreamTlsContext downstream_tls_context;
+ transport_socket->mutable_typed_config()->PackFrom(downstream_tls_context);
+ balancers_[0]->ads_service()->SetLdsResource(listener);
+ CheckRpcSendFailure(1, RpcOptions().set_wait_for_ready(true));
+ const auto& response_state =
+ balancers_[0]->ads_service()->lds_response_state();
+ EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr(
+ "TLS configuration provided but no "
+ "tls_certificate_certificate_provider_instance found."));
+}
+
+TEST_P(XdsServerSecurityTest, UnknownIdentityCertificateProvider) {
+ SetLdsUpdate("", "", "unknown", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); }, {}, {},
+ true /* test_expects_failure */);
+}
+
+TEST_P(XdsServerSecurityTest, UnknownRootCertificateProvider) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ SetLdsUpdate("unknown", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); }, {}, {},
+ true /* test_expects_failure */);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtls) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsWithRootPluginUpdate) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ FakeCertificateProvider::CertDataMap fake2_cert_map = {
+ {"", {bad_root_cert_, bad_identity_pair_}}};
+ g_fake2_cert_data_map = &fake2_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+ SetLdsUpdate("fake_plugin2", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); }, {}, {},
+ true /* test_expects_failure */);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsWithIdentityPluginUpdate) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ FakeCertificateProvider::CertDataMap fake2_cert_map = {
+ {"", {root_cert_, identity_pair_2_}}};
+ g_fake2_cert_data_map = &fake2_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin2", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_2_, client_authenticated_identity_);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsWithBothPluginsUpdated) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ FakeCertificateProvider::CertDataMap fake2_cert_map = {
+ {"good", {root_cert_, identity_pair_2_}},
+ {"", {bad_root_cert_, bad_identity_pair_}}};
+ g_fake2_cert_data_map = &fake2_cert_map;
+ SetLdsUpdate("fake_plugin2", "", "fake_plugin2", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); }, {}, {},
+ true /* test_expects_failure */);
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+ SetLdsUpdate("fake_plugin2", "good", "fake_plugin2", "good", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_2_, client_authenticated_identity_);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsWithRootCertificateNameUpdate) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}},
+ {"bad", {bad_root_cert_, bad_identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+ SetLdsUpdate("fake_plugin1", "bad", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); }, {}, {},
+ true /* test_expects_failure */);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsWithIdentityCertificateNameUpdate) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}},
+ {"good", {root_cert_, identity_pair_2_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "good", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_2_, client_authenticated_identity_);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsWithBothCertificateNamesUpdated) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}},
+ {"good", {root_cert_, identity_pair_2_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+ SetLdsUpdate("fake_plugin1", "good", "fake_plugin1", "good", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_2_, client_authenticated_identity_);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsNotRequiringButProvidingClientCerts) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsNotRequiringAndNotProvidingClientCerts) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_, {});
+}
+
+TEST_P(XdsServerSecurityTest, TestTls) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_, {});
+}
+
+TEST_P(XdsServerSecurityTest, TestTlsWithIdentityPluginUpdate) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ FakeCertificateProvider::CertDataMap fake2_cert_map = {
+ {"", {root_cert_, identity_pair_2_}}};
+ g_fake2_cert_data_map = &fake2_cert_map;
+ SetLdsUpdate("", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_, {});
+ SetLdsUpdate("", "", "fake_plugin2", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_2_, {});
+}
+
+TEST_P(XdsServerSecurityTest, TestTlsWithIdentityCertificateNameUpdate) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}},
+ {"good", {root_cert_, identity_pair_2_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_, {});
+ SetLdsUpdate("", "", "fake_plugin1", "good", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_2_, {});
+}
+
+TEST_P(XdsServerSecurityTest, TestFallback) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("", "", "", "", false);
+ SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsToTls) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateTlsChannel(); }, {}, {},
+ true /* test_expects_failure */);
+ SetLdsUpdate("", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_, {});
+}
+
+TEST_P(XdsServerSecurityTest, TestTlsToMtls) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_, {});
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateTlsChannel(); }, {}, {},
+ true /* test_expects_failure */);
+}
+
+TEST_P(XdsServerSecurityTest, TestMtlsToFallback) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+ SetLdsUpdate("", "", "", "", false);
+ SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
+}
+
+TEST_P(XdsServerSecurityTest, TestFallbackToMtls) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("", "", "", "", false);
+ SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
+ SetLdsUpdate("fake_plugin1", "", "fake_plugin1", "", true);
+ SendRpc([this]() { return CreateMtlsChannel(); },
+ server_authenticated_identity_, client_authenticated_identity_);
+}
+
+TEST_P(XdsServerSecurityTest, TestTlsToFallback) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_, {});
+ SetLdsUpdate("", "", "", "", false);
+ SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
+}
+
+TEST_P(XdsServerSecurityTest, TestFallbackToTls) {
+ FakeCertificateProvider::CertDataMap fake1_cert_map = {
+ {"", {root_cert_, identity_pair_}}};
+ g_fake1_cert_data_map = &fake1_cert_map;
+ SetLdsUpdate("", "", "", "", false);
+ SendRpc([this]() { return CreateInsecureChannel(); }, {}, {});
+ SetLdsUpdate("", "", "fake_plugin1", "", false);
+ SendRpc([this]() { return CreateTlsChannel(); },
+ server_authenticated_identity_, {});
+}
+
using EdsTest = BasicTest;
// Tests that EDS client should send a NACK if the EDS update contains
const auto& response_state =
balancers_[0]->ads_service()->eds_response_state();
EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED);
- EXPECT_EQ(response_state.error_message,
- "EDS update includes sparse priority list");
+ EXPECT_THAT(response_state.error_message,
+ ::testing::HasSubstr("sparse priority list"));
}
// In most of our tests, we use different names for different resource
{"locality2", GetBackendPorts(2, 3), kDefaultLocalityWeight, 3},
{"locality3", GetBackendPorts(3, 4), kDefaultLocalityWeight, 0},
});
- ShutdownBackend(3);
- ShutdownBackend(0);
balancers_[0]->ads_service()->SetEdsResource(
BuildEdsResource(args, DefaultEdsServiceName()));
+ WaitForBackend(3);
+ ShutdownBackend(3);
+ ShutdownBackend(0);
WaitForBackend(1, false);
for (size_t i = 0; i < 4; ++i) {
if (i == 1) continue;
kDropRateForThrottle * (1 + kErrorTolerance))));
}
+class BootstrapContentsFromEnvVarTest : public XdsEnd2endTest {
+ public:
+ BootstrapContentsFromEnvVarTest() : XdsEnd2endTest(4, 1, 100, false, true) {}
+};
+
+TEST_P(BootstrapContentsFromEnvVarTest, Vanilla) {
+ SetNextResolution({});
+ SetNextResolutionForLbChannelAllBalancers();
+ AdsServiceImpl::EdsResourceArgs args({
+ {"locality0", GetBackendPorts()},
+ });
+ balancers_[0]->ads_service()->SetEdsResource(
+ BuildEdsResource(args, DefaultEdsServiceName()));
+ WaitForAllBackends();
+}
+
std::string TestTypeName(const ::testing::TestParamInfo<TestType>& info) {
return info.param.AsString();
}
true)),
&TestTypeName);
+// We are only testing the server here.
+INSTANTIATE_TEST_SUITE_P(XdsTest, XdsEnabledServerTest,
+ ::testing::Values(TestType(true, false, false, false,
+ false)),
+ &TestTypeName);
+
+// We are only testing the server here.
+INSTANTIATE_TEST_SUITE_P(XdsTest, XdsServerSecurityTest,
+ ::testing::Values(TestType(false, false, false, false,
+ true)),
+ &TestTypeName);
+
// EDS could be tested with or without XdsResolver, but the tests would
// be the same either way, so we test it only with XdsResolver.
INSTANTIATE_TEST_SUITE_P(XdsTest, EdsTest,
TestType(true, true)),
&TestTypeName);
+INSTANTIATE_TEST_SUITE_P(XdsTest, BootstrapContentsFromEnvVarTest,
+ ::testing::Values(TestType(true, false)),
+ &TestTypeName);
+
} // namespace
} // namespace testing
} // namespace grpc
::testing::InitGoogleTest(&argc, argv);
grpc::testing::WriteBootstrapFiles();
grpc::testing::g_port_saver = new grpc::testing::PortSaver();
+ // Make the backup poller poll very frequently in order to pick up
+ // updates from all the subchannels's FDs.
+ GPR_GLOBAL_CONFIG_SET(grpc_client_channel_backup_poll_interval_ms, 1);
+#if TARGET_OS_IPHONE
+ // Workaround Apple CFStream bug
+ gpr_setenv("grpc_cfstream", "0");
+#endif
+ grpc_core::CertificateProviderRegistry::RegisterCertificateProviderFactory(
+ absl::make_unique<grpc::testing::FakeCertificateProviderFactory>(
+ "fake1", &grpc::testing::g_fake1_cert_data_map));
+ grpc_core::CertificateProviderRegistry::RegisterCertificateProviderFactory(
+ absl::make_unique<grpc::testing::FakeCertificateProviderFactory>(
+ "fake2", &grpc::testing::g_fake2_cert_data_map));
+ grpc_init();
const auto result = RUN_ALL_TESTS();
+ grpc_shutdown();
return result;
}
static const auto TEST_TAG_VALUE = "my_value";
class EchoServer final : public EchoTestService::Service {
- ::grpc::Status Echo(::grpc::ServerContext* context,
+ ::grpc::Status Echo(::grpc::ServerContext* /*context*/,
const EchoRequest* request,
EchoResponse* response) override {
if (request->param().expected_error().code() == 0) {
struct RpcConfig {
ClientConfigureRequest::RpcType type;
std::vector<std::pair<std::string, std::string>> metadata;
+ int timeout_sec = 0;
};
struct RpcConfigurationsQueue {
// A queue of RPC configurations detailing how RPCs should be sent.
// Mutex for rpc_configs_queue
std::mutex mu_rpc_configs_queue;
};
+struct AsyncClientCall {
+ Empty empty_response;
+ SimpleResponse simple_response;
+ ClientContext context;
+ Status status;
+ int saved_request_id;
+ ClientConfigureRequest::RpcType rpc_type;
+ std::unique_ptr<ClientAsyncResponseReader<Empty>> empty_response_reader;
+ std::unique_ptr<ClientAsyncResponseReader<SimpleResponse>>
+ simple_response_reader;
+};
/** Records the remote peer distribution for a given range of RPCs. */
class XdsStatsWatcher {
// Upon the completion of an RPC, we will look at the request_id, the
// rpc_type, and the peer the RPC was sent to in order to count
// this RPC into the right stats bin.
- void RpcCompleted(int request_id,
- const ClientConfigureRequest::RpcType rpc_type,
- const std::string& peer) {
+ void RpcCompleted(AsyncClientCall* call, const std::string& peer) {
// We count RPCs for global watcher or if the request_id falls into the
// watcher's interested range of request ids.
if ((start_id_ == 0 && end_id_ == 0) ||
- (start_id_ <= request_id && request_id < end_id_)) {
+ (start_id_ <= call->saved_request_id &&
+ call->saved_request_id < end_id_)) {
{
std::lock_guard<std::mutex> lock(m_);
if (peer.empty()) {
no_remote_peer_++;
- ++no_remote_peer_by_type_[rpc_type];
+ ++no_remote_peer_by_type_[call->rpc_type];
} else {
// RPC is counted into both per-peer bin and per-method-per-peer bin.
rpcs_by_peer_[peer]++;
- rpcs_by_type_[rpc_type][peer]++;
+ rpcs_by_type_[call->rpc_type][peer]++;
}
rpcs_needed_--;
+ // Report accumulated stats.
+ auto& stats_per_method = *accumulated_stats_.mutable_stats_per_method();
+ auto& method_stat =
+ stats_per_method[ClientConfigureRequest_RpcType_Name(
+ call->rpc_type)];
+ auto& result = *method_stat.mutable_result();
+ grpc_status_code code =
+ static_cast<grpc_status_code>(call->status.error_code());
+ auto& num_rpcs = result[code];
+ ++num_rpcs;
+ auto rpcs_started = method_stat.rpcs_started();
+ method_stat.set_rpcs_started(++rpcs_started);
}
cv_.notify_one();
}
void WaitForRpcStatsResponse(LoadBalancerStatsResponse* response,
int timeout_sec) {
- {
- std::unique_lock<std::mutex> lock(m_);
- cv_.wait_for(lock, std::chrono::seconds(timeout_sec),
- [this] { return rpcs_needed_ == 0; });
- response->mutable_rpcs_by_peer()->insert(rpcs_by_peer_.begin(),
- rpcs_by_peer_.end());
- auto& response_rpcs_by_method = *response->mutable_rpcs_by_method();
- for (const auto& rpc_by_type : rpcs_by_type_) {
- std::string method_name;
- if (rpc_by_type.first == ClientConfigureRequest::EMPTY_CALL) {
- method_name = "EmptyCall";
- } else if (rpc_by_type.first == ClientConfigureRequest::UNARY_CALL) {
- method_name = "UnaryCall";
- } else {
- GPR_ASSERT(0);
- }
- // TODO(@donnadionne): When the test runner changes to accept EMPTY_CALL
- // and UNARY_CALL we will just use the name of the enum instead of the
- // method_name variable.
- auto& response_rpc_by_method = response_rpcs_by_method[method_name];
- auto& response_rpcs_by_peer =
- *response_rpc_by_method.mutable_rpcs_by_peer();
- for (const auto& rpc_by_peer : rpc_by_type.second) {
- auto& response_rpc_by_peer = response_rpcs_by_peer[rpc_by_peer.first];
- response_rpc_by_peer = rpc_by_peer.second;
- }
+ std::unique_lock<std::mutex> lock(m_);
+ cv_.wait_for(lock, std::chrono::seconds(timeout_sec),
+ [this] { return rpcs_needed_ == 0; });
+ response->mutable_rpcs_by_peer()->insert(rpcs_by_peer_.begin(),
+ rpcs_by_peer_.end());
+ auto& response_rpcs_by_method = *response->mutable_rpcs_by_method();
+ for (const auto& rpc_by_type : rpcs_by_type_) {
+ std::string method_name;
+ if (rpc_by_type.first == ClientConfigureRequest::EMPTY_CALL) {
+ method_name = "EmptyCall";
+ } else if (rpc_by_type.first == ClientConfigureRequest::UNARY_CALL) {
+ method_name = "UnaryCall";
+ } else {
+ GPR_ASSERT(0);
+ }
+ // TODO(@donnadionne): When the test runner changes to accept EMPTY_CALL
+ // and UNARY_CALL we will just use the name of the enum instead of the
+ // method_name variable.
+ auto& response_rpc_by_method = response_rpcs_by_method[method_name];
+ auto& response_rpcs_by_peer =
+ *response_rpc_by_method.mutable_rpcs_by_peer();
+ for (const auto& rpc_by_peer : rpc_by_type.second) {
+ auto& response_rpc_by_peer = response_rpcs_by_peer[rpc_by_peer.first];
+ response_rpc_by_peer = rpc_by_peer.second;
}
- response->set_num_failures(no_remote_peer_ + rpcs_needed_);
}
+ response->set_num_failures(no_remote_peer_ + rpcs_needed_);
}
void GetCurrentRpcStats(LoadBalancerAccumulatedStatsResponse* response,
StatsWatchers* stats_watchers) {
std::unique_lock<std::mutex> lock(m_);
+ response->CopyFrom(accumulated_stats_);
+ // TODO(@donnadionne): delete deprecated stats below when the test is no
+ // longer using them.
auto& response_rpcs_started_by_method =
*response->mutable_num_rpcs_started_by_method();
auto& response_rpcs_succeeded_by_method =
// A two-level map of stats keyed at top level by RPC method and second level
// by peer name.
std::map<int, std::map<std::string, int>> rpcs_by_type_;
+ // Storing accumulated stats in the response proto format.
+ LoadBalancerAccumulatedStatsResponse accumulated_stats_;
std::mutex m_;
std::condition_variable cv_;
};
StatsWatchers* stats_watchers)
: stub_(TestService::NewStub(channel)), stats_watchers_(stats_watchers) {}
- void AsyncUnaryCall(
- std::vector<std::pair<std::string, std::string>> metadata) {
+ void AsyncUnaryCall(const RpcConfig& config) {
SimpleResponse response;
int saved_request_id;
{
}
std::chrono::system_clock::time_point deadline =
std::chrono::system_clock::now() +
- std::chrono::seconds(absl::GetFlag(FLAGS_rpc_timeout_sec));
+ std::chrono::seconds(config.timeout_sec != 0
+ ? config.timeout_sec
+ : absl::GetFlag(FLAGS_rpc_timeout_sec));
AsyncClientCall* call = new AsyncClientCall;
- for (const auto& data : metadata) {
+ for (const auto& data : config.metadata) {
call->context.AddMetadata(data.first, data.second);
// TODO(@donnadionne): move deadline to separate proto.
if (data.first == "rpc-behavior" && data.second == "keep-open") {
call);
}
- void AsyncEmptyCall(
- std::vector<std::pair<std::string, std::string>> metadata) {
+ void AsyncEmptyCall(const RpcConfig& config) {
Empty response;
int saved_request_id;
{
}
std::chrono::system_clock::time_point deadline =
std::chrono::system_clock::now() +
- std::chrono::seconds(absl::GetFlag(FLAGS_rpc_timeout_sec));
+ std::chrono::seconds(config.timeout_sec != 0
+ ? config.timeout_sec
+ : absl::GetFlag(FLAGS_rpc_timeout_sec));
AsyncClientCall* call = new AsyncClientCall;
- for (const auto& data : metadata) {
+ for (const auto& data : config.metadata) {
call->context.AddMetadata(data.first, data.second);
// TODO(@donnadionne): move deadline to separate proto.
if (data.first == "rpc-behavior" && data.second == "keep-open") {
metadata_hostname->second.length())
: call->simple_response.hostname();
for (auto watcher : stats_watchers_->watchers) {
- watcher->RpcCompleted(call->saved_request_id, call->rpc_type,
- hostname);
+ watcher->RpcCompleted(call, hostname);
}
}
}
private:
- struct AsyncClientCall {
- Empty empty_response;
- SimpleResponse simple_response;
- ClientContext context;
- Status status;
- int saved_request_id;
- ClientConfigureRequest::RpcType rpc_type;
- std::unique_ptr<ClientAsyncResponseReader<Empty>> empty_response_reader;
- std::unique_ptr<ClientAsyncResponseReader<SimpleResponse>>
- simple_response_reader;
- };
static bool RpcStatusCheckSuccess(AsyncClientCall* call) {
// Determine RPC success based on expected status.
grpc_status_code code;
explicit LoadBalancerStatsServiceImpl(StatsWatchers* stats_watchers)
: stats_watchers_(stats_watchers) {}
- Status GetClientStats(ServerContext* context,
+ Status GetClientStats(ServerContext* /*context*/,
const LoadBalancerStatsRequest* request,
LoadBalancerStatsResponse* response) override {
int start_id;
}
Status GetClientAccumulatedStats(
- ServerContext* context,
- const LoadBalancerAccumulatedStatsRequest* request,
+ ServerContext* /*context*/,
+ const LoadBalancerAccumulatedStatsRequest* /*request*/,
LoadBalancerAccumulatedStatsResponse* response) override {
std::lock_guard<std::mutex> lock(stats_watchers_->mu);
stats_watchers_->global_watcher->GetCurrentRpcStats(response,
RpcConfigurationsQueue* rpc_configs_queue)
: rpc_configs_queue_(rpc_configs_queue) {}
- Status Configure(ServerContext* context,
+ Status Configure(ServerContext* /*context*/,
const ClientConfigureRequest* request,
- ClientConfigureResponse* response) override {
+ ClientConfigureResponse* /*response*/) override {
std::map<int, std::vector<std::pair<std::string, std::string>>>
metadata_map;
for (const auto& data : request->metadata()) {
std::vector<RpcConfig> configs;
for (const auto& rpc : request->types()) {
RpcConfig config;
+ config.timeout_sec = request->timeout_sec();
config.type = static_cast<ClientConfigureRequest::RpcType>(rpc);
auto metadata_iter = metadata_map.find(rpc);
if (metadata_iter != metadata_map.end()) {
start = std::chrono::system_clock::now();
for (const auto& config : configs) {
if (config.type == ClientConfigureRequest::EMPTY_CALL) {
- client.AsyncEmptyCall(config.metadata);
+ client.AsyncEmptyCall(config);
} else if (config.type == ClientConfigureRequest::UNARY_CALL) {
- client.AsyncUnaryCall(config.metadata);
+ client.AsyncUnaryCall(config);
} else {
GPR_ASSERT(0);
}
public:
explicit TestServiceImpl(const std::string& i) : hostname_(i) {}
- Status UnaryCall(ServerContext* context, const SimpleRequest* request,
+ Status UnaryCall(ServerContext* context, const SimpleRequest* /*request*/,
SimpleResponse* response) override {
response->set_server_id(absl::GetFlag(FLAGS_server_id));
response->set_hostname(hostname_);
return Status::OK;
}
- Status EmptyCall(ServerContext* context, const Empty* request,
- Empty* response) override {
+ Status EmptyCall(ServerContext* context, const Empty* /*request*/,
+ Empty* /*response*/) override {
context->AddInitialMetadata("hostname", hostname_);
return Status::OK;
}
void RegisterOnce() { absl::call_once(once, grpc::RegisterOpenCensusPlugin); }
class EchoServer final : public grpc::testing::EchoTestService::Service {
- grpc::Status Echo(grpc::ServerContext* context,
+ grpc::Status Echo(grpc::ServerContext* /*context*/,
const grpc::testing::EchoRequest* request,
grpc::testing::EchoResponse* response) override {
if (request->param().expected_error().code() == 0) {
// all clients
double qps = 0;
double client_system_cpu_load = 0, client_user_cpu_load = 0;
- for (size_t i = 0; i < result->client_stats_size(); i++) {
+ for (int i = 0; i < result->client_stats_size(); i++) {
auto client_stat = result->client_stats(i);
qps += client_stat.latencies().count() / client_stat.time_elapsed();
client_system_cpu_load +=
// Calculate cpu load for each server and then aggregate results for all
// servers
double server_system_cpu_load = 0, server_user_cpu_load = 0;
- for (size_t i = 0; i < result->server_stats_size(); i++) {
+ for (int i = 0; i < result->server_stats_size(); i++) {
auto server_stat = result->server_stats(i);
server_system_cpu_load +=
server_stat.time_system() / server_stat.time_elapsed();
server = threads_required(scenario_json, 'server', is_tsan)
# make an arbitrary guess if set to auto-detect
# about the size of the jenkins instances we have for unit tests
- if client == 0 or server == 0: return 'capacity'
+ if client == 0 or server == 0:
+ return 'capacity'
return (scenario_json['num_clients'] * client +
scenario_json['num_servers'] * server)
external_deps = [
"gtest",
],
+ tags = ["no_test_ios"],
deps = [
"//:grpc++_error_details",
+ "//src/proto/grpc/status:status_proto",
"//src/proto/grpc/testing:echo_messages_proto",
"//test/core/util:grpc_test_util",
],
// Creata an echo server
class EchoServerImpl final : public grpc::testing::TestService::Service {
- Status EmptyCall(::grpc::ServerContext* context,
- const grpc::testing::Empty* request,
- grpc::testing::Empty* response) override {
+ Status EmptyCall(::grpc::ServerContext* /*context*/,
+ const grpc::testing::Empty* /*request*/,
+ grpc::testing::Empty* /*response*/) override {
return Status::OK;
}
};
return Status::OK;
}
- Status CheckDeadlineSet(ServerContext* context, const SimpleRequest* request,
+ Status CheckDeadlineSet(ServerContext* context,
+ const SimpleRequest* /*request*/,
StringValue* response) override {
response->set_message(context->deadline() !=
std::chrono::system_clock::time_point::max()
// Check if deadline - current time <= timeout
// If deadline set, timeout + current time should be an upper bound for it
Status CheckDeadlineUpperBound(ServerContext* context,
- const SimpleRequest* request,
+ const SimpleRequest* /*request*/,
StringValue* response) override {
auto seconds = std::chrono::duration_cast<std::chrono::seconds>(
context->deadline() - std::chrono::system_clock::now());
--- /dev/null
+# Abseil in gRPC
+
+This document explains how to use Abseil throughout gRPC. Note that this isn't
+supposed to explain general usage of Abseil.
+
+## The version of Abseil
+
+gRPC intends to use the LTS versions of Abseil only because it simplifies
+dependency management. Abseil is being distributed via package distribution
+systems such as vcpkg and cocoapods. If gRPC depends on the certain version
+that aren't registered, gRPC in that system cannot get the right version of
+Abseil when being built, resulting in a build failure.
+Therefore, gRPC will use the LTS version only, preferably the latest one.
+
+## Libraries that are not ready to use
+
+Most of Abseil libraries are okay to use but there are some exceptions
+because they're not going well yet on some of our test machinaries or
+platforms it supports. The following is a list of targets that are NOT
+ready to use.
+
+- `absl/synchronization:*`: This will be ready from the LTS version in 2021.
+- `absl/random`: [WIP](https://github.com/grpc/grpc/pull/23346).
+- `absl/types:variant`: [WIP](https://github.com/grpc/grpc/pull/22961).
+
+## Implemetation only
+
+You can use Abseil in gRPC Core and gRPC C++. But you cannot use it in
+the public interface of gRPC C++ because i) it doesn't gurantee no breaking
+API changes like gRPC C++ does and ii) it may make users change their build
+system to address Abseil.
+
\ No newline at end of file
Updating some dependencies requires extra care.
+### Updating third_party/abseil-cpp
+
+- Two additional steps should be done before running `generate_projects.sh` above.
+ - Running `src/abseil-cpp/preprocessed_builds.yaml.gen.py`.
+ - Updating `abseil_version =` scripts in `templates/gRPC-C++.podspec.template` and
+ `templates/gRPC-Core.podspec.template`.
+- You can see an example of previous [upgrade](https://github.com/grpc/grpc/pull/24270).
+
### Updating third_party/boringssl-with-bazel
- Update the `third_party/boringssl-with-bazel` submodule to the latest [`master-with-bazel`](https://github.com/google/boringssl/tree/master-with-bazel) branch
"Linux x86_64")
suffix=linux-x86_64
;;
+ "Linux aarch64")
+ suffix=linux-arm64
+ ;;
"Darwin x86_64")
suffix=darwin-x86_64
;;
if key in indict:
outdict[key] = indict[key]
for key in sorted(indict.keys()):
- if key in special_keys: continue
- if '#' in key: continue
+ if key in special_keys:
+ continue
+ if '#' in key:
+ continue
outdict[key] = indict[key]
return outdict
def _clean_elem(indict):
for name in ['public_headers', 'headers', 'src']:
- if name not in indict: continue
+ if name not in indict:
+ continue
inlist = indict[name]
protos = list(x for x in inlist if os.path.splitext(x)[1] == '.proto')
others = set(x for x in inlist if x not in protos)
"""Takes dictionary which represents yaml file and returns the cleaned-up yaml string"""
js = _rebuild_as_ordered_dict(indict, _TOP_LEVEL_KEYS)
for grp in ['filegroups', 'libs', 'targets']:
- if grp not in js: continue
+ if grp not in js:
+ continue
js[grp] = sorted([_clean_elem(x) for x in js[grp]],
key=lambda x: (x.get('language', '_'), x['name']))
output = yaml.dump(js, indent=2, width=80, default_flow_style=False)
if isinstance(dst, dict) and isinstance(add, dict):
for k, v in add.items():
if k in dst:
- if k == '#': continue
+ if k == '#':
+ continue
merge_json(dst[k], v)
else:
dst[k] = v
while todo:
cur = todo[0]
todo = todo[1:]
- if cur in done: continue
+ if cur in done:
+ continue
things[cur]['used_by'].append(thing['name'])
todo.extend(thing_deps(things[cur]))
done.add(cur)
vals = []
for line in sys.stdin:
line = line.strip()
- if line == '': continue
- if line[0] == '#': continue
+ if line == '':
+ continue
+ if line[0] == '#':
+ continue
key_tail, value = line[1:].split(':')
key = (line[0] + key_tail).strip()
value = value.strip()
with open(sys.argv[0]) as my_source:
copyright = []
for line in my_source:
- if line[0] != '#': break
+ if line[0] != '#':
+ break
for line in my_source:
if line[0] == '#':
copyright.append(line)
switch (y) {
""" % cgargs
for i, r in enumerate(p.r):
- if not r: continue
- if r < 0: print >> C, 'case %d: h -= %d; break;' % (i, -r)
- else: print >> C, 'case %d: h += %d; break;' % (i, r)
+ if not r:
+ continue
+ if r < 0:
+ print >> C, 'case %d: h -= %d; break;' % (i, -r)
+ else:
+ print >> C, 'case %d: h += %d; break;' % (i, r)
print >> C, """
}
*out = (grpc_chttp2_setting_id)h;
best = None
for shift_bits in reversed(range(0, 64)):
n = shift_works_until(mapped_bounds, shift_bits)
- if n == 0: continue
+ if n == 0:
+ continue
table_size = mapped_bounds[n - 1] >> shift_bits
- if table_size > max_size: continue
- if table_size > 65535: continue
+ if table_size > max_size:
+ continue
+ if table_size > 65535:
+ continue
if best is None:
best = (shift_bits, n, table_size)
elif best[1] < n:
global static_tables
v = (type, values)
for i, vp in enumerate(static_tables):
- if v == vp: return i
+ if v == vp:
+ return i
print "ADD TABLE: %s %r" % (type, values)
r = len(static_tables)
static_tables.append(v)
with open(sys.argv[0]) as my_source:
copyright = []
for line in my_source:
- if line[0] != '#': break
+ if line[0] != '#':
+ break
for line in my_source:
if line[0] == '#':
copyright.append(line)
with open(sys.argv[0]) as my_source:
copyright = []
for line in my_source:
- if line[0] != '#': break
+ if line[0] != '#':
+ break
for line in my_source:
if line[0] == '#':
copyright.append(line)
with open('tools/run_tests/performance/massage_qps_stats.py', 'w') as P:
with open(sys.argv[0]) as my_source:
for line in my_source:
- if line[0] != '#': break
+ if line[0] != '#':
+ break
for line in my_source:
if line[0] == '#':
print >> P, line.rstrip()
"envoy/config/route/v3/route_components.proto" \
"envoy/config/route/v3/scoped_route.proto" \
"envoy/config/trace/v3/http_tracer.proto" \
+ "envoy/extensions/clusters/aggregate/v3/cluster.proto" \
"envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto" \
"envoy/extensions/transport_sockets/tls/v3/cert.proto" \
"envoy/extensions/transport_sockets/tls/v3/common.proto" \
"google/protobuf/timestamp.proto" \
"google/protobuf/wrappers.proto" \
"google/rpc/status.proto" \
+ "src/proto/grpc/auth/v1/authz_policy.proto" \
"src/proto/grpc/gcp/altscontext.proto" \
"src/proto/grpc/gcp/handshaker.proto" \
"src/proto/grpc/gcp/transport_security_common.proto" \
"udpa/annotations/sensitive.proto" \
"udpa/annotations/status.proto" \
"udpa/annotations/versioning.proto" \
- "udpa/core/v1/authority.proto" \
- "udpa/core/v1/collection_entry.proto" \
- "udpa/core/v1/context_params.proto" \
- "udpa/core/v1/resource_locator.proto" \
- "udpa/core/v1/resource_name.proto" \
- "udpa/core/v1/resource.proto" \
+ "xds/core/v3/authority.proto" \
+ "xds/core/v3/collection_entry.proto" \
+ "xds/core/v3/context_params.proto" \
+ "xds/core/v3/resource_locator.proto" \
+ "xds/core/v3/resource_name.proto" \
+ "xds/core/v3/resource.proto" \
"validate/validate.proto")
INCLUDE_OPTIONS="-I=$PWD/third_party/udpa \
printed_banner = True
print root
errors += 1
-if printed_banner: print
+if printed_banner:
+ print
printed_banner = False
for target_dir in _TARGET_DIRS:
for root, dirs, filenames in os.walk(target_dir):
def log(cond, why, filename):
- if not cond: return
+ if not cond:
+ return
if args.output == 'details':
print('%s: %s' % (why, filename))
else:
if not running_guard.endswith('_H'):
fcontents = self.fail(fpath, match.re, match.string, match.group(1),
valid_guard, fix)
- if fix: save(fpath, fcontents)
+ if fix:
+ save(fpath, fcontents)
# Is it the expected one based on the file path?
if running_guard != valid_guard:
fcontents = self.fail(fpath, match.re, match.string, match.group(1),
valid_guard, fix)
- if fix: save(fpath, fcontents)
+ if fix:
+ save(fpath, fcontents)
# Is there a #define? Is it the same as the #ifndef one?
match = self.define_re.search(fcontents)
if match.group(1) != running_guard:
fcontents = self.fail(fpath, match.re, match.string, match.group(1),
valid_guard, fix)
- if fix: save(fpath, fcontents)
+ if fix:
+ save(fpath, fcontents)
# Is there a properly commented #endif?
flines = fcontents.rstrip().splitlines()
# Is the #endif guard the same as the #ifndef and #define guards?
fcontents = self.fail(fpath, endif_re, fcontents, match.group(1),
valid_guard, fix)
- if fix: save(fpath, fcontents)
+ if fix:
+ save(fpath, fcontents)
return not self.failed # Did the check succeed? (ie, not failed)
PYTHON=${VIRTUAL_ENV}/bin/python
"$PYTHON" -m pip install --upgrade pip==19.3.1
"$PYTHON" -m pip install --upgrade futures
-"$PYTHON" -m pip install yapf==0.28.0
+"$PYTHON" -m pip install yapf==0.30.0
pushd "$(dirname "${0}")/../.."
FILES=$(find . -path ./third_party -prune -o -name '*.bzl' -print)
# AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!!
-VERSION = '1.35.0'
+VERSION = '1.36.0'
PROTOBUF_VERSION = '3.14.0'
# AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!!
-VERSION = '1.35.0'
+VERSION = '1.36.0'
PROTOBUF_VERSION = '3.14.0'
python3 -m virtualenv $VIRTUALENV -p $(which python3)
PYTHON=${VIRTUALENV}/bin/python
-"$PYTHON" -m pip install --upgrade pip==19.3.1
-"$PYTHON" -m pip install --upgrade futures
-"$PYTHON" -m pip install yapf==0.28.0
+"$PYTHON" -m pip install yapf==0.30.0
-$PYTHON -m yapf $ACTION --recursive --style=setup.cfg "${DIRS[@]}"
+$PYTHON -m yapf $ACTION --parallel --recursive --style=setup.cfg "${DIRS[@]}"
# See the License for the specific language governing permissions and
# limitations under the License.
-# "5.0" tag uses debian buster
-FROM mcr.microsoft.com/dotnet/sdk:5.0
+# "5.0.x" tag uses debian buster
+# we use the full version number to make docker image version updates explicit
+FROM mcr.microsoft.com/dotnet/sdk:5.0.103
RUN apt-get update && apt-get install -y unzip && apt-get clean
RUN yum install -y python-devel
RUN yum install -y epel-release
RUN yum install -y python-pip
-RUN pip install --upgrade pip
+RUN pip install --upgrade pip==19.3.1
RUN pip install -U virtualenv
# The default gcc of CentOS 7 is gcc 4.8 which is older than gcc 4.9,
FROM centos:7
-RUN yum update && yum install -y curl tar which
+RUN yum update -y && yum install -y curl tar which
# Install rvm
RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
RUN curl -sSL https://get.rvm.io | bash -s stable
# Install Ruby 2.3
-RUN /bin/bash -l -c "rvm install ruby-2.3.8"
-RUN /bin/bash -l -c "rvm use --default ruby-2.3.8"
+RUN /bin/bash -l -c "rvm install ruby-2.4.9"
+RUN /bin/bash -l -c "rvm use --default ruby-2.4.9"
RUN /bin/bash -l -c "echo 'gem: --no-document' > ~/.gemrc"
RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
-RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.3.8' >> ~/.bashrc"
+RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.4.9' >> ~/.bashrc"
RUN /bin/bash -l -c "gem install bundler -v 1.17.3 --no-document"
RUN mkdir /var/local/jenkins
RUN curl -sSL https://get.rvm.io | bash -s stable
# Install Ruby 2.3
-RUN /bin/bash -l -c "rvm install ruby-2.3.8"
-RUN /bin/bash -l -c "rvm use --default ruby-2.3.8"
+RUN /bin/bash -l -c "rvm install ruby-2.4.9"
+RUN /bin/bash -l -c "rvm use --default ruby-2.4.9"
RUN /bin/bash -l -c "echo 'gem: --no-document' > ~/.gemrc"
RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
-RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.3.8' >> ~/.bashrc"
+RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.4.9' >> ~/.bashrc"
RUN /bin/bash -l -c "gem install bundler -v 1.17.3 --no-document"
RUN mkdir /var/local/jenkins
+++ /dev/null
-# Copyright 2015 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.
-
-FROM debian:jessie
-
-# Install Git and basic packages.
-RUN apt-get update && apt-get install -y \
- curl \
- gcc && apt-get clean
-
-#==================
-# Ruby dependencies
-
-# Install rvm
-RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
-RUN \curl -sSL https://get.rvm.io | bash -s stable
-
-# Install Ruby 2.3
-RUN /bin/bash -l -c "rvm install ruby-2.3.8"
-RUN /bin/bash -l -c "rvm use --default ruby-2.3.8"
-RUN /bin/bash -l -c "echo 'gem: --no-document' > ~/.gemrc"
-RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
-RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.3.8' >> ~/.bashrc"
-RUN /bin/bash -l -c "gem update --system"
-RUN /bin/bash -l -c "gem install bundler -v 1.17.3 --no-document"
-
-RUN mkdir /var/local/jenkins
-
-# Define the default command.
-CMD ["bash"]
FROM ubuntu:16.04
-RUN apt-get update -y && apt-get install -y ruby-full
+# Install Git and basic packages.
+RUN apt-get update -y && apt-get install -y \
+ curl \
+ gcc && apt-get clean
-RUN gem install bundler
+#==================
+# Ruby dependencies
+
+# Install rvm
+RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
+RUN \curl -sSL https://get.rvm.io | bash -s stable
+
+# Install Ruby 2.4
+RUN /bin/bash -l -c "rvm install ruby-2.4.9"
+RUN /bin/bash -l -c "rvm use --default ruby-2.4.9"
+RUN /bin/bash -l -c "echo 'gem: --no-document' > ~/.gemrc"
+RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
+RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.4.9' >> ~/.bashrc"
+RUN /bin/bash -l -c "gem install bundler -v 1.17.3 --no-document"
# Cloning from a local path sets RepositoryUrl to a path and breaks Source Link.
# Override RepositoryUrl to a URL to fix Source Link. The value doesn't matter.
-dotnet build --configuration Debug --output ./output/InteropTestsWebsite testassets/InteropTestsWebsite/InteropTestsWebsite.csproj -p:RepositoryUrl=https://github.com/grpc/grpc-dotnet.git
-dotnet build --configuration Debug --output ./output/InteropTestsClient testassets/InteropTestsClient/InteropTestsClient.csproj -p:RepositoryUrl=https://github.com/grpc/grpc-dotnet.git
+dotnet build --configuration Debug --output ./output/InteropTestsWebsite testassets/InteropTestsWebsite/InteropTestsWebsite.csproj -p:RepositoryUrl=https://github.com/grpc/grpc-dotnet.git -p:LatestFramework=true
+dotnet build --configuration Debug --output ./output/InteropTestsClient testassets/InteropTestsClient/InteropTestsClient.csproj -p:RepositoryUrl=https://github.com/grpc/grpc-dotnet.git -p:LatestFramework=true
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM google/dart:2.10
+FROM google/dart:2.12-beta
# Define the default command.
CMD ["bash"]
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.35.0
+PROJECT_NUMBER = 1.36.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.35.0
+PROJECT_NUMBER = 1.36.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc \
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h \
+src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc \
src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \
src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc \
src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h \
src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h \
src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h \
+src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c \
+src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c \
src/core/ext/upb-generated/udpa/annotations/status.upb.h \
src/core/ext/upb-generated/udpa/annotations/versioning.upb.c \
src/core/ext/upb-generated/udpa/annotations/versioning.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/authority.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/authority.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/resource.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/resource.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h \
src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h \
src/core/ext/upb-generated/validate/validate.upb.c \
src/core/ext/upb-generated/validate/validate.upb.h \
+src/core/ext/upb-generated/xds/core/v3/authority.upb.c \
+src/core/ext/upb-generated/xds/core/v3/authority.upb.h \
+src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c \
+src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h \
+src/core/ext/upb-generated/xds/core/v3/context_params.upb.c \
+src/core/ext/upb-generated/xds/core/v3/context_params.upb.h \
+src/core/ext/upb-generated/xds/core/v3/resource.upb.c \
+src/core/ext/upb-generated/xds/core/v3/resource.upb.h \
+src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c \
+src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h \
+src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c \
+src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h \
src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-generated/google/api/http.upbdefs.h \
src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h \
-src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
-src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h \
src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h \
src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h \
src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h \
src/core/ext/upbdefs-generated/validate/validate.upbdefs.c \
src/core/ext/upbdefs-generated/validate/validate.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h \
src/core/ext/xds/certificate_provider_factory.h \
src/core/ext/xds/certificate_provider_registry.cc \
src/core/ext/xds/certificate_provider_registry.h \
src/core/lib/gprpp/thd.h \
src/core/lib/gprpp/thd_posix.cc \
src/core/lib/gprpp/thd_windows.cc \
+src/core/lib/gprpp/time_util.cc \
+src/core/lib/gprpp/time_util.h \
src/core/lib/http/format_request.cc \
src/core/lib/http/format_request.h \
src/core/lib/http/httpcli.cc \
src/core/lib/iomgr/iomgr_internal.cc \
src/core/lib/iomgr/iomgr_internal.h \
src/core/lib/iomgr/iomgr_posix.cc \
-src/core/lib/iomgr/iomgr_posix.h \
src/core/lib/iomgr/iomgr_posix_cfstream.cc \
src/core/lib/iomgr/iomgr_uv.cc \
src/core/lib/iomgr/iomgr_windows.cc \
src/core/lib/security/authorization/authorization_engine.h \
src/core/lib/security/authorization/evaluate_args.cc \
src/core/lib/security/authorization/evaluate_args.h \
+src/core/lib/security/authorization/matchers.cc \
+src/core/lib/security/authorization/matchers.h \
src/core/lib/security/authorization/mock_cel/activation.h \
src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h \
src/core/lib/security/authorization/mock_cel/cel_expression.h \
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 14.0.0
+PROJECT_NUMBER = 15.0.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 14.0.0
+PROJECT_NUMBER = 15.0.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc \
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \
src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h \
+src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc \
src/core/ext/filters/client_channel/resolver/sockaddr/README.md \
src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \
src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc \
src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h \
src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c \
src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h \
+src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c \
+src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c \
src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h \
src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c \
src/core/ext/upb-generated/udpa/annotations/status.upb.h \
src/core/ext/upb-generated/udpa/annotations/versioning.upb.c \
src/core/ext/upb-generated/udpa/annotations/versioning.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/authority.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/authority.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/collection_entry.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/context_params.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/context_params.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/resource.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/resource.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/resource_locator.upb.h \
-src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.c \
-src/core/ext/upb-generated/udpa/core/v1/resource_name.upb.h \
src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \
src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h \
src/core/ext/upb-generated/validate/validate.upb.c \
src/core/ext/upb-generated/validate/validate.upb.h \
+src/core/ext/upb-generated/xds/core/v3/authority.upb.c \
+src/core/ext/upb-generated/xds/core/v3/authority.upb.h \
+src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c \
+src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h \
+src/core/ext/upb-generated/xds/core/v3/context_params.upb.c \
+src/core/ext/upb-generated/xds/core/v3/context_params.upb.h \
+src/core/ext/upb-generated/xds/core/v3/resource.upb.c \
+src/core/ext/upb-generated/xds/core/v3/resource.upb.h \
+src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c \
+src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h \
+src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c \
+src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h \
src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h \
+src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c \
+src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c \
src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h \
src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c \
src/core/ext/upbdefs-generated/google/api/http.upbdefs.h \
src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h \
-src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c \
-src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h \
src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c \
src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h \
src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h \
src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c \
src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/authority.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/collection_entry.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/context_params.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_locator.upbdefs.h \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.c \
-src/core/ext/upbdefs-generated/udpa/core/v1/resource_name.upbdefs.h \
src/core/ext/upbdefs-generated/validate/validate.upbdefs.c \
src/core/ext/upbdefs-generated/validate/validate.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h \
+src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c \
+src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h \
src/core/ext/xds/certificate_provider_factory.h \
src/core/ext/xds/certificate_provider_registry.cc \
src/core/ext/xds/certificate_provider_registry.h \
src/core/lib/gprpp/thd.h \
src/core/lib/gprpp/thd_posix.cc \
src/core/lib/gprpp/thd_windows.cc \
+src/core/lib/gprpp/time_util.cc \
+src/core/lib/gprpp/time_util.h \
src/core/lib/http/format_request.cc \
src/core/lib/http/format_request.h \
src/core/lib/http/httpcli.cc \
src/core/lib/iomgr/iomgr_internal.cc \
src/core/lib/iomgr/iomgr_internal.h \
src/core/lib/iomgr/iomgr_posix.cc \
-src/core/lib/iomgr/iomgr_posix.h \
src/core/lib/iomgr/iomgr_posix_cfstream.cc \
src/core/lib/iomgr/iomgr_uv.cc \
src/core/lib/iomgr/iomgr_windows.cc \
src/core/lib/security/authorization/authorization_engine.h \
src/core/lib/security/authorization/evaluate_args.cc \
src/core/lib/security/authorization/evaluate_args.h \
+src/core/lib/security/authorization/matchers.cc \
+src/core/lib/security/authorization/matchers.h \
src/core/lib/security/authorization/mock_cel/activation.h \
src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h \
src/core/lib/security/authorization/mock_cel/cel_expression.h \
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.35.0
+PROJECT_NUMBER = 1.36.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.35.0
+PROJECT_NUMBER = 1.36.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = 1.35.0
+PROJECT_NUMBER = 1.36.0
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
src/php/lib/Grpc/Server.php \
src/php/lib/Grpc/ServerCredentials.php \
src/php/lib/Grpc/ServerStreamingCall.php \
+src/php/lib/Grpc/Status.php \
src/php/lib/Grpc/Timeval.php \
src/php/lib/Grpc/UnaryCall.php
failures = 0
errors = 0
latest_datetime = None
- if not statuses: return None
- if system == 'kokoro': string_in_target_url = 'kokoro'
- elif system == 'jenkins': string_in_target_url = 'grpc-testing'
+ if not statuses:
+ return None
+ if system == 'kokoro':
+ string_in_target_url = 'kokoro'
+ elif system == 'jenkins':
+ string_in_target_url = 'grpc-testing'
for status in statuses['statuses']:
if not status['target_url'] or string_in_target_url not in status[
'target_url']:
continue # Ignore jenkins
- if status['state'] == 'pending': return None
- elif status['state'] == 'success': successes += 1
- elif status['state'] == 'failure': failures += 1
- elif status['state'] == 'error': errors += 1
+ if status['state'] == 'pending':
+ return None
+ elif status['state'] == 'success':
+ successes += 1
+ elif status['state'] == 'failure':
+ failures += 1
+ elif status['state'] == 'error':
+ errors += 1
if not latest_datetime:
latest_datetime = parse_timestamp(status['updated_at'])
else:
args_parser = build_args_parser()
args = args_parser.parse_args()
TOKEN = args.token
- if args.format == 'csv': print_csv_header()
+ if args.format == 'csv':
+ print_csv_header()
for pr_data in get_pr_data():
commit_data = get_commits_data(pr_data['number'])
# PR with a single commit -> use the PRs creation time.
${name}')
cd /var/local/git/grpc
-bazel build :all //test/... //examples/...
+# Build all basic targets using the strict warning option which leverages the
+# clang compiler to check if sources can pass a set of warning options.
+bazel build --define=use_strict_warning=true \
+ :all \
+ //src/core/... \
+ //src/compiler/... \
+ //test/... \
+ //examples/...
# TODO(jtattersmusch): Adding a build here for --define=grpc_no_xds is not ideal
# and we should find a better place for this. Refer
do
zip -jr "$PROTOC_PLUGINS_ZIPPED_PACKAGES/grpc-$zip_dir-$GRPC_VERSION.zip" "$INPUT_ARTIFACTS/$zip_dir/"*
done
-for tar_dir in protoc_{linux,macos}_{x86,x64}
+for tar_dir in protoc_linux_{x86,x64} protoc_macos_x64
do
chmod +x "$INPUT_ARTIFACTS/$tar_dir"/*
tar -cvzf "$PROTOC_PLUGINS_ZIPPED_PACKAGES/grpc-$tar_dir-$GRPC_VERSION.tar.gz" -C "$INPUT_ARTIFACTS/$tar_dir" .
PROTOC_PACKAGES=(
"$PROTOC_PLUGINS_ZIPPED_PACKAGES"/grpc-protoc_windows_{x86,x64}-"$GRPC_VERSION.zip"
- "$PROTOC_PLUGINS_ZIPPED_PACKAGES"/grpc-protoc_{linux,macos}_{x86,x64}-"$GRPC_VERSION.tar.gz"
+ "$PROTOC_PLUGINS_ZIPPED_PACKAGES"/grpc-protoc_linux_{x86,x64}-"$GRPC_VERSION.tar.gz"
+ "$PROTOC_PLUGINS_ZIPPED_PACKAGES"/grpc-protoc_macos_x64-"$GRPC_VERSION.tar.gz"
)
# C#
# Location of the continuous shell script in repository.
build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh"
-timeout_mins: 120
+timeout_mins: 180
env_vars {
key: "BAZEL_SCRIPT"
value: "tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh"
cd /var/local/git/grpc
VIRTUAL_ENV=$(mktemp -d)
-virtualenv "$VIRTUAL_ENV"
+virtualenv "$VIRTUAL_ENV" -p python3
PYTHON="$VIRTUAL_ENV"/bin/python
-"$PYTHON" -m pip install --upgrade pip
+"$PYTHON" -m pip install --upgrade pip==19.3.1
"$PYTHON" -m pip install --upgrade grpcio-tools google-api-python-client google-auth-httplib2 oauth2client
# Prepare generated Python code.
tools/run_tests/run_xds_tests.py \
--test_case="all,path_matching,header_matching,circuit_breaking" \
--project_id=grpc-testing \
+ --project_num=830293263384 \
--source_image=projects/grpc-testing/global/images/xds-test-server-3 \
--path_to_server_binary=/java_server/grpc-java/interop-testing/build/install/grpc-interop-testing/bin/xds-test-server \
--gcp_suffix=$(date '+%s') \
--verbose \
+ ${XDS_V3_OPT-} \
--client_cmd='bazel run --test_env="PYTHONUNBUFFERED=true" //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client -- --server=xds:///{server_uri} --stats_port={stats_port} --qps={qps} --verbose {rpcs_to_send} {metadata_to_send}'
cd /var/local/git/grpc
VIRTUAL_ENV=$(mktemp -d)
-virtualenv "$VIRTUAL_ENV"
+virtualenv "$VIRTUAL_ENV" -p python3
PYTHON="$VIRTUAL_ENV"/bin/python
-"$PYTHON" -m pip install --upgrade pip
+"$PYTHON" -m pip install --upgrade pip==19.3.1
"$PYTHON" -m pip install --upgrade grpcio grpcio-tools google-api-python-client google-auth-httplib2 oauth2client
# Prepare generated Python code.
tools/run_tests/run_xds_tests.py \
--test_case="all,path_matching,header_matching,circuit_breaking" \
--project_id=grpc-testing \
+ --project_num=830293263384 \
--source_image=projects/grpc-testing/global/images/xds-test-server-3 \
--path_to_server_binary=/java_server/grpc-java/interop-testing/build/install/grpc-interop-testing/bin/xds-test-server \
--gcp_suffix=$(date '+%s') \
--verbose \
+ ${XDS_V3_OPT-} \
--client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds:///{server_uri} --stats_port={stats_port} --qps={qps} {fail_on_failed_rpc} \
{rpcs_to_send} \
{metadata_to_send}'
# Location of the continuous shell script in repository.
build_file: "grpc/tools/internal_ci/linux/grpc_xds_csharp.sh"
-timeout_mins: 120
+timeout_mins: 180
action {
define_artifacts {
regex: "**/*sponge_log.*"
cd /var/local/git/grpc
VIRTUAL_ENV=$(mktemp -d)
-virtualenv "$VIRTUAL_ENV"
+virtualenv "$VIRTUAL_ENV" -p python3
PYTHON="$VIRTUAL_ENV"/bin/python
-"$PYTHON" -m pip install --upgrade pip
+"$PYTHON" -m pip install --upgrade pip==19.3.1
"$PYTHON" -m pip install --upgrade grpcio grpcio-tools google-api-python-client google-auth-httplib2 oauth2client
# Prepare generated Python code.
tools/run_tests/run_xds_tests.py \
--test_case="all,path_matching,header_matching" \
--project_id=grpc-testing \
+ --project_num=830293263384 \
--source_image=projects/grpc-testing/global/images/xds-test-server-2 \
--path_to_server_binary=/java_server/grpc-java/interop-testing/build/install/grpc-interop-testing/bin/xds-test-server \
--gcp_suffix=$(date '+%s') \
--verbose \
+ ${XDS_V3_OPT-} \
--client_cmd='dotnet exec src/csharp/Grpc.IntegrationTesting.XdsClient/bin/Release/netcoreapp2.1/Grpc.IntegrationTesting.XdsClient.dll -- --server=xds:///{server_uri} --stats_port={stats_port} --qps={qps} {rpcs_to_send} {metadata_to_send}'
cd /var/local/git/grpc
VIRTUAL_ENV=$(mktemp -d)
-virtualenv "$VIRTUAL_ENV"
+virtualenv "$VIRTUAL_ENV" -p python3
PYTHON="$VIRTUAL_ENV"/bin/python
-"$PYTHON" -m pip install --upgrade pip
+"$PYTHON" -m pip install --upgrade pip==19.3.1
"$PYTHON" -m pip install --upgrade grpcio-tools google-api-python-client google-auth-httplib2 oauth2client
# Prepare generated Python code.
tools/run_tests/run_xds_tests.py \
--test_case="all,path_matching,header_matching" \
--project_id=grpc-testing \
+ --project_num=830293263384 \
--source_image=projects/grpc-testing/global/images/xds-test-server-2 \
--path_to_server_binary=/java_server/grpc-java/interop-testing/build/install/grpc-interop-testing/bin/xds-test-server \
--gcp_suffix=$(date '+%s') \
--verbose \
+ ${XDS_V3_OPT-} \
--client_cmd='php -d extension=grpc.so -d extension=pthreads.so src/php/tests/interop/xds_client.php --server=xds:///{server_uri} --stats_port={stats_port} --qps={qps} {fail_on_failed_rpc} {rpcs_to_send} {metadata_to_send}'
# Location of the continuous shell script in repository.
build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh"
-timeout_mins: 120
+timeout_mins: 180
env_vars {
key: "BAZEL_SCRIPT"
value: "tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh"
cd /var/local/git/grpc
VIRTUAL_ENV=$(mktemp -d)
-virtualenv "$VIRTUAL_ENV"
+virtualenv "$VIRTUAL_ENV" -p python3
PYTHON="$VIRTUAL_ENV"/bin/python
-"$PYTHON" -m pip install --upgrade pip
+"$PYTHON" -m pip install --upgrade pip==19.3.1
"$PYTHON" -m pip install --upgrade grpcio-tools google-api-python-client google-auth-httplib2 oauth2client
# Prepare generated Python code.
tools/run_tests/run_xds_tests.py \
--test_case="all,path_matching,header_matching,circuit_breaking" \
--project_id=grpc-testing \
+ --project_num=830293263384 \
--source_image=projects/grpc-testing/global/images/xds-test-server-3 \
--path_to_server_binary=/java_server/grpc-java/interop-testing/build/install/grpc-interop-testing/bin/xds-test-server \
--gcp_suffix=$(date '+%s') \
--verbose \
+ ${XDS_V3_OPT-} \
--client_cmd='ruby src/ruby/pb/test/xds_client.rb --server=xds:///{server_uri} --stats_port={stats_port} --qps={qps} {fail_on_failed_rpc} {rpcs_to_send} {metadata_to_send}'
--- /dev/null
+# Copyright 2021 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.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh"
+timeout_mins: 180
+env_vars {
+ key: "BAZEL_SCRIPT"
+ value: "tools/internal_ci/linux/grpc_xds_v3_bazel_test_in_docker.sh"
+}
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.*"
+ regex: "github/grpc/reports/**"
+ }
+}
--- /dev/null
+#!/usr/bin/env bash
+# Copyright 2021 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.
+
+XDS_V3_OPT="--xds_v3_support" `dirname $0`/grpc_xds_bazel_python_test_in_docker.sh
--- /dev/null
+#!/usr/bin/env bash
+# Copyright 2021 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.
+
+XDS_V3_OPT="--xds_v3_support" `dirname $0`/grpc_xds_bazel_test_in_docker.sh
--- /dev/null
+# Copyright 2021 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.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_xds_v3_csharp.sh"
+timeout_mins: 180
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.*"
+ regex: "github/grpc/reports/**"
+ }
+}
--- /dev/null
+#!/usr/bin/env bash
+# Copyright 2021 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.
+
+set -ex
+
+# change to grpc repo root
+cd $(dirname $0)/../../..
+
+source tools/internal_ci/helper_scripts/prepare_build_linux_rc
+
+export DOCKERFILE_DIR=tools/dockerfile/test/csharp_stretch_x64
+export DOCKER_RUN_SCRIPT=tools/internal_ci/linux/grpc_xds_v3_csharp_test_in_docker.sh
+export OUTPUT_DIR=reports
+exec tools/run_tests/dockerize/build_and_run_docker.sh
--- /dev/null
+#!/usr/bin/env bash
+# Copyright 2021 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.
+
+XDS_V3_OPT="--xds_v3_support" `dirname $0`/grpc_xds_csharp_test_in_docker.sh
--- /dev/null
+# Copyright 2021 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.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_xds_v3_php.sh"
+timeout_mins: 180
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.*"
+ regex: "github/grpc/reports/**"
+ }
+}
--- /dev/null
+#!/usr/bin/env bash
+# Copyright 2021 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.
+
+set -ex
+
+# change to grpc repo root
+cd $(dirname $0)/../../..
+
+source tools/internal_ci/helper_scripts/prepare_build_linux_rc
+
+export DOCKERFILE_DIR=tools/dockerfile/test/php73_zts_stretch_x64
+export DOCKER_RUN_SCRIPT=tools/internal_ci/linux/grpc_xds_v3_php_test_in_docker.sh
+export OUTPUT_DIR=reports
+exec tools/run_tests/dockerize/build_and_run_docker.sh
--- /dev/null
+#!/usr/bin/env bash
+# Copyright 2021 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.
+
+XDS_V3_OPT="--xds_v3_support" `dirname $0`/grpc_xds_php_test_in_docker.sh
--- /dev/null
+# Copyright 2021 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.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh"
+timeout_mins: 180
+env_vars {
+ key: "BAZEL_SCRIPT"
+ value: "tools/internal_ci/linux/grpc_xds_v3_bazel_python_test_in_docker.sh"
+}
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.*"
+ regex: "github/grpc/reports/**"
+ }
+}
--- /dev/null
+# Copyright 2021 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.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_xds_v3_ruby.sh"
+timeout_mins: 180
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.*"
+ regex: "github/grpc/reports/**"
+ }
+}
--- /dev/null
+#!/usr/bin/env bash
+# Copyright 2021 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.
+
+set -ex
+
+# change to grpc repo root
+cd $(dirname $0)/../../..
+
+source tools/internal_ci/helper_scripts/prepare_build_linux_rc
+
+export DOCKERFILE_DIR=tools/dockerfile/test/ruby_buster_x64
+export DOCKER_RUN_SCRIPT=tools/internal_ci/linux/grpc_xds_v3_ruby_test_in_docker.sh
+export OUTPUT_DIR=reports
+exec tools/run_tests/dockerize/build_and_run_docker.sh
--- /dev/null
+#!/usr/bin/env bash
+# Copyright 2021 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.
+
+XDS_V3_OPT="--xds_v3_support" `dirname $0`/grpc_xds_ruby_test_in_docker.sh
('v1.32.0', ReleaseInfo()),
('v1.33.2', ReleaseInfo()),
('v1.34.0', ReleaseInfo()),
+ ('v1.35.0', ReleaseInfo()),
]),
'go':
OrderedDict([
('v1.33.1',
ReleaseInfo(runtimes=['go1.11'], testcases_file='go__v1.20.0')),
('v1.34.0', ReleaseInfo(runtimes=['go1.11'])),
+ ('v1.35.0', ReleaseInfo(runtimes=['go1.11'])),
]),
'java':
OrderedDict([
('v1.32.2', ReleaseInfo()),
('v1.33.1', ReleaseInfo()),
('v1.34.1', ReleaseInfo()),
+ ('v1.35.0', ReleaseInfo()),
]),
'python':
OrderedDict([
('v1.32.0', ReleaseInfo(runtimes=['python'])),
('v1.33.2', ReleaseInfo(runtimes=['python'])),
('v1.34.0', ReleaseInfo(runtimes=['python'])),
+ ('v1.35.0', ReleaseInfo(runtimes=['python'])),
]),
'node':
OrderedDict([
('v1.32.0', ReleaseInfo()),
('v1.33.2', ReleaseInfo()),
('v1.34.0', ReleaseInfo()),
+ ('v1.35.0', ReleaseInfo()),
]),
'php':
OrderedDict([
('v1.32.0', ReleaseInfo()),
('v1.33.2', ReleaseInfo()),
('v1.34.0', ReleaseInfo()),
+ ('v1.35.0', ReleaseInfo()),
]),
'csharp':
OrderedDict([
('v1.32.0', ReleaseInfo()),
('v1.33.2', ReleaseInfo()),
('v1.34.0', ReleaseInfo()),
+ ('v1.35.0', ReleaseInfo()),
]),
}
writer = csv.DictWriter(
outf, ['date', 'name', 'language', 'code', 'comment', 'blank'])
for key, value in data.iteritems():
- if key == 'header': continue
- if key == 'SUM': continue
- if key.startswith('third_party/'): continue
+ if key == 'header':
+ continue
+ if key == 'SUM':
+ continue
+ if key.startswith('third_party/'):
+ continue
row = {'name': key, 'date': args.date}
row.update(value)
writer.writerow(row)
for line in src:
line = line.strip()
# line := directive | comment
- if not line: continue
- if line[0] == '#': continue
+ if not line:
+ continue
+ if line[0] == '#':
+ continue
# it's a directive
directive = None
if line == 'set noparent':
best_parent = None
best_parent_score = None
for possible_parent in owners_data:
- if possible_parent is owners: continue
+ if possible_parent is owners:
+ continue
rel = os.path.relpath(owners.dir, possible_parent.dir)
# '..' ==> we had to walk up from possible_parent to get to owners
# ==> not a parent
- if '..' in rel: continue
+ if '..' in rel:
+ continue
depth = len(rel.split(os.sep))
if not best_parent or depth < best_parent_score:
best_parent = possible_parent
def git_glob(glob):
global gg_cache
- if glob in gg_cache: return gg_cache[glob]
+ if glob in gg_cache:
+ return gg_cache[glob]
r = set(
subprocess.check_output([
'git', 'ls-files', os.path.join(git_root, glob)
def add_parent_to_globs(parent, globs, globs_dir):
- if not parent: return
+ if not parent:
+ return
for owners in owners_data:
if owners.dir == parent:
owners_globs = expand_directives(owners.dir, owners.directives)
sane_row = {}
for name, sql_type in columns:
if name in row:
- if row[name] == '': continue
+ if row[name] == '':
+ continue
sane_row[name] = SANITIZE[sql_type](row[name])
writer.writerow(sane_row)
help='Print details of before/after')
args = argp.parse_args()
global verbose
- if args.verbose: verbose = True
+ if args.verbose:
+ verbose = True
assert args.new
assert args.old
return args
def _maybe_print(str):
- if verbose: print str
+ if verbose:
+ print str
class Benchmark:
for f in sorted(track):
new = self.samples[True][f]
old = self.samples[False][f]
- if not new or not old: continue
+ if not new or not old:
+ continue
mdn_diff = abs(_median(new) - _median(old))
_maybe_print('%s: %s=%r %s=%r mdn_diff=%r' %
(f, new_name, new, old_name, old, mdn_diff))
headers = ['Benchmark'] + fields
rows = []
for name in sorted(benchmarks.keys()):
- if benchmarks[name].skip(): continue
+ if benchmarks[name].skip():
+ continue
rows.append([name] + benchmarks[name].row(fields))
note = None
if len(badjson_files):
def speedup(new, old, threshold=_DEFAULT_THRESHOLD):
- if (len(set(new))) == 1 and new == old: return 0
+ if (len(set(new))) == 1 and new == old:
+ return 0
s0, p0 = cmp(new, old)
- if math.isnan(p0): return 0
- if s0 == 0: return 0
- if p0 > threshold: return 0
+ if math.isnan(p0):
+ return 0
+ if s0 == 0:
+ return 0
+ if p0 > threshold:
+ return 0
if s0 < 0:
pct = 1
while pct < 100:
sp, pp = cmp(new, scale(old, 1 - pct / 100.0))
- if sp > 0: break
- if pp > threshold: break
+ if sp > 0:
+ break
+ if pp > threshold:
+ break
pct += 1
return -(pct - 1)
else:
pct = 1
while pct < 10000:
sp, pp = cmp(new, scale(old, 1 + pct / 100.0))
- if sp < 0: break
- if pp > threshold: break
+ if sp < 0:
+ break
+ if pp > threshold:
+ break
pct += 1
return pct - 1
def numericalize(s):
"""Convert abbreviations like '100M' or '10k' to a number."""
- if not s: return ''
+ if not s:
+ return ''
if s[-1] == 'k':
return float(s[:-1]) * 1024
if s[-1] == 'M':
def expand_json(js, js2=None):
- if not js and not js2: raise StopIteration()
- if not js: js = js2
+ if not js and not js2:
+ raise StopIteration()
+ if not js:
+ js = js2
for bm in js['benchmarks']:
if bm['name'].endswith('_stddev') or bm['name'].endswith('_mean'):
continue
cp -r "${EXTERNAL_GIT_ROOT}"/input_artifacts/python_*/* artifacts/ || true
apt-get install -y python-pip
-python -m pip install -U pip
+python -m pip install -U pip==19.3.1
python -m pip install -U wheel
strip_binary_wheel() {
class CSharpDistribTest(object):
"""Tests C# NuGet package"""
- def __init__(self, platform, arch, docker_suffix=None,
+ def __init__(self,
+ platform,
+ arch,
+ docker_suffix=None,
use_dotnet_cli=False):
self.name = 'csharp_%s_%s' % (platform, arch)
self.platform = platform
PythonDistribTest('linux', 'x64', 'ubuntu1604', source=True),
PythonDistribTest('linux', 'x64', 'ubuntu1804', source=True),
# Ruby
- RubyDistribTest('linux', 'x64', 'jessie', ruby_version='ruby_2_3'),
RubyDistribTest('linux', 'x64', 'jessie', ruby_version='ruby_2_4'),
RubyDistribTest('linux', 'x64', 'jessie', ruby_version='ruby_2_5'),
RubyDistribTest('linux', 'x64', 'jessie', ruby_version='ruby_2_6'),
RubyDistribTest('linux',
'x64',
'jessie',
- ruby_version='ruby_2_3',
+ ruby_version='ruby_2_4',
source=True),
RubyDistribTest('linux', 'x64', 'centos7'),
RubyDistribTest('linux', 'x64', 'fedora23'),
"flaky": false,
"gtest": true,
"language": "c++",
+ "name": "context_allocator_end2end_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "uses_polling": true
+ },
+ {
+ "args": [],
+ "benchmark": false,
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
"name": "context_list_test",
"platforms": [
"linux",
"flaky": false,
"gtest": true,
"language": "c++",
+ "name": "matchers_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "uses_polling": true
+ },
+ {
+ "args": [],
+ "benchmark": false,
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
"name": "message_allocator_end2end_test",
"platforms": [
"linux",
"flaky": false,
"gtest": true,
"language": "c++",
+ "name": "time_util_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "uses_polling": false
+ },
+ {
+ "args": [],
+ "benchmark": false,
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": true,
+ "language": "c++",
"name": "timer_test",
"platforms": [
"linux",
# See https://github.com/grpc/grpc/issues/14815 for more context. We cannot rely
# on pip to upgrade itself because if pip is too old, it may not have the required
# TLS version to run `pip install`.
-curl https://bootstrap.pypa.io/get-pip.py | $VENV_PYTHON
+curl https://bootstrap.pypa.io/2.7/get-pip.py | $VENV_PYTHON
# pip-installs the directory specified. Used because on MSYS the vanilla Windows
# Python gets confused when parsing paths.
1, 200000, math.sqrt(10)):
if synchronicity == 'sync' and outstanding > 1200:
continue
- if outstanding < channels: continue
+ if outstanding < channels:
+ continue
yield _ping_pong_scenario(
'cpp_protobuf_%s_%s_qps_unconstrained_%s_%d_channels_%d_outstanding'
% (synchronicity, rpc_type, secstr, channels,
'^test/distrib/php/': [_PHP_TEST_SUITE],
'^test/distrib/python/': [_PYTHON_TEST_SUITE],
'^test/distrib/ruby/': [_RUBY_TEST_SUITE],
+ '^tools/run_tests/xds_k8s_test_driver/': [],
'^vsprojects/': [_WINDOWS_TEST_SUITE],
'composer\.json$': [_PHP_TEST_SUITE],
'config\.m4$': [_PHP_TEST_SUITE],
def __cmp__(self, other):
return self.identity() == other.identity()
+ def __lt__(self, other):
+ return self.identity() < other.identity()
+
def __repr__(self):
return 'JobSpec(shortname=%s, cmdline=%s)' % (self.shortname,
self.cmdline)
message('SKIPPED', spec.shortname, do_newline=True)
self.resultset[spec.shortname] = [skipped_job_result]
return True
- if self.cancelled(): return False
+ if self.cancelled():
+ return False
current_cpu_cost = self.cpu_cost()
- if current_cpu_cost == 0: break
+ if current_cpu_cost == 0:
+ break
if current_cpu_cost + spec.cpu_cost <= self._maxjobs:
if len(self._running) < self._maxjobs_cpu_agnostic:
break
self.reap(spec.shortname, spec.cpu_cost)
- if self.cancelled(): return False
+ if self.cancelled():
+ return False
job = Job(spec, self._newline_on_success, self._travis, self._add_env,
self._quiet_success)
self._running.add(job)
dead = set()
for job in self._running:
st = eintr_be_gone(lambda: job.state())
- if st == _RUNNING: continue
+ if st == _RUNNING:
+ continue
if st == _FAILURE or st == _KILLED:
self._failures += 1
if self._stop_on_failure:
if not self._quiet_success or job.result.state != 'PASSED':
self.resultset[job.GetSpec().shortname].append(job.result)
self._running.remove(job)
- if dead: return
+ if dead:
+ return
if not self._travis and platform_string() != 'windows':
rstr = '' if self._remaining is None else '%d queued, ' % self._remaining
if self._remaining is not None and self._completed > 0:
def cancelled(self):
"""Poll for cancellation."""
- if self._cancelled: return True
- if not self._check_cancelled(): return False
+ if self._cancelled:
+ return True
+ if not self._check_cancelled():
+ return False
for job in self._running:
job.kill()
self._cancelled = True
def finish(self):
while self._running:
- if self.cancelled(): pass # poll cancellation
+ if self.cancelled():
+ pass # poll cancellation
self.reap()
if platform_string() != 'windows':
signal.alarm(0)
def can_connect(port):
# this test is only really useful on unices where SO_REUSE_PORT is available
# so on Windows, where this test is expensive, skip it
- if platform.system() == 'Windows': return False
+ if platform.system() == 'Windows':
+ return False
s = socket.socket()
try:
s.connect(('localhost', port))
]
random.shuffle(chk)
for i in chk:
- if len(pool) > 100: break
+ if len(pool) > 100:
+ break
if i in in_use:
age = time.time() - in_use[i]
if age < max_timeout:
continue
for root, _, files in os.walk(path):
for f in files:
- if f and f[0] == '.': continue
+ if f and f[0] == '.':
+ continue
try:
st = os.stat(os.path.join(root, f))
except OSError as e:
out = ''
for c in s:
if c in '<>, /':
- if len(out) and out[-1] == '_': continue
+ if len(out) and out[-1] == '_':
+ continue
out += '_'
else:
out += c
tests = subprocess.check_output(
[binary, '--benchmark_list_tests'],
stderr=fnull)
- for line in tests.split('\n'):
+ for line in tests.decode().split('\n'):
test = line.strip()
- if not test: continue
+ if not test:
+ continue
cmdline = [binary,
'--benchmark_filter=%s$' % test
] + target['args']
tests = subprocess.check_output(
[binary, '--gtest_list_tests'], stderr=fnull)
base = None
- for line in tests.split('\n'):
+ for line in tests.decode().split('\n'):
i = line.find('#')
- if i >= 0: line = line[:i]
- if not line: continue
+ if i >= 0:
+ line = line[:i]
+ if not line:
+ continue
if line[0] != ' ':
base = line.strip()
else:
return 0
try:
n = int(arg_str)
- if n <= 0: raise ValueError
+ if n <= 0:
+ raise ValueError
return n
except:
msg = '\'{}\' is not a positive integer or \'inf\''.format(arg_str)
"""Auxiliary function to parse the "runs_per_test" flag."""
try:
n = int(arg_str)
- if n <= 0: raise ValueError
+ if n <= 0:
+ raise ValueError
return n
except:
msg = '\'{}\' is not a positive integer'.format(arg_str)
import sys
import tempfile
import time
+import uuid
from oauth2client.client import GoogleCredentials
'backends_restart',
'change_backend_service',
'gentle_failover',
+ 'load_report_based_failover',
'ping_pong',
'remove_instance_group',
'round_robin',
'path_matching',
'header_matching',
'circuit_breaking',
+ 'timeout',
]
argp = argparse.ArgumentParser(description='Run xDS interop tests on GCP')
-argp.add_argument('--project_id', help='GCP project id')
+# TODO(zdapeng): remove default value of project_id and project_num
+argp.add_argument('--project_id', default='grpc-testing', help='GCP project id')
+argp.add_argument('--project_num',
+ default='830293263384',
+ help='GCP project number')
argp.add_argument(
'--gcp_suffix',
default='',
_TEST_METADATA_KEY = 'xds_md'
_TEST_METADATA_VALUE_UNARY = 'unary_yranu'
_TEST_METADATA_VALUE_EMPTY = 'empty_ytpme'
+# Extra RPC metadata whose value is a number, sent with UnaryCall only.
+_TEST_METADATA_NUMERIC_KEY = 'xds_md_numeric'
+_TEST_METADATA_NUMERIC_VALUE = '159'
_PATH_MATCHER_NAME = 'path-matcher'
_BASE_TEMPLATE_NAME = 'test-template'
_BASE_INSTANCE_GROUP_NAME = 'test-ig'
return response
-def configure_client(rpc_types, metadata):
+def configure_client(rpc_types, metadata=[], timeout_sec=None):
if CLIENT_HOSTS:
hosts = CLIENT_HOSTS
else:
md.type = rpc_type
md.key = md_key
md.value = md_value
+ if timeout_sec:
+ request.timeout_sec = timeout_sec
logger.debug(
'Invoking XdsUpdateClientConfigureService RPC to %s:%d: %s',
host, args.stats_port, request)
_WAIT_FOR_BACKEND_SEC)
+def test_load_report_based_failover(gcp, backend_service,
+ primary_instance_group,
+ secondary_instance_group):
+ logger.info('Running test_load_report_based_failover')
+ try:
+ patch_backend_service(
+ gcp, backend_service,
+ [primary_instance_group, secondary_instance_group])
+ primary_instance_names = get_instance_names(gcp, primary_instance_group)
+ secondary_instance_names = get_instance_names(gcp,
+ secondary_instance_group)
+ wait_for_healthy_backends(gcp, backend_service, primary_instance_group)
+ wait_for_healthy_backends(gcp, backend_service,
+ secondary_instance_group)
+ wait_until_all_rpcs_go_to_given_backends(primary_instance_names,
+ _WAIT_FOR_STATS_SEC)
+ # Set primary locality's balance mode to RATE, and RPS to 20% of the
+ # client's QPS. The secondary locality will be used.
+ max_rate = int(args.qps * 1 / 5)
+ logger.info('Patching backend service to RATE with %d max_rate',
+ max_rate)
+ patch_backend_service(
+ gcp,
+ backend_service, [primary_instance_group, secondary_instance_group],
+ balancing_mode='RATE',
+ max_rate=max_rate)
+ wait_until_all_rpcs_go_to_given_backends(
+ primary_instance_names + secondary_instance_names,
+ _WAIT_FOR_BACKEND_SEC)
+
+ # Set primary locality's balance mode to RATE, and RPS to 120% of the
+ # client's QPS. Only the primary locality will be used.
+ max_rate = int(args.qps * 6 / 5)
+ logger.info('Patching backend service to RATE with %d max_rate',
+ max_rate)
+ patch_backend_service(
+ gcp,
+ backend_service, [primary_instance_group, secondary_instance_group],
+ balancing_mode='RATE',
+ max_rate=max_rate)
+ wait_until_all_rpcs_go_to_given_backends(primary_instance_names,
+ _WAIT_FOR_BACKEND_SEC)
+ logger.info("success")
+ finally:
+ patch_backend_service(gcp, backend_service, [primary_instance_group])
+ instance_names = get_instance_names(gcp, primary_instance_group)
+ wait_until_all_rpcs_go_to_given_backends(instance_names,
+ _WAIT_FOR_BACKEND_SEC)
+
+
def test_ping_pong(gcp, backend_service, instance_group):
logger.info('Running test_ping_pong')
wait_for_healthy_backends(gcp, backend_service, instance_group)
{
"UnaryCall": original_backend_instances,
"EmptyCall": alternate_backend_instances
- })
+ }),
+ (
+ [{
+ 'priority': 0,
+ # Regex UnaryCall -> alternate_backend_service.
+ 'matchRules': [{
+ 'regexMatch':
+ '^\/.*\/UnaryCall$' # Unary methods with any services.
+ }],
+ 'service': alternate_backend_service.url
+ }],
+ {
+ "UnaryCall": alternate_backend_instances,
+ "EmptyCall": original_backend_instances
+ }),
+ (
+ [{
+ 'priority': 0,
+ # ignoreCase EmptyCall -> alternate_backend_service.
+ 'matchRules': [{
+ # Case insensitive matching.
+ 'fullPathMatch': '/gRpC.tEsTinG.tEstseRvice/empTycaLl',
+ 'ignoreCase': True,
+ }],
+ 'service': alternate_backend_service.url
+ }],
+ {
+ "UnaryCall": original_backend_instances,
+ "EmptyCall": alternate_backend_instances
+ }),
]
for (route_rules, expected_instances) in test_cases:
original_backend_instances + alternate_backend_instances,
_WAIT_FOR_STATS_SEC)
- retry_count = 20
- # Each attempt takes about 10 seconds, 20 retries is equivalent to 200
+ retry_count = 80
+ # Each attempt takes about 5 seconds, 80 retries is equivalent to 400
# seconds timeout.
for i in range(retry_count):
stats = get_client_stats(_NUM_TEST_RPCS, _WAIT_FOR_STATS_SEC)
if compare_expected_instances(stats, expected_instances):
logger.info("success")
break
+ elif i == retry_count - 1:
+ raise Exception(
+ 'timeout waiting for RPCs to the expected instances: %s'
+ % expected_instances)
finally:
patch_url_map_backend_service(gcp, original_backend_service)
patch_backend_service(gcp, alternate_backend_service, [])
(
[{
'priority': 0,
+ # Header 'xds_md_numeric' present -> alternate_backend_service.
+ # UnaryCall is sent with the metadata, so will be sent to alternative.
+ 'matchRules': [{
+ 'prefixMatch':
+ '/',
+ 'headerMatches': [{
+ 'headerName': _TEST_METADATA_NUMERIC_KEY,
+ 'presentMatch': True
+ }]
+ }],
+ 'service': alternate_backend_service.url
+ }],
+ {
+ "EmptyCall": original_backend_instances,
+ "UnaryCall": alternate_backend_instances
+ }),
+ (
+ [{
+ 'priority': 0,
# Header invert ExactMatch -> alternate_backend_service.
- # EmptyCall is sent with the metadata, so will be sent to original.
+ # UnaryCall is sent with the metadata, so will be sent to
+ # original. EmptyCall will be sent to alternative.
'matchRules': [{
'prefixMatch':
'/',
'headerMatches': [{
'headerName': _TEST_METADATA_KEY,
- 'exactMatch': _TEST_METADATA_VALUE_EMPTY,
+ 'exactMatch': _TEST_METADATA_VALUE_UNARY,
'invertMatch': True
}]
}],
'service': alternate_backend_service.url
}],
{
+ "EmptyCall": alternate_backend_instances,
+ "UnaryCall": original_backend_instances
+ }),
+ (
+ [{
+ 'priority': 0,
+ # Header 'xds_md_numeric' range [100,200] -> alternate_backend_service.
+ # UnaryCall is sent with the metadata in range.
+ 'matchRules': [{
+ 'prefixMatch':
+ '/',
+ 'headerMatches': [{
+ 'headerName': _TEST_METADATA_NUMERIC_KEY,
+ 'rangeMatch': {
+ 'rangeStart': '100',
+ 'rangeEnd': '200'
+ }
+ }]
+ }],
+ 'service': alternate_backend_service.url
+ }],
+ {
"EmptyCall": original_backend_instances,
"UnaryCall": alternate_backend_instances
}),
+ (
+ [{
+ 'priority': 0,
+ # Header RegexMatch -> alternate_backend_service.
+ # EmptyCall is sent with the metadata.
+ 'matchRules': [{
+ 'prefixMatch':
+ '/',
+ 'headerMatches': [{
+ 'headerName':
+ _TEST_METADATA_KEY,
+ 'regexMatch':
+ "^%s.*%s$" % (_TEST_METADATA_VALUE_EMPTY[:2],
+ _TEST_METADATA_VALUE_EMPTY[-2:])
+ }]
+ }],
+ 'service': alternate_backend_service.url
+ }],
+ {
+ "EmptyCall": alternate_backend_instances,
+ "UnaryCall": original_backend_instances
+ }),
]
for (route_rules, expected_instances) in test_cases:
original_backend_instances + alternate_backend_instances,
_WAIT_FOR_STATS_SEC)
- retry_count = 20
- # Each attempt takes about 10 seconds, 10 retries is equivalent to 100
+ retry_count = 80
+ # Each attempt takes about 5 seconds, 80 retries is equivalent to 400
# seconds timeout.
for i in range(retry_count):
stats = get_client_stats(_NUM_TEST_RPCS, _WAIT_FOR_STATS_SEC)
if compare_expected_instances(stats, expected_instances):
logger.info("success")
break
+ elif i == retry_count - 1:
+ raise Exception(
+ 'timeout waiting for RPCs to the expected instances: %s'
+ % expected_instances)
finally:
patch_url_map_backend_service(gcp, original_backend_service)
patch_backend_service(gcp, alternate_backend_service, [])
configure_client([
messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL,
messages_pb2.ClientConfigureRequest.RpcType.EMPTY_CALL
- ], [])
+ ])
logger.info('Patching url map with %s', route_rules)
patch_url_map_backend_service(gcp,
extra_backend_service,
# Avoid new RPCs being outstanding (some test clients create threads
# for sending RPCs) after restoring backend services.
configure_client(
- [messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL], [])
+ [messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL])
finally:
patch_url_map_backend_service(gcp, original_backend_service)
patch_backend_service(gcp, original_backend_service, [instance_group])
set_validate_for_proxyless(gcp, True)
+def test_timeout(gcp, original_backend_service, instance_group):
+ logger.info('Running test_timeout')
+
+ logger.info('waiting for original backends to become healthy')
+ wait_for_healthy_backends(gcp, original_backend_service, instance_group)
+
+ # UnaryCall -> maxStreamDuration:3s
+ route_rules = [{
+ 'priority': 0,
+ 'matchRules': [{
+ 'fullPathMatch': '/grpc.testing.TestService/UnaryCall'
+ }],
+ 'service': original_backend_service.url,
+ 'routeAction': {
+ 'maxStreamDuration': {
+ 'seconds': 3,
+ },
+ },
+ }]
+ patch_url_map_backend_service(gcp,
+ original_backend_service,
+ route_rules=route_rules)
+ # A list of tuples (testcase_name, {client_config}, {expected_results})
+ test_cases = [
+ (
+ 'app_timeout_exceeded',
+ # UnaryCall only with sleep-2; timeout=1s; calls timeout.
+ {
+ 'rpc_types': [
+ messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL,
+ ],
+ 'metadata': [
+ (messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL,
+ 'rpc-behavior', 'sleep-2'),
+ ],
+ 'timeout_sec': 1,
+ },
+ {
+ 'UNARY_CALL': 4, # DEADLINE_EXCEEDED
+ },
+ ),
+ (
+ 'timeout_not_exceeded',
+ # UnaryCall only with no sleep; calls succeed.
+ {
+ 'rpc_types': [
+ messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL,
+ ],
+ },
+ {
+ 'UNARY_CALL': 0,
+ },
+ ),
+ (
+ 'timeout_exceeded (UNARY_CALL), timeout_different_route (EMPTY_CALL)',
+ # UnaryCall and EmptyCall both sleep-4.
+ # UnaryCall timeouts, EmptyCall succeeds.
+ {
+ 'rpc_types': [
+ messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL,
+ messages_pb2.ClientConfigureRequest.RpcType.EMPTY_CALL,
+ ],
+ 'metadata': [
+ (messages_pb2.ClientConfigureRequest.RpcType.UNARY_CALL,
+ 'rpc-behavior', 'sleep-4'),
+ (messages_pb2.ClientConfigureRequest.RpcType.EMPTY_CALL,
+ 'rpc-behavior', 'sleep-4'),
+ ],
+ },
+ {
+ 'UNARY_CALL': 4, # DEADLINE_EXCEEDED
+ 'EMPTY_CALL': 0,
+ },
+ ),
+ ]
+
+ try:
+ for (testcase_name, client_config, expected_results) in test_cases:
+ logger.info('starting case %s', testcase_name)
+ configure_client(**client_config)
+ # wait a second to help ensure the client stops sending RPCs with
+ # the old config. We will make multiple attempts if it is failing,
+ # but this improves confidence that the test is valid if the
+ # previous client_config would lead to the same results.
+ time.sleep(1)
+ # Each attempt takes 10 seconds; 20 attempts is equivalent to 200
+ # second timeout.
+ attempt_count = 20
+ before_stats = get_client_accumulated_stats()
+ if not before_stats.stats_per_method:
+ raise ValueError(
+ 'stats.stats_per_method is None, the interop client stats service does not support this test case'
+ )
+ for i in range(attempt_count):
+ logger.info('%s: attempt %d', testcase_name, i)
+
+ test_runtime_secs = 10
+ time.sleep(test_runtime_secs)
+ after_stats = get_client_accumulated_stats()
+
+ success = True
+ for rpc, status in expected_results.items():
+ qty = (after_stats.stats_per_method[rpc].result[status] -
+ before_stats.stats_per_method[rpc].result[status])
+ want = test_runtime_secs * args.qps
+ # Allow 10% deviation from expectation to reduce flakiness
+ if qty < (want * .9) or qty > (want * 1.1):
+ logger.info('%s: failed due to %s[%s]: got %d want ~%d',
+ testcase_name, rpc, status, qty, want)
+ success = False
+ if success:
+ break
+ logger.info('%s attempt %d failed', testcase_name, i)
+ before_stats = after_stats
+ else:
+ raise Exception(
+ '%s: timeout waiting for expected results: %s; got %s' %
+ (testcase_name, expected_results,
+ after_stats.stats_per_method))
+ finally:
+ patch_url_map_backend_service(gcp, original_backend_service)
+
+
def set_validate_for_proxyless(gcp, validate_for_proxyless):
if not gcp.alpha_compute:
logger.debug(
backend_service,
instance_groups,
balancing_mode='UTILIZATION',
+ max_rate=1,
circuit_breakers=None):
if gcp.alpha_compute:
compute_to_use = gcp.alpha_compute
'backends': [{
'group': instance_group.url,
'balancingMode': balancing_mode,
- 'maxRate': 1 if balancing_mode == 'RATE' else None
+ 'maxRate': max_rate if balancing_mode == 'RATE' else None
} for instance_group in instance_groups],
'circuitBreakers': circuit_breakers,
}
class GcpState(object):
- def __init__(self, compute, alpha_compute, project):
+ def __init__(self, compute, alpha_compute, project, project_num):
self.compute = compute
self.alpha_compute = alpha_compute
self.project = project
+ self.project_num = project_num
self.health_check = None
self.health_check_firewall_rule = None
self.backend_services = []
alpha_compute = googleapiclient.discovery.build('compute', 'alpha')
try:
- gcp = GcpState(compute, alpha_compute, args.project_id)
+ gcp = GcpState(compute, alpha_compute, args.project_id, args.project_num)
gcp_suffix = args.gcp_suffix
health_check_name = _BASE_HEALTH_CHECK_NAME + gcp_suffix
if not args.use_existing_gcp_resources:
with tempfile.NamedTemporaryFile(delete=False) as bootstrap_file:
bootstrap_file.write(
_BOOTSTRAP_TEMPLATE.format(
- node_id=socket.gethostname(),
+ node_id='projects/%s/networks/%s/nodes/%s' %
+ (gcp.project_num, args.network.split('/')[-1],
+ uuid.uuid1()),
server_features=json.dumps(
bootstrap_server_features)).encode('utf-8'))
bootstrap_path = bootstrap_file.name
client_env['GRPC_XDS_BOOTSTRAP'] = bootstrap_path
client_env['GRPC_XDS_EXPERIMENTAL_CIRCUIT_BREAKING'] = 'true'
+ client_env['GRPC_XDS_EXPERIMENTAL_ENABLE_TIMEOUT'] = 'true'
test_results = {}
failed_tests = []
for test_case in args.test_case:
rpcs_to_send = '--rpc="UnaryCall"'
if test_case in _TESTS_TO_SEND_METADATA:
- metadata_to_send = '--metadata="EmptyCall:{keyE}:{valueE},UnaryCall:{keyU}:{valueU}"'.format(
+ metadata_to_send = '--metadata="EmptyCall:{keyE}:{valueE},UnaryCall:{keyU}:{valueU},UnaryCall:{keyNU}:{valueNU}"'.format(
keyE=_TEST_METADATA_KEY,
valueE=_TEST_METADATA_VALUE_EMPTY,
keyU=_TEST_METADATA_KEY,
- valueU=_TEST_METADATA_VALUE_UNARY)
+ valueU=_TEST_METADATA_VALUE_UNARY,
+ keyNU=_TEST_METADATA_NUMERIC_KEY,
+ valueNU=_TEST_METADATA_NUMERIC_VALUE)
else:
# Setting the arg explicitly to empty with '--metadata=""'
# makes C# client fail
elif test_case == 'gentle_failover':
test_gentle_failover(gcp, backend_service, instance_group,
secondary_zone_instance_group)
+ elif test_case == 'load_report_based_failover':
+ test_load_report_based_failover(
+ gcp, backend_service, instance_group,
+ secondary_zone_instance_group)
elif test_case == 'ping_pong':
test_ping_pong(gcp, backend_service, instance_group)
elif test_case == 'remove_instance_group':
elif test_case == 'circuit_breaking':
test_circuit_breaking(gcp, backend_service, instance_group,
same_zone_instance_group)
+ elif test_case == 'timeout':
+ test_timeout(gcp, backend_service, instance_group)
else:
logger.error('Unknown test case: %s', test_case)
sys.exit(1)
for root, dirs, files in os.walk(directory_root):
for filename in files:
path = os.path.join(root, filename)
- if os.path.splitext(path)[1] not in ['.c', '.cc', '.h']: continue
+ if os.path.splitext(path)[1] not in ['.c', '.cc', '.h']:
+ continue
if path in [
os.path.join('include', 'grpc', 'support',
'port_platform.h'),
git submodule | awk '{ print $1 }' | sort > "$submodules"
cat << EOF | awk '{ print $1 }' | sort > "$want_submodules"
- 0f3bb466b868b523cf1dc9b2aaaed65c77b28862 third_party/abseil-cpp (heads/master)
+ 6f9d96a1f41439ac172ee2ef7ccd8edf0e5d068c third_party/abseil-cpp (heads/master)
090faecb454fbd6e6e17a75ef8146acb037118d4 third_party/benchmark (v1.5.0)
73594cde8c9a52a102c4341c244c833aa61b9c06 third_party/bloaty (remotes/origin/wide-14-g73594cd)
- 29c6e0e27268f5a43e039cd2ed4e849d6b736fc1 third_party/boringssl-with-bazel (remotes/origin/master-with-bazel)
+ 067cfd92f4d7da0edfa073b096d090b98a83b860 third_party/boringssl-with-bazel (remotes/origin/master-with-bazel)
e982924acee7f7313b4baa4ee5ec000c5e373c30 third_party/cares/cares (cares-1_15_0)
- 9997e1137cdb59e622af13e57ca915a2f3c9f84f third_party/envoy-api (heads/master)
- 80ed4d0bbf65d57cc267dfc63bd2584557f11f9b third_party/googleapis (common-protos-1_3_1-915-g80ed4d0bb)
+ 9edfeb841b0f8e54816f0b81949f79104072072c third_party/envoy-api (remotes/origin/main)
+ 82944da21578a53b74e547774cf62ed31a05b841 third_party/googleapis (common-protos-1_3_1-915-g80ed4d0bb)
c9ccac7cb7345901884aabf5d1a786cfa6e2f397 third_party/googletest (6e2f397)
15ae750151ac9341e5945eb38f8982d59fb99201 third_party/libuv (v1.34.0)
19fb89416f3fdc2d6668f3738f444885575285bc third_party/protobuf (v3.7.0-rc.2-1277-gfde7cf735)
- e020f3aef8ae6cb59f384bfbaaed72e71e88ccd6 third_party/protoc-gen-validate (v0.4.1)
+ 872b28c457822ed9c2a5405da3c33f386ac0e86f third_party/protoc-gen-validate (v0.4.1)
aecba11114cf1fac5497aeb844b6966106de3eb6 third_party/re2 (heads/master)
- 1f710aca26a95876e64973a6d2a927a9f4b20ca4 third_party/udpa (heads/master)
+ cc1b757b3eddccaaaf0743cbb107742bb7e3ee4f third_party/udpa (heads/master)
cacf7f1d4e3d44d871b605da3b647f07d718623f third_party/zlib (v1.2.11)
EOF
for root, dirs, files in os.walk('src/core'):
for filename in files:
path = os.path.join(root, filename)
- if os.path.splitext(path)[1] != '.c': continue
+ if os.path.splitext(path)[1] != '.c':
+ continue
with open(path) as f:
text = f.read()
for o in pattern.findall(text):
errors = 0
num_files = 0
for root, dirs, files in os.walk('src/core'):
- if root.startswith('src/core/tsi'): continue
+ if root.startswith('src/core/tsi'):
+ continue
for filename in files:
num_files += 1
path = os.path.join(root, filename)
- if os.path.splitext(path)[1] != '.cc': continue
+ if os.path.splitext(path)[1] != '.cc':
+ continue
with open(path) as f:
text = f.read()
for banned, exceptions in BANNED_EXCEPT.items():
- if path in exceptions: continue
+ if path in exceptions:
+ continue
if banned in text:
print('Illegal use of "%s" in %s' % (banned, path))
errors += 1
```sh
# Help
python -m tests.baseline_test --help
-python -m tests.baseline_test --helpfull
+python -m tests.baseline_test --helpful
# Run on grpc-testing cluster
python -m tests.baseline_test \
```sh
# Help
python -m tests.security_test --help
-python -m tests.security_test --helpfull
+python -m tests.security_test --helpful
# Run on grpc-testing cluster
python -m tests.security_test \
python -m bin.run_channelz --flagfile=config/local-dev.cfg --security=mtls_error
# More information and usage options
- python -m bin.run_channelz --helpfull
+ python -m bin.run_channelz --helpful
"""
import hashlib
import logging
python -m bin.run_td_setup --flagfile=config/local-dev.cfg --security=mtls
# More information and usage options
- python -m bin.run_td_setup --helpfull
+ python -m bin.run_td_setup --helpful
"""
import logging
import uuid
deployment_name=xds_flags.CLIENT_NAME.value,
image_name=xds_k8s_flags.CLIENT_IMAGE.value,
gcp_service_account=xds_k8s_flags.GCP_SERVICE_ACCOUNT.value,
- network=xds_flags.NETWORK.value,
td_bootstrap_image=xds_k8s_flags.TD_BOOTSTRAP_IMAGE.value,
+ xds_server_uri=xds_flags.XDS_SERVER_URI.value,
+ network=xds_flags.NETWORK.value,
stats_port=xds_flags.CLIENT_PORT.value,
reuse_namespace=_REUSE_NAMESPACE.value)
if _SECURE.value:
runner_kwargs.update(
td_bootstrap_image=xds_k8s_flags.TD_BOOTSTRAP_IMAGE.value,
+ xds_server_uri=xds_flags.XDS_SERVER_URI.value,
deployment_template='server-secure.deployment.yaml')
k8s_api_manager = k8s.KubernetesApiManager(xds_k8s_flags.KUBE_CONTEXT.value)
> - https://tenacity.readthedocs.io/en/latest/index.html
"""
import datetime
+import logging
from typing import Any, List, Optional
import tenacity
+retryers_logger = logging.getLogger(__name__)
# Type aliases
timedelta = datetime.timedelta
Retrying = tenacity.Retrying
+_after_log = tenacity.after_log
+_before_sleep_log = tenacity.before_sleep_log
_retry_if_exception_type = tenacity.retry_if_exception_type
_stop_after_delay = tenacity.stop_after_delay
_wait_exponential = tenacity.wait_exponential
wait_min: timedelta,
wait_max: timedelta,
timeout: timedelta,
- retry_on_exceptions: Optional[List[Any]] = None) -> Retrying:
+ retry_on_exceptions: Optional[List[Any]] = None,
+ logger: Optional[logging.Logger] = None,
+ log_level: Optional[int] = logging.DEBUG) -> Retrying:
+ if logger is None:
+ logger = retryers_logger
+ if log_level is None:
+ log_level = logging.DEBUG
return Retrying(retry=_retry_on_exceptions(retry_on_exceptions),
wait=_wait_exponential(min=wait_min.total_seconds(),
max=wait_max.total_seconds()),
stop=_stop_after_delay(timeout.total_seconds()),
- reraise=True)
+ before_sleep=_before_sleep_log(logger, log_level))
import contextlib
import functools
import logging
-from typing import Optional
+from typing import Optional, List
# Workaround: `grpc` must be imported before `google.protobuf.json_format`,
# to prevent "Segmentation fault". Ref https://github.com/grpc/grpc/issues/24897
def networksecurity(self, version):
api_name = 'networksecurity'
if version == 'v1alpha1':
- return self._build_from_discovery_v2(api_name,
- version,
- api_key=self.private_api_key)
+ return self._build_from_discovery_v2(
+ api_name,
+ version,
+ api_key=self.private_api_key,
+ visibility_labels=['NETWORKSECURITY_ALPHA'])
raise NotImplementedError(f'Network Security {version} not supported')
def networkservices(self, version):
api_name = 'networkservices'
if version == 'v1alpha1':
- return self._build_from_discovery_v2(api_name,
- version,
- api_key=self.private_api_key)
+ return self._build_from_discovery_v2(
+ api_name,
+ version,
+ api_key=self.private_api_key,
+ visibility_labels=['NETWORKSERVICES_ALPHA'])
raise NotImplementedError(f'Network Services {version} not supported')
self._exit_stack.enter_context(api)
return api
- def _build_from_discovery_v2(self, api_name, version, *, api_key=None):
- key_arg = f'&key={api_key}' if api_key else ''
+ def _build_from_discovery_v2(self,
+ api_name,
+ version,
+ *,
+ api_key: Optional[str] = None,
+ visibility_labels: Optional[List] = None):
+ params = {}
+ if api_key:
+ params['key'] = api_key
+ if visibility_labels:
+ # Dash-separated list of labels.
+ params['labels'] = '_'.join(visibility_labels)
+
+ params_str = ''
+ if params:
+ params_str = '&' + ('&'.join(f'{k}={v}' for k, v in params.items()))
+
api = discovery.build(
api_name,
version,
cache_discovery=False,
- discoveryServiceUrl=f'{self.v2_discovery_uri}{key_arg}')
+ discoveryServiceUrl=f'{self.v2_discovery_uri}{params_str}')
self._exit_stack.enter_context(api)
return api
HTTP2 = enum.auto()
GRPC = enum.auto()
- def create_health_check_tcp(self, name,
+ def create_health_check_tcp(self,
+ name,
use_serving_port=False) -> GcpResource:
health_check_settings = {}
if use_serving_port:
name)
def create_url_map(
- self,
- name: str,
- matcher_name: str,
- src_hosts,
- dst_default_backend_service: GcpResource,
- dst_host_rule_match_backend_service: Optional[GcpResource] = None,
+ self,
+ name: str,
+ matcher_name: str,
+ src_hosts,
+ dst_default_backend_service: GcpResource,
+ dst_host_rule_match_backend_service: Optional[GcpResource] = None,
) -> GcpResource:
if dst_host_rule_match_backend_service is None:
dst_host_rule_match_backend_service = dst_default_backend_service
self._delete_resource(self.api.urlMaps(), 'urlMap', name)
def create_target_grpc_proxy(
- self,
- name: str,
- url_map: GcpResource,
+ self,
+ name: str,
+ url_map: GcpResource,
) -> GcpResource:
return self._insert_resource(self.api.targetGrpcProxies(), {
'name': name,
name)
def create_target_http_proxy(
- self,
- name: str,
- url_map: GcpResource,
+ self,
+ name: str,
+ url_map: GcpResource,
) -> GcpResource:
return self._insert_resource(self.api.targetHttpProxies(), {
'name': name,
name)
def create_forwarding_rule(
- self,
- name: str,
- src_port: int,
- target_proxy: GcpResource,
- network_url: str,
+ self,
+ name: str,
+ src_port: int,
+ target_proxy: GcpResource,
+ network_url: str,
) -> GcpResource:
return self._insert_resource(
self.api.globalForwardingRules(),
return neg
def wait_for_backends_healthy_status(
- self,
- backend_service,
- backends,
- timeout_sec=_WAIT_FOR_BACKEND_SEC,
- wait_sec=4,
+ self,
+ backend_service,
+ backends,
+ timeout_sec=_WAIT_FOR_BACKEND_SEC,
+ wait_sec=4,
):
pending = set(backends)
NEG_STATUS_META = 'cloud.google.com/neg-status'
PORT_FORWARD_LOCAL_ADDRESS: str = '127.0.0.1'
DELETE_GRACE_PERIOD_SEC: int = 5
+ WAIT_SHORT_TIMEOUT_SEC: int = 60
+ WAIT_SHORT_SLEEP_SEC: int = 1
+ WAIT_MEDIUM_TIMEOUT_SEC: int = 5 * 60
+ WAIT_MEDIUM_SLEEP_SEC: int = 10
+ WAIT_LONG_TIMEOUT_SEC: int = 10 * 60
+ WAIT_LONG_SLEEP_SEC: int = 30
def __init__(self, api: KubernetesApiManager, name: str):
self.name = name
def get_service_account(self, name) -> V1Service:
return self.api.core.read_namespaced_service_account(name, self.name)
- def delete_service(self, name,
+ def delete_service(self,
+ name,
grace_period_seconds=DELETE_GRACE_PERIOD_SEC):
self.api.core.delete_namespaced_service(
name=name,
propagation_policy='Foreground',
grace_period_seconds=grace_period_seconds))
- def wait_for_service_deleted(self, name: str, timeout_sec=60, wait_sec=1):
+ def wait_for_service_deleted(self,
+ name: str,
+ timeout_sec=WAIT_SHORT_TIMEOUT_SEC,
+ wait_sec=WAIT_SHORT_SLEEP_SEC):
@retrying.retry(retry_on_result=lambda r: r is not None,
stop_max_delay=timeout_sec * 1000,
def wait_for_service_account_deleted(self,
name: str,
- timeout_sec=60,
- wait_sec=1):
+ timeout_sec=WAIT_SHORT_TIMEOUT_SEC,
+ wait_sec=WAIT_SHORT_SLEEP_SEC):
@retrying.retry(retry_on_result=lambda r: r is not None,
stop_max_delay=timeout_sec * 1000,
_wait_for_deleted_service_account_with_retry()
- def wait_for_namespace_deleted(self, timeout_sec=240, wait_sec=5):
+ def wait_for_namespace_deleted(self,
+ timeout_sec=WAIT_LONG_TIMEOUT_SEC,
+ wait_sec=WAIT_LONG_SLEEP_SEC):
@retrying.retry(retry_on_result=lambda r: r is not None,
stop_max_delay=timeout_sec * 1000,
_wait_for_deleted_namespace_with_retry()
- def wait_for_service_neg(self, name: str, timeout_sec=60, wait_sec=1):
+ def wait_for_service_neg(self,
+ name: str,
+ timeout_sec=WAIT_SHORT_TIMEOUT_SEC,
+ wait_sec=WAIT_SHORT_SLEEP_SEC):
@retrying.retry(retry_on_result=lambda r: not r,
stop_max_delay=timeout_sec * 1000,
# V1LabelSelector.match_expressions not supported at the moment
return self.list_pods_with_labels(deployment.spec.selector.match_labels)
- def wait_for_deployment_available_replicas(self,
- name,
- count=1,
- timeout_sec=60,
- wait_sec=3):
+ def wait_for_deployment_available_replicas(
+ self,
+ name,
+ count=1,
+ timeout_sec=WAIT_MEDIUM_TIMEOUT_SEC,
+ wait_sec=WAIT_MEDIUM_SLEEP_SEC):
@retrying.retry(
retry_on_result=lambda r: not self._replicas_available(r, count),
def wait_for_deployment_deleted(self,
deployment_name: str,
- timeout_sec=60,
- wait_sec=1):
+ timeout_sec=WAIT_MEDIUM_TIMEOUT_SEC,
+ wait_sec=WAIT_MEDIUM_SLEEP_SEC):
@retrying.retry(retry_on_result=lambda r: r is not None,
stop_max_delay=timeout_sec * 1000,
def get_pod(self, name) -> client.V1Pod:
return self.api.core.read_namespaced_pod(name, self.name)
- def wait_for_pod_started(self, pod_name, timeout_sec=60, wait_sec=1):
+ def wait_for_pod_started(self,
+ pod_name,
+ timeout_sec=WAIT_SHORT_TIMEOUT_SEC,
+ wait_sec=WAIT_SHORT_SLEEP_SEC):
@retrying.retry(retry_on_result=lambda r: not self._pod_started(r),
stop_max_delay=timeout_sec * 1000,
_wait_for_pod_started()
def port_forward_pod(
- self,
- pod: V1Pod,
- remote_port: int,
- local_port: Optional[int] = None,
- local_address: Optional[str] = None,
+ self,
+ pod: V1Pod,
+ remote_port: int,
+ local_port: Optional[int] = None,
+ local_address: Optional[str] = None,
) -> subprocess.Popen:
"""Experimental"""
local_address = local_address or self.PORT_FORWARD_LOCAL_ADDRESS
FORWARDING_RULE_NAME = "forwarding-rule"
def __init__(
- self,
- gcp_api_manager: gcp.api.GcpApiManager,
- project: str,
- *,
- resource_prefix: str,
- network: str = 'default',
+ self,
+ gcp_api_manager: gcp.api.GcpApiManager,
+ project: str,
+ *,
+ resource_prefix: str,
+ network: str = 'default',
):
# API
self.compute = _ComputeV1(gcp_api_manager, project)
self.setup_backend_for_grpc(protocol=backend_protocol)
self.setup_routing_rule_map_for_grpc(service_host, service_port)
- def setup_backend_for_grpc(
- self, *, protocol: Optional[BackendServiceProtocol] = _BackendGRPC):
+ def setup_backend_for_grpc(self,
+ *,
+ protocol: Optional[
+ BackendServiceProtocol] = _BackendGRPC):
self.create_health_check()
self.create_backend_service(protocol)
self.backends)
def create_url_map(
- self,
- src_host: str,
- src_port: int,
+ self,
+ src_host: str,
+ src_port: int,
) -> GcpResource:
src_address = f'{src_host}:{src_port}'
name = self._ns_name(self.URL_MAP_NAME)
CERTIFICATE_PROVIDER_INSTANCE = "google_cloud_private_spiffe"
def __init__(
- self,
- gcp_api_manager: gcp.api.GcpApiManager,
- project: str,
- *,
- resource_prefix: str,
- network: str = 'default',
+ self,
+ gcp_api_manager: gcp.api.GcpApiManager,
+ project: str,
+ *,
+ resource_prefix: str,
+ network: str = 'default',
):
super().__init__(gcp_api_manager,
project,
"metadataLabels": endpoint_matcher_labels
}
config = {
- "type": "SIDECAR_PROXY",
+ "type": "GRPC_SERVER",
"httpFilters": {},
"trafficPortSelector": port_selector,
"endpointMatcher": {
self.client_tls_policy = None
def backend_service_apply_client_mtls_policy(
- self,
- server_namespace,
- server_name,
+ self,
+ server_namespace,
+ server_name,
):
if not self.client_tls_policy:
logger.warning(
class GrpcClientHelper:
channel: grpc.Channel
- DEFAULT_CONNECTION_TIMEOUT_SEC = 60
- DEFAULT_WAIT_FOR_READY_SEC = 60
+ DEFAULT_RPC_DEADLINE_SEC = 90
def __init__(self, channel: grpc.Channel, stub_class: ClassVar):
self.channel = channel
*,
rpc: str,
req: Message,
- wait_for_ready_sec: Optional[int] = DEFAULT_WAIT_FOR_READY_SEC,
- connection_timeout_sec: Optional[
- int] = DEFAULT_CONNECTION_TIMEOUT_SEC,
+ deadline_sec: Optional[int] = DEFAULT_RPC_DEADLINE_SEC,
log_level: Optional[int] = logging.DEBUG) -> Message:
- if wait_for_ready_sec is None:
- wait_for_ready_sec = self.DEFAULT_WAIT_FOR_READY_SEC
- if connection_timeout_sec is None:
- connection_timeout_sec = self.DEFAULT_CONNECTION_TIMEOUT_SEC
+ if deadline_sec is None:
+ deadline_sec = self.DEFAULT_RPC_DEADLINE_SEC
- timeout_sec = wait_for_ready_sec + connection_timeout_sec
- rpc_callable: grpc.UnaryUnaryMultiCallable = getattr(self.stub, rpc)
-
- call_kwargs = dict(wait_for_ready=True, timeout=timeout_sec)
+ call_kwargs = dict(wait_for_ready=True, timeout=deadline_sec)
self._log_rpc_request(rpc, req, call_kwargs, log_level)
+
+ # Call RPC, e.g. RpcStub(channel).RpcMethod(req, ...options)
+ rpc_callable: grpc.UnaryUnaryMultiCallable = getattr(self.stub, rpc)
return rpc_callable(req, **call_kwargs)
def _log_rpc_request(self, rpc, req, call_kwargs, log_level=logging.DEBUG):
return server_socket
return None
- def find_channels_for_target(self, target: str) -> Iterator[Channel]:
- return (channel for channel in self.list_channels()
+ def find_channels_for_target(self, target: str,
+ **kwargs) -> Iterator[Channel]:
+ return (channel for channel in self.list_channels(**kwargs)
if channel.data.target == target)
- def find_server_listening_on_port(self, port: int) -> Optional[Server]:
- for server in self.list_servers():
+ def find_server_listening_on_port(self, port: int,
+ **kwargs) -> Optional[Server]:
+ for server in self.list_servers(**kwargs):
listen_socket_ref: SocketRef
for listen_socket_ref in server.listen_socket:
- listen_socket = self.get_socket(listen_socket_ref.socket_id)
+ listen_socket = self.get_socket(listen_socket_ref.socket_id,
+ **kwargs)
listen_address: Address = listen_socket.local
if (self.is_sock_tcpip_address(listen_address) and
listen_address.tcpip_address.port == port):
return server
return None
- def list_channels(self) -> Iterator[Channel]:
+ def list_channels(self, **kwargs) -> Iterator[Channel]:
"""
Iterate over all pages of all root channels.
start += 1
response = self.call_unary_with_deadline(
rpc='GetTopChannels',
- req=_GetTopChannelsRequest(start_channel_id=start))
+ req=_GetTopChannelsRequest(start_channel_id=start),
+ **kwargs)
for channel in response.channel:
start = max(start, channel.ref.channel_id)
yield channel
- def list_servers(self) -> Iterator[Server]:
+ def list_servers(self, **kwargs) -> Iterator[Server]:
"""Iterate over all pages of all servers that exist in the process."""
start: int = -1
response: Optional[_GetServersResponse] = None
# value by adding 1 to the highest seen result ID.
start += 1
response = self.call_unary_with_deadline(
- rpc='GetServers', req=_GetServersRequest(start_server_id=start))
+ rpc='GetServers',
+ req=_GetServersRequest(start_server_id=start),
+ **kwargs)
for server in response.server:
start = max(start, server.ref.server_id)
yield server
- def list_server_sockets(self, server: Server) -> Iterator[Socket]:
+ def list_server_sockets(self, server: Server, **kwargs) -> Iterator[Socket]:
"""List all server sockets that exist in server process.
Iterating over the results will resolve additional pages automatically.
response = self.call_unary_with_deadline(
rpc='GetServerSockets',
req=_GetServerSocketsRequest(server_id=server.ref.server_id,
- start_socket_id=start))
+ start_socket_id=start),
+ **kwargs)
socket_ref: SocketRef
for socket_ref in response.socket_ref:
start = max(start, socket_ref.socket_id)
# Yield actual socket
- yield self.get_socket(socket_ref.socket_id)
+ yield self.get_socket(socket_ref.socket_id, **kwargs)
- def list_channel_sockets(self, channel: Channel) -> Iterator[Socket]:
+ def list_channel_sockets(self, channel: Channel,
+ **kwargs) -> Iterator[Socket]:
"""List all sockets of all subchannels of a given channel."""
- for subchannel in self.list_channel_subchannels(channel):
- yield from self.list_subchannels_sockets(subchannel)
+ for subchannel in self.list_channel_subchannels(channel, **kwargs):
+ yield from self.list_subchannels_sockets(subchannel, **kwargs)
- def list_channel_subchannels(self,
- channel: Channel) -> Iterator[Subchannel]:
+ def list_channel_subchannels(self, channel: Channel,
+ **kwargs) -> Iterator[Subchannel]:
"""List all subchannels of a given channel."""
for subchannel_ref in channel.subchannel_ref:
- yield self.get_subchannel(subchannel_ref.subchannel_id)
+ yield self.get_subchannel(subchannel_ref.subchannel_id, **kwargs)
- def list_subchannels_sockets(self,
- subchannel: Subchannel) -> Iterator[Socket]:
+ def list_subchannels_sockets(self, subchannel: Subchannel,
+ **kwargs) -> Iterator[Socket]:
"""List all sockets of a given subchannel."""
for socket_ref in subchannel.socket_ref:
- yield self.get_socket(socket_ref.socket_id)
+ yield self.get_socket(socket_ref.socket_id, **kwargs)
- def get_subchannel(self, subchannel_id) -> Subchannel:
+ def get_subchannel(self, subchannel_id, **kwargs) -> Subchannel:
"""Return a single Subchannel, otherwise raises RpcError."""
response: _GetSubchannelResponse = self.call_unary_with_deadline(
rpc='GetSubchannel',
- req=_GetSubchannelRequest(subchannel_id=subchannel_id))
+ req=_GetSubchannelRequest(subchannel_id=subchannel_id),
+ **kwargs)
return response.subchannel
- def get_socket(self, socket_id) -> Socket:
+ def get_socket(self, socket_id, **kwargs) -> Socket:
"""Return a single Socket, otherwise raises RpcError."""
response: _GetSocketResponse = self.call_unary_with_deadline(
- rpc='GetSocket', req=_GetSocketRequest(socket_id=socket_id))
+ rpc='GetSocket',
+ req=_GetSocketRequest(socket_id=socket_id),
+ **kwargs)
return response.socket
super().__init__(channel, test_pb2_grpc.LoadBalancerStatsServiceStub)
def get_client_stats(
- self,
- *,
- num_rpcs: int,
- timeout_sec: Optional[int] = STATS_PARTIAL_RESULTS_TIMEOUT_SEC,
+ self,
+ *,
+ num_rpcs: int,
+ timeout_sec: Optional[int] = STATS_PARTIAL_RESULTS_TIMEOUT_SEC,
) -> LoadBalancerStatsResponse:
if timeout_sec is None:
timeout_sec = self.STATS_PARTIAL_RESULTS_TIMEOUT_SEC
req=_LoadBalancerStatsRequest(
num_rpcs=num_rpcs,
timeout_sec=timeout_sec),
- wait_for_ready_sec=timeout_sec,
+ deadline_sec=timeout_sec,
log_level=logging.INFO)
return _ChannelzServiceClient(self._make_channel(self.maintenance_port))
def get_load_balancer_stats(
- self,
- *,
- num_rpcs: int,
- timeout_sec: Optional[int] = None,
+ self,
+ *,
+ num_rpcs: int,
+ timeout_sec: Optional[int] = None,
) -> grpc_testing.LoadBalancerStatsResponse:
"""
Shortcut to LoadBalancerStatsServiceClient.get_client_stats()
return self.load_balancer_stats.get_client_stats(
num_rpcs=num_rpcs, timeout_sec=timeout_sec)
- def get_server_channels(self) -> Iterator[_ChannelzChannel]:
- return self.channelz.find_channels_for_target(self.server_target)
-
def wait_for_active_server_channel(self) -> _ChannelzChannel:
"""Wait for the channel to the server to transition to READY.
"""
return self.wait_for_server_channel_state(_ChannelzChannelState.READY)
- def get_active_server_channel(self) -> _ChannelzChannel:
- """Return a READY channel to the server.
-
- Raises:
- GrpcApp.NotFound: If there's no READY channel to the server.
- """
- return self.find_server_channel_with_state(_ChannelzChannelState.READY)
-
def get_active_server_channel_socket(self) -> _ChannelzSocket:
- channel = self.get_active_server_channel()
+ channel = self.find_server_channel_with_state(
+ _ChannelzChannelState.READY)
# Get the first subchannel of the active channel to the server.
logger.debug(
'Retrieving client -> server socket, '
logger.debug('Found client -> server socket: %s', socket.ref.name)
return socket
- def wait_for_server_channel_state(self,
- state: _ChannelzChannelState,
- *,
- timeout: Optional[_timedelta] = None
- ) -> _ChannelzChannel:
+ def wait_for_server_channel_state(
+ self,
+ state: _ChannelzChannelState,
+ *,
+ timeout: Optional[_timedelta] = None,
+ rpc_deadline: Optional[_timedelta] = None) -> _ChannelzChannel:
+ # When polling for a state, prefer smaller wait times to avoid
+ # exhausting all allowed time on a single long RPC.
+ if rpc_deadline is None:
+ rpc_deadline = _timedelta(seconds=30)
+
# Fine-tuned to wait for the channel to the server.
retryer = retryers.exponential_retryer_with_timeout(
wait_min=_timedelta(seconds=10),
wait_max=_timedelta(seconds=25),
- timeout=_timedelta(minutes=3) if timeout is None else timeout)
+ timeout=_timedelta(minutes=5) if timeout is None else timeout)
logger.info('Waiting for client %s to report a %s channel to %s',
self.ip, _ChannelzChannelState.Name(state),
self.server_target)
- channel = retryer(self.find_server_channel_with_state, state)
+ channel = retryer(self.find_server_channel_with_state,
+ state,
+ rpc_deadline=rpc_deadline)
logger.info('Client %s channel to %s transitioned to state %s:\n%s',
self.ip, self.server_target,
_ChannelzChannelState.Name(state), channel)
return channel
- def find_server_channel_with_state(self,
- state: _ChannelzChannelState,
- *,
- check_subchannel=True
- ) -> _ChannelzChannel:
- for channel in self.get_server_channels():
+ def find_server_channel_with_state(
+ self,
+ state: _ChannelzChannelState,
+ *,
+ rpc_deadline: Optional[_timedelta] = None,
+ check_subchannel=True) -> _ChannelzChannel:
+ rpc_params = {}
+ if rpc_deadline is not None:
+ rpc_params['deadline_sec'] = rpc_deadline.total_seconds()
+
+ for channel in self.get_server_channels(**rpc_params):
channel_state: _ChannelzChannelState = channel.data.state.state
logger.info('Server channel: %s, state: %s', channel.ref.name,
_ChannelzChannelState.Name(channel_state))
# one subchannel in the requested state.
try:
subchannel = self.find_subchannel_with_state(
- channel, state)
+ channel, state, **rpc_params)
logger.info('Found subchannel in state %s: %s', state,
subchannel)
except self.NotFound as e:
f'Client has no {_ChannelzChannelState.Name(state)} channel with '
'the server')
+ def get_server_channels(self, **kwargs) -> Iterator[_ChannelzChannel]:
+ return self.channelz.find_channels_for_target(self.server_target,
+ **kwargs)
+
def find_subchannel_with_state(self, channel: _ChannelzChannel,
- state: _ChannelzChannelState
- ) -> _ChannelzSubchannel:
- for subchannel in self.channelz.list_channel_subchannels(channel):
+ state: _ChannelzChannelState,
+ **kwargs) -> _ChannelzSubchannel:
+ subchannels = self.channelz.list_channel_subchannels(channel, **kwargs)
+ for subchannel in subchannels:
if subchannel.data.state.state is state:
return subchannel
image_name,
gcp_service_account,
td_bootstrap_image,
+ xds_server_uri=None,
+ network='default',
service_account_name=None,
stats_port=8079,
- network='default',
deployment_template='client.deployment.yaml',
service_account_template='service-account.yaml',
reuse_namespace=False,
self.stats_port = stats_port
# xDS bootstrap generator
self.td_bootstrap_image = td_bootstrap_image
+ self.xds_server_uri = xds_server_uri
self.network = network
self.deployment_template = deployment_template
self.service_account_template = service_account_template
namespace_name=self.k8s_namespace.name,
service_account_name=self.service_account_name,
td_bootstrap_image=self.td_bootstrap_image,
- network_name=self.network,
+ xds_server_uri=self.xds_server_uri,
+ network=self.network,
stats_port=self.stats_port,
server_target=server_target,
rpc=rpc,
service_name=None,
neg_name=None,
td_bootstrap_image=None,
+ xds_server_uri=None,
network='default',
deployment_template='server.deployment.yaml',
service_account_template='service-account.yaml',
self.service_name = service_name or deployment_name
# xDS bootstrap generator
self.td_bootstrap_image = td_bootstrap_image
+ self.xds_server_uri = xds_server_uri
# This only works in k8s >= 1.18.10-gke.600
# https://cloud.google.com/kubernetes-engine/docs/how-to/standalone-neg#naming_negs
self.neg_name = neg_name or (f'{self.k8s_namespace.name}-'
namespace_name=self.k8s_namespace.name,
service_account_name=self.service_account_name,
td_bootstrap_image=self.td_bootstrap_image,
- network_name=self.network,
+ xds_server_uri=self.xds_server_uri,
+ network=self.network,
replica_count=replica_count,
test_port=test_port,
maintenance_port=maintenance_port,
secure_mode=secure_mode)
self._wait_deployment_with_available_replicas(self.deployment_name,
- replica_count,
- timeout_sec=120)
+ replica_count)
# Wait for pods running
pods = self.k8s_namespace.list_deployment_pods(self.deployment)
NETWORK = flags.DEFINE_string("network",
default="default",
help="GCP Network ID")
+# Mirrors --xds-server-uri argument of Traffic Director gRPC Bootstrap
+XDS_SERVER_URI = flags.DEFINE_string(
+ "xds_server_uri",
+ default=None,
+ help="Override Traffic Director server uri, for testing")
# Test server
SERVER_NAME = flags.DEFINE_string("server_name",
cls.network: str = xds_flags.NETWORK.value
cls.gcp_service_account: str = xds_k8s_flags.GCP_SERVICE_ACCOUNT.value
cls.td_bootstrap_image = xds_k8s_flags.TD_BOOTSTRAP_IMAGE.value
+ cls.xds_server_uri = xds_flags.XDS_SERVER_URI.value
# Base namespace
# TODO(sergiitk): generate for each test
deployment_name=self.server_name,
image_name=self.server_image,
gcp_service_account=self.gcp_service_account,
- network=self.network,
- td_bootstrap_image=self.td_bootstrap_image)
+ td_bootstrap_image=self.td_bootstrap_image,
+ xds_server_uri=self.xds_server_uri,
+ network=self.network)
# Test Client Runner
self.client_runner = client_app.KubernetesClientRunner(
deployment_name=self.client_name,
image_name=self.client_image,
gcp_service_account=self.gcp_service_account,
- network=self.network,
td_bootstrap_image=self.td_bootstrap_image,
+ xds_server_uri=self.xds_server_uri,
+ network=self.network,
debug_use_port_forwarding=self.debug_use_port_forwarding,
stats_port=self.client_port,
reuse_namespace=self.server_namespace == self.client_namespace)
gcp_service_account=self.gcp_service_account,
network=self.network,
td_bootstrap_image=self.td_bootstrap_image,
+ xds_server_uri=self.xds_server_uri,
deployment_template='server-secure.deployment.yaml',
debug_use_port_forwarding=self.debug_use_port_forwarding)
deployment_name=self.client_name,
image_name=self.client_image,
gcp_service_account=self.gcp_service_account,
- network=self.network,
td_bootstrap_image=self.td_bootstrap_image,
+ xds_server_uri=self.xds_server_uri,
+ network=self.network,
deployment_template='client-secure.deployment.yaml',
stats_port=self.client_port,
reuse_namespace=self.server_namespace == self.client_namespace,
@staticmethod
def getConnectedSockets(
- test_client: XdsTestClient, test_server: XdsTestServer
+ test_client: XdsTestClient, test_server: XdsTestServer
) -> Tuple[grpc_channelz.Socket, grpc_channelz.Socket]:
client_sock = test_client.get_active_server_channel_socket()
server_sock = test_server.get_server_socket_matching_client(client_sock)
imagePullPolicy: Always
args:
- "--output=/tmp/bootstrap/td-grpc-bootstrap.json"
- - "--vpc-network-name=${network_name}"
+ - "--vpc-network-name=${network}"
+ % if xds_server_uri:
+ - "--xds-server-uri=${xds_server_uri}"
+ % endif
- "--include-v3-features-experimental"
- "--include-psm-security-experimental"
resources:
imagePullPolicy: Always
args:
- "--output=/tmp/bootstrap/td-grpc-bootstrap.json"
- - "--vpc-network-name=${network_name}"
+ - "--vpc-network-name=${network}"
+ % if xds_server_uri:
+ - "--xds-server-uri=${xds_server_uri}"
+ % endif
resources:
limits:
cpu: 100m
imagePullPolicy: Always
args:
- "--output=/tmp/bootstrap/td-grpc-bootstrap.json"
- - "--vpc-network-name=${network_name}"
+ - "--vpc-network-name=${network}"
+ % if xds_server_uri:
+ - "--xds-server-uri=${xds_server_uri}"
+ % endif
- "--include-v3-features-experimental"
- "--include-psm-security-experimental"
- "--node-metadata-experimental=app=${namespace_name}-${deployment_name}"