// Copyright 2023 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.

// Auto generated by tools/codegen/core/gen_experiments.py

#include "src/core/lib/experiments/experiments.h"

#include <grpc/support/port_platform.h>
#include <stdint.h>

#ifndef GRPC_EXPERIMENTS_ARE_FINAL

#if defined(GRPC_CFSTREAM)
namespace {
const char* const description_buffer_list_deletion_prep =
    "Gate the removal of old TCP timestamp collection mechanism.";
const char* const additional_constraints_buffer_list_deletion_prep = "{}";
const char* const description_call_tracer_in_transport =
    "Transport directly passes byte counts to CallTracer.";
const char* const additional_constraints_call_tracer_in_transport = "{}";
const char* const
    description_call_tracer_send_initial_metadata_is_an_annotation =
        "Use the new annotation-based CallTracer API.";
const char* const
    additional_constraints_call_tracer_send_initial_metadata_is_an_annotation =
        "{}";
const char* const
    description_call_tracer_send_trailing_metadata_is_an_annotation =
        "Use the new annotation-based CallTracer API.";
const char* const
    additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation =
        "{}";
const char* const description_chaotic_good_connect_deadline =
    "Use the deadline from the connect args in chaotic good connector";
const char* const additional_constraints_chaotic_good_connect_deadline = "{}";
const char* const description_chaotic_good_framing_layer =
    "Enable the chaotic good framing layer.";
const char* const additional_constraints_chaotic_good_framing_layer = "{}";
const char* const description_chaotic_good_send_supported_features =
    "Send supported features in chaotic good settings frames.";
const char* const additional_constraints_chaotic_good_send_supported_features =
    "{}";
const char* const description_error_flatten =
    "Flatten errors to ordinary absl::Status form.";
const char* const additional_constraints_error_flatten = "{}";
const char* const description_event_engine_client =
    "Use EventEngine clients instead of iomgr's grpc_tcp_client";
const char* const additional_constraints_event_engine_client = "{}";
const char* const description_event_engine_dns =
    "If set, use EventEngine DNSResolver for client channel resolution";
const char* const additional_constraints_event_engine_dns = "{}";
const char* const description_event_engine_dns_non_client_channel =
    "If set, use EventEngine DNSResolver in other places besides client "
    "channel.";
const char* const additional_constraints_event_engine_dns_non_client_channel =
    "{}";
const char* const description_event_engine_fork =
    "Enables event engine fork handling, including onfork events and file "
    "descriptor generations";
const char* const additional_constraints_event_engine_fork = "{}";
const char* const description_event_engine_listener =
    "Use EventEngine listeners instead of iomgr's grpc_tcp_server";
const char* const additional_constraints_event_engine_listener = "{}";
const char* const description_event_engine_callback_cq =
    "Use EventEngine instead of the CallbackAlternativeCQ.";
const char* const additional_constraints_event_engine_callback_cq = "{}";
const uint8_t required_experiments_event_engine_callback_cq[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_event_engine_for_all_other_endpoints =
    "Use EventEngine endpoints for all call sites, including direct uses of "
    "grpc_tcp_create.";
const char* const additional_constraints_event_engine_for_all_other_endpoints =
    "{}";
const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineDns),
    static_cast<uint8_t>(
        grpc_core::kExperimentIdEventEngineDnsNonClientChannel),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_event_engine_poller_for_python =
    "Enable event engine poller in gRPC Python";
const char* const additional_constraints_event_engine_poller_for_python = "{}";
const char* const description_fail_recv_metadata_on_deadline_exceeded =
    "Fail recv initial metadata when the deadline is exceeded.";
const char* const
    additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}";
const char* const description_free_large_allocator =
    "If set, return all free bytes from a \042big\042 allocator";
const char* const additional_constraints_free_large_allocator = "{}";
const char* const description_fuse_filters =
    "If set, individual filters are merged into fused filters";
const char* const additional_constraints_fuse_filters = "{}";
const char* const description_keep_alive_ping_timer_batch =
    "Avoid explicitly cancelling the keepalive timer. Instead adjust the "
    "callback to re-schedule itself to the next ping interval.";
const char* const additional_constraints_keep_alive_ping_timer_batch = "{}";
const char* const description_local_connector_secure =
    "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP "
    "connections.";
const char* const additional_constraints_local_connector_secure = "{}";
const char* const description_max_inflight_pings_strict_limit =
    "If set, the max inflight pings limit is strictly enforced.";
const char* const additional_constraints_max_inflight_pings_strict_limit = "{}";
const char* const description_metadata_publish_to_app_tag =
    "Publish metadata to the app using the kPublishToApp metadata field.";
const char* const additional_constraints_metadata_publish_to_app_tag = "{}";
const char* const description_monitoring_experiment =
    "Placeholder experiment to prove/disprove our monitoring is working";
const char* const additional_constraints_monitoring_experiment = "{}";
const char* const description_multiping =
    "Allow more than one ping to be in flight at a time by default.";
const char* const additional_constraints_multiping = "{}";
const char* const description_otel_export_telemetry_domains =
    "Export telemetry domains in OpenTelemetry metrics.";
const char* const additional_constraints_otel_export_telemetry_domains = "{}";
const char* const description_pick_first_ignore_empty_updates =
    "Ignore empty resolutions in pick_first";
const char* const additional_constraints_pick_first_ignore_empty_updates = "{}";
const char* const description_pick_first_ready_to_connecting =
    "When the subchannel goes from READY to CONNECTING or TRANSIENT_FAILURE, "
    "pick_first goes to CONNECTING and starts a new Happy Eyeballs pass.";
const char* const additional_constraints_pick_first_ready_to_connecting = "{}";
const char* const description_pipelined_read_secure_endpoint =
    "Enable pipelined reads for EventEngine secure endpoints";
const char* const additional_constraints_pipelined_read_secure_endpoint = "{}";
const uint8_t required_experiments_pipelined_read_secure_endpoint[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_pollset_alternative =
    "Code outside iomgr that relies directly on pollsets will use non-pollset "
    "alternatives when enabled.";
const char* const additional_constraints_pollset_alternative = "{}";
const uint8_t required_experiments_pollset_alternative[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_prioritize_finished_requests =
    "Prioritize flushing out finished requests over other in-flight requests "
    "during transport writes.";
const char* const additional_constraints_prioritize_finished_requests = "{}";
const char* const description_promise_based_http2_client_transport =
    "Use promises for the http2 client transport. We have kept client and "
    "server transport experiments separate to help with smoother roll outs and "
    "also help with interop testing.";
const char* const additional_constraints_promise_based_http2_client_transport =
    "{}";
const char* const description_promise_based_http2_server_transport =
    "Use promises for the http2 server transport. We have kept client and "
    "server transport experiments separate to help with smoother roll outs and "
    "also help with interop testing.";
const char* const additional_constraints_promise_based_http2_server_transport =
    "{}";
const char* const description_promise_based_inproc_transport =
    "Use promises for the in-process transport.";
const char* const additional_constraints_promise_based_inproc_transport = "{}";
const char* const description_promise_filter_send_cancel_metadata =
    "Enables sending all trailing metadata fields from server side "
    "promise-based filters upon stream cancellation.";
const char* const additional_constraints_promise_filter_send_cancel_metadata =
    "{}";
const char* const description_retry_in_callv3 = "Support retries with call-v3";
const char* const additional_constraints_retry_in_callv3 = "{}";
const char* const description_return_preexisting_errors =
    "Return errors that exist before the start of the call in RunHandler.";
const char* const additional_constraints_return_preexisting_errors = "{}";
const char* const description_rr_wrr_connect_from_random_index =
    "RR and WRR LB policies start connecting from a random index in the "
    "address list.";
const char* const additional_constraints_rr_wrr_connect_from_random_index =
    "{}";
const char* const description_schedule_cancellation_over_write =
    "Allow cancellation op to be scheduled over a write";
const char* const additional_constraints_schedule_cancellation_over_write =
    "{}";
const char* const description_secure_endpoint_offload_large_reads =
    "If a large read needs to be decrypted, use a separate thread.";
const char* const additional_constraints_secure_endpoint_offload_large_reads =
    "{}";
const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_secure_endpoint_offload_large_writes =
    "If a large read write to be encrypted, use a separate thread.";
const char* const additional_constraints_secure_endpoint_offload_large_writes =
    "{}";
const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_secure_endpoint_read_coalescing =
    "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided.";
const char* const additional_constraints_secure_endpoint_read_coalescing = "{}";
const uint8_t required_experiments_secure_endpoint_read_coalescing[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_skip_clear_peer_on_cancellation =
    "If set, skips clearing of peer string on call cancellation.";
const char* const additional_constraints_skip_clear_peer_on_cancellation = "{}";
const char* const description_sleep_promise_exec_ctx_removal =
    "If set, polling the sleep promise does not rely on the ExecCtx.";
const char* const additional_constraints_sleep_promise_exec_ctx_removal = "{}";
const char* const description_sleep_use_non_owning_waker =
    "If set, the sleep promise uses a non-owning waker.";
const char* const additional_constraints_sleep_use_non_owning_waker = "{}";
const char* const description_subchannel_connection_scaling =
    "Subchannel connection scaling support.";
const char* const additional_constraints_subchannel_connection_scaling = "{}";
const char* const description_subchannel_wrapper_cleanup_on_orphan =
    "Fixes the subchannel wrapper to drop any non-cancelled watchers when it "
    "gets orphaned.";
const char* const additional_constraints_subchannel_wrapper_cleanup_on_orphan =
    "{}";
const char* const description_tcp_frame_size_tuning =
    "If set, enables TCP to use RPC size estimation made by higher layers. TCP "
    "would not indicate completion of a read operation until a specified "
    "number of bytes have been read over the socket. Buffers are also "
    "allocated according to estimated RPC sizes.";
const char* const additional_constraints_tcp_frame_size_tuning = "{}";
const char* const description_tcp_rcv_lowat =
    "Use SO_RCVLOWAT to avoid wakeups on the read path.";
const char* const additional_constraints_tcp_rcv_lowat = "{}";
const char* const description_tsi_frame_protector_without_locks =
    "Do not hold locks while using the tsi_frame_protector.";
const char* const additional_constraints_tsi_frame_protector_without_locks =
    "{}";
const char* const description_unconstrained_max_quota_buffer_size =
    "Discard the cap on the max free pool size for one memory allocator";
const char* const additional_constraints_unconstrained_max_quota_buffer_size =
    "{}";
const char* const description_use_call_event_engine_in_completion_queue =
    "Use the call event engine to run callbacks in completion queue.";
const char* const
    additional_constraints_use_call_event_engine_in_completion_queue = "{}";
const char* const description_wildcard_ip_expansion_restriction =
    "If set, adds optional restriction on when to expand wildcard IPs.";
const char* const additional_constraints_wildcard_ip_expansion_restriction =
    "{}";
const char* const description_xds_channel_filter_chain_per_route =
    "xDS channels use a separate filter chain for each route.";
const char* const additional_constraints_xds_channel_filter_chain_per_route =
    "{}";
}  // namespace

namespace grpc_core {

const ExperimentMetadata g_experiment_metadata[] = {
    {"buffer_list_deletion_prep", description_buffer_list_deletion_prep,
     additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true},
    {"call_tracer_in_transport", description_call_tracer_in_transport,
     additional_constraints_call_tracer_in_transport, nullptr, 0, true, false},
    {"call_tracer_send_initial_metadata_is_an_annotation",
     description_call_tracer_send_initial_metadata_is_an_annotation,
     additional_constraints_call_tracer_send_initial_metadata_is_an_annotation,
     nullptr, 0, true, true},
    {"call_tracer_send_trailing_metadata_is_an_annotation",
     description_call_tracer_send_trailing_metadata_is_an_annotation,
     additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation,
     nullptr, 0, false, true},
    {"chaotic_good_connect_deadline", description_chaotic_good_connect_deadline,
     additional_constraints_chaotic_good_connect_deadline, nullptr, 0, true,
     true},
    {"chaotic_good_framing_layer", description_chaotic_good_framing_layer,
     additional_constraints_chaotic_good_framing_layer, nullptr, 0, true,
     false},
    {"chaotic_good_send_supported_features",
     description_chaotic_good_send_supported_features,
     additional_constraints_chaotic_good_send_supported_features, nullptr, 0,
     false, true},
    {"error_flatten", description_error_flatten,
     additional_constraints_error_flatten, nullptr, 0, false, false},
    {"event_engine_client", description_event_engine_client,
     additional_constraints_event_engine_client, nullptr, 0, true, false},
    {"event_engine_dns", description_event_engine_dns,
     additional_constraints_event_engine_dns, nullptr, 0, true, false},
    {"event_engine_dns_non_client_channel",
     description_event_engine_dns_non_client_channel,
     additional_constraints_event_engine_dns_non_client_channel, nullptr, 0,
     true, false},
    {"event_engine_fork", description_event_engine_fork,
     additional_constraints_event_engine_fork, nullptr, 0, true, false},
    {"event_engine_listener", description_event_engine_listener,
     additional_constraints_event_engine_listener, nullptr, 0, true, false},
    {"event_engine_callback_cq", description_event_engine_callback_cq,
     additional_constraints_event_engine_callback_cq,
     required_experiments_event_engine_callback_cq, 2, true, true},
    {"event_engine_for_all_other_endpoints",
     description_event_engine_for_all_other_endpoints,
     additional_constraints_event_engine_for_all_other_endpoints,
     required_experiments_event_engine_for_all_other_endpoints, 4, true, false},
    {"event_engine_poller_for_python",
     description_event_engine_poller_for_python,
     additional_constraints_event_engine_poller_for_python, nullptr, 0, true,
     true},
    {"fail_recv_metadata_on_deadline_exceeded",
     description_fail_recv_metadata_on_deadline_exceeded,
     additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0,
     false, false},
    {"free_large_allocator", description_free_large_allocator,
     additional_constraints_free_large_allocator, nullptr, 0, false, true},
    {"fuse_filters", description_fuse_filters,
     additional_constraints_fuse_filters, nullptr, 0, false, false},
    {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch,
     additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false,
     true},
    {"local_connector_secure", description_local_connector_secure,
     additional_constraints_local_connector_secure, nullptr, 0, false, true},
    {"max_inflight_pings_strict_limit",
     description_max_inflight_pings_strict_limit,
     additional_constraints_max_inflight_pings_strict_limit, nullptr, 0, true,
     true},
    {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag,
     additional_constraints_metadata_publish_to_app_tag, nullptr, 0, true,
     true},
    {"monitoring_experiment", description_monitoring_experiment,
     additional_constraints_monitoring_experiment, nullptr, 0, true, true},
    {"multiping", description_multiping, additional_constraints_multiping,
     nullptr, 0, false, true},
    {"otel_export_telemetry_domains", description_otel_export_telemetry_domains,
     additional_constraints_otel_export_telemetry_domains, nullptr, 0, false,
     true},
    {"pick_first_ignore_empty_updates",
     description_pick_first_ignore_empty_updates,
     additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false,
     true},
    {"pick_first_ready_to_connecting",
     description_pick_first_ready_to_connecting,
     additional_constraints_pick_first_ready_to_connecting, nullptr, 0, true,
     true},
    {"pipelined_read_secure_endpoint",
     description_pipelined_read_secure_endpoint,
     additional_constraints_pipelined_read_secure_endpoint,
     required_experiments_pipelined_read_secure_endpoint, 2, false, false},
    {"pollset_alternative", description_pollset_alternative,
     additional_constraints_pollset_alternative,
     required_experiments_pollset_alternative, 2, false, false},
    {"prioritize_finished_requests", description_prioritize_finished_requests,
     additional_constraints_prioritize_finished_requests, nullptr, 0, false,
     true},
    {"promise_based_http2_client_transport",
     description_promise_based_http2_client_transport,
     additional_constraints_promise_based_http2_client_transport, nullptr, 0,
     false, true},
    {"promise_based_http2_server_transport",
     description_promise_based_http2_server_transport,
     additional_constraints_promise_based_http2_server_transport, nullptr, 0,
     false, true},
    {"promise_based_inproc_transport",
     description_promise_based_inproc_transport,
     additional_constraints_promise_based_inproc_transport, nullptr, 0, false,
     false},
    {"promise_filter_send_cancel_metadata",
     description_promise_filter_send_cancel_metadata,
     additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0,
     false, true},
    {"retry_in_callv3", description_retry_in_callv3,
     additional_constraints_retry_in_callv3, nullptr, 0, false, true},
    {"return_preexisting_errors", description_return_preexisting_errors,
     additional_constraints_return_preexisting_errors, nullptr, 0, false, true},
    {"rr_wrr_connect_from_random_index",
     description_rr_wrr_connect_from_random_index,
     additional_constraints_rr_wrr_connect_from_random_index, nullptr, 0, true,
     true},
    {"schedule_cancellation_over_write",
     description_schedule_cancellation_over_write,
     additional_constraints_schedule_cancellation_over_write, nullptr, 0, false,
     true},
    {"secure_endpoint_offload_large_reads",
     description_secure_endpoint_offload_large_reads,
     additional_constraints_secure_endpoint_offload_large_reads,
     required_experiments_secure_endpoint_offload_large_reads, 2, false, true},
    {"secure_endpoint_offload_large_writes",
     description_secure_endpoint_offload_large_writes,
     additional_constraints_secure_endpoint_offload_large_writes,
     required_experiments_secure_endpoint_offload_large_writes, 2, false, true},
    {"secure_endpoint_read_coalescing",
     description_secure_endpoint_read_coalescing,
     additional_constraints_secure_endpoint_read_coalescing,
     required_experiments_secure_endpoint_read_coalescing, 2, false, true},
    {"skip_clear_peer_on_cancellation",
     description_skip_clear_peer_on_cancellation,
     additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false,
     true},
    {"sleep_promise_exec_ctx_removal",
     description_sleep_promise_exec_ctx_removal,
     additional_constraints_sleep_promise_exec_ctx_removal, nullptr, 0, false,
     true},
    {"sleep_use_non_owning_waker", description_sleep_use_non_owning_waker,
     additional_constraints_sleep_use_non_owning_waker, nullptr, 0, true, true},
    {"subchannel_connection_scaling", description_subchannel_connection_scaling,
     additional_constraints_subchannel_connection_scaling, nullptr, 0, false,
     true},
    {"subchannel_wrapper_cleanup_on_orphan",
     description_subchannel_wrapper_cleanup_on_orphan,
     additional_constraints_subchannel_wrapper_cleanup_on_orphan, nullptr, 0,
     false, true},
    {"tcp_frame_size_tuning", description_tcp_frame_size_tuning,
     additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true},
    {"tcp_rcv_lowat", description_tcp_rcv_lowat,
     additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true},
    {"tsi_frame_protector_without_locks",
     description_tsi_frame_protector_without_locks,
     additional_constraints_tsi_frame_protector_without_locks, nullptr, 0,
     false, true},
    {"unconstrained_max_quota_buffer_size",
     description_unconstrained_max_quota_buffer_size,
     additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0,
     false, true},
    {"use_call_event_engine_in_completion_queue",
     description_use_call_event_engine_in_completion_queue,
     additional_constraints_use_call_event_engine_in_completion_queue, nullptr,
     0, false, true},
    {"wildcard_ip_expansion_restriction",
     description_wildcard_ip_expansion_restriction,
     additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0,
     false, true},
    {"xds_channel_filter_chain_per_route",
     description_xds_channel_filter_chain_per_route,
     additional_constraints_xds_channel_filter_chain_per_route, nullptr, 0,
     true, true},
};

}  // namespace grpc_core

#elif defined(GPR_WINDOWS)
namespace {
const char* const description_buffer_list_deletion_prep =
    "Gate the removal of old TCP timestamp collection mechanism.";
const char* const additional_constraints_buffer_list_deletion_prep = "{}";
const char* const description_call_tracer_in_transport =
    "Transport directly passes byte counts to CallTracer.";
const char* const additional_constraints_call_tracer_in_transport = "{}";
const char* const
    description_call_tracer_send_initial_metadata_is_an_annotation =
        "Use the new annotation-based CallTracer API.";
const char* const
    additional_constraints_call_tracer_send_initial_metadata_is_an_annotation =
        "{}";
const char* const
    description_call_tracer_send_trailing_metadata_is_an_annotation =
        "Use the new annotation-based CallTracer API.";
const char* const
    additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation =
        "{}";
const char* const description_chaotic_good_connect_deadline =
    "Use the deadline from the connect args in chaotic good connector";
const char* const additional_constraints_chaotic_good_connect_deadline = "{}";
const char* const description_chaotic_good_framing_layer =
    "Enable the chaotic good framing layer.";
const char* const additional_constraints_chaotic_good_framing_layer = "{}";
const char* const description_chaotic_good_send_supported_features =
    "Send supported features in chaotic good settings frames.";
const char* const additional_constraints_chaotic_good_send_supported_features =
    "{}";
const char* const description_error_flatten =
    "Flatten errors to ordinary absl::Status form.";
const char* const additional_constraints_error_flatten = "{}";
const char* const description_event_engine_client =
    "Use EventEngine clients instead of iomgr's grpc_tcp_client";
const char* const additional_constraints_event_engine_client = "{}";
const char* const description_event_engine_dns =
    "If set, use EventEngine DNSResolver for client channel resolution";
const char* const additional_constraints_event_engine_dns = "{}";
const char* const description_event_engine_dns_non_client_channel =
    "If set, use EventEngine DNSResolver in other places besides client "
    "channel.";
const char* const additional_constraints_event_engine_dns_non_client_channel =
    "{}";
const char* const description_event_engine_fork =
    "Enables event engine fork handling, including onfork events and file "
    "descriptor generations";
const char* const additional_constraints_event_engine_fork = "{}";
const char* const description_event_engine_listener =
    "Use EventEngine listeners instead of iomgr's grpc_tcp_server";
const char* const additional_constraints_event_engine_listener = "{}";
const char* const description_event_engine_callback_cq =
    "Use EventEngine instead of the CallbackAlternativeCQ.";
const char* const additional_constraints_event_engine_callback_cq = "{}";
const uint8_t required_experiments_event_engine_callback_cq[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_event_engine_for_all_other_endpoints =
    "Use EventEngine endpoints for all call sites, including direct uses of "
    "grpc_tcp_create.";
const char* const additional_constraints_event_engine_for_all_other_endpoints =
    "{}";
const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineDns),
    static_cast<uint8_t>(
        grpc_core::kExperimentIdEventEngineDnsNonClientChannel),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_event_engine_poller_for_python =
    "Enable event engine poller in gRPC Python";
const char* const additional_constraints_event_engine_poller_for_python = "{}";
const char* const description_fail_recv_metadata_on_deadline_exceeded =
    "Fail recv initial metadata when the deadline is exceeded.";
const char* const
    additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}";
const char* const description_free_large_allocator =
    "If set, return all free bytes from a \042big\042 allocator";
const char* const additional_constraints_free_large_allocator = "{}";
const char* const description_fuse_filters =
    "If set, individual filters are merged into fused filters";
const char* const additional_constraints_fuse_filters = "{}";
const char* const description_keep_alive_ping_timer_batch =
    "Avoid explicitly cancelling the keepalive timer. Instead adjust the "
    "callback to re-schedule itself to the next ping interval.";
const char* const additional_constraints_keep_alive_ping_timer_batch = "{}";
const char* const description_local_connector_secure =
    "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP "
    "connections.";
const char* const additional_constraints_local_connector_secure = "{}";
const char* const description_max_inflight_pings_strict_limit =
    "If set, the max inflight pings limit is strictly enforced.";
const char* const additional_constraints_max_inflight_pings_strict_limit = "{}";
const char* const description_metadata_publish_to_app_tag =
    "Publish metadata to the app using the kPublishToApp metadata field.";
const char* const additional_constraints_metadata_publish_to_app_tag = "{}";
const char* const description_monitoring_experiment =
    "Placeholder experiment to prove/disprove our monitoring is working";
const char* const additional_constraints_monitoring_experiment = "{}";
const char* const description_multiping =
    "Allow more than one ping to be in flight at a time by default.";
const char* const additional_constraints_multiping = "{}";
const char* const description_otel_export_telemetry_domains =
    "Export telemetry domains in OpenTelemetry metrics.";
const char* const additional_constraints_otel_export_telemetry_domains = "{}";
const char* const description_pick_first_ignore_empty_updates =
    "Ignore empty resolutions in pick_first";
const char* const additional_constraints_pick_first_ignore_empty_updates = "{}";
const char* const description_pick_first_ready_to_connecting =
    "When the subchannel goes from READY to CONNECTING or TRANSIENT_FAILURE, "
    "pick_first goes to CONNECTING and starts a new Happy Eyeballs pass.";
const char* const additional_constraints_pick_first_ready_to_connecting = "{}";
const char* const description_pipelined_read_secure_endpoint =
    "Enable pipelined reads for EventEngine secure endpoints";
const char* const additional_constraints_pipelined_read_secure_endpoint = "{}";
const uint8_t required_experiments_pipelined_read_secure_endpoint[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_pollset_alternative =
    "Code outside iomgr that relies directly on pollsets will use non-pollset "
    "alternatives when enabled.";
const char* const additional_constraints_pollset_alternative = "{}";
const uint8_t required_experiments_pollset_alternative[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_prioritize_finished_requests =
    "Prioritize flushing out finished requests over other in-flight requests "
    "during transport writes.";
const char* const additional_constraints_prioritize_finished_requests = "{}";
const char* const description_promise_based_http2_client_transport =
    "Use promises for the http2 client transport. We have kept client and "
    "server transport experiments separate to help with smoother roll outs and "
    "also help with interop testing.";
const char* const additional_constraints_promise_based_http2_client_transport =
    "{}";
const char* const description_promise_based_http2_server_transport =
    "Use promises for the http2 server transport. We have kept client and "
    "server transport experiments separate to help with smoother roll outs and "
    "also help with interop testing.";
const char* const additional_constraints_promise_based_http2_server_transport =
    "{}";
const char* const description_promise_based_inproc_transport =
    "Use promises for the in-process transport.";
const char* const additional_constraints_promise_based_inproc_transport = "{}";
const char* const description_promise_filter_send_cancel_metadata =
    "Enables sending all trailing metadata fields from server side "
    "promise-based filters upon stream cancellation.";
const char* const additional_constraints_promise_filter_send_cancel_metadata =
    "{}";
const char* const description_retry_in_callv3 = "Support retries with call-v3";
const char* const additional_constraints_retry_in_callv3 = "{}";
const char* const description_return_preexisting_errors =
    "Return errors that exist before the start of the call in RunHandler.";
const char* const additional_constraints_return_preexisting_errors = "{}";
const char* const description_rr_wrr_connect_from_random_index =
    "RR and WRR LB policies start connecting from a random index in the "
    "address list.";
const char* const additional_constraints_rr_wrr_connect_from_random_index =
    "{}";
const char* const description_schedule_cancellation_over_write =
    "Allow cancellation op to be scheduled over a write";
const char* const additional_constraints_schedule_cancellation_over_write =
    "{}";
const char* const description_secure_endpoint_offload_large_reads =
    "If a large read needs to be decrypted, use a separate thread.";
const char* const additional_constraints_secure_endpoint_offload_large_reads =
    "{}";
const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_secure_endpoint_offload_large_writes =
    "If a large read write to be encrypted, use a separate thread.";
const char* const additional_constraints_secure_endpoint_offload_large_writes =
    "{}";
const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_secure_endpoint_read_coalescing =
    "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided.";
const char* const additional_constraints_secure_endpoint_read_coalescing = "{}";
const uint8_t required_experiments_secure_endpoint_read_coalescing[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_skip_clear_peer_on_cancellation =
    "If set, skips clearing of peer string on call cancellation.";
const char* const additional_constraints_skip_clear_peer_on_cancellation = "{}";
const char* const description_sleep_promise_exec_ctx_removal =
    "If set, polling the sleep promise does not rely on the ExecCtx.";
const char* const additional_constraints_sleep_promise_exec_ctx_removal = "{}";
const char* const description_sleep_use_non_owning_waker =
    "If set, the sleep promise uses a non-owning waker.";
const char* const additional_constraints_sleep_use_non_owning_waker = "{}";
const char* const description_subchannel_connection_scaling =
    "Subchannel connection scaling support.";
const char* const additional_constraints_subchannel_connection_scaling = "{}";
const char* const description_subchannel_wrapper_cleanup_on_orphan =
    "Fixes the subchannel wrapper to drop any non-cancelled watchers when it "
    "gets orphaned.";
const char* const additional_constraints_subchannel_wrapper_cleanup_on_orphan =
    "{}";
const char* const description_tcp_frame_size_tuning =
    "If set, enables TCP to use RPC size estimation made by higher layers. TCP "
    "would not indicate completion of a read operation until a specified "
    "number of bytes have been read over the socket. Buffers are also "
    "allocated according to estimated RPC sizes.";
const char* const additional_constraints_tcp_frame_size_tuning = "{}";
const char* const description_tcp_rcv_lowat =
    "Use SO_RCVLOWAT to avoid wakeups on the read path.";
const char* const additional_constraints_tcp_rcv_lowat = "{}";
const char* const description_tsi_frame_protector_without_locks =
    "Do not hold locks while using the tsi_frame_protector.";
const char* const additional_constraints_tsi_frame_protector_without_locks =
    "{}";
const char* const description_unconstrained_max_quota_buffer_size =
    "Discard the cap on the max free pool size for one memory allocator";
const char* const additional_constraints_unconstrained_max_quota_buffer_size =
    "{}";
const char* const description_use_call_event_engine_in_completion_queue =
    "Use the call event engine to run callbacks in completion queue.";
const char* const
    additional_constraints_use_call_event_engine_in_completion_queue = "{}";
const char* const description_wildcard_ip_expansion_restriction =
    "If set, adds optional restriction on when to expand wildcard IPs.";
const char* const additional_constraints_wildcard_ip_expansion_restriction =
    "{}";
const char* const description_xds_channel_filter_chain_per_route =
    "xDS channels use a separate filter chain for each route.";
const char* const additional_constraints_xds_channel_filter_chain_per_route =
    "{}";
}  // namespace

namespace grpc_core {

const ExperimentMetadata g_experiment_metadata[] = {
    {"buffer_list_deletion_prep", description_buffer_list_deletion_prep,
     additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true},
    {"call_tracer_in_transport", description_call_tracer_in_transport,
     additional_constraints_call_tracer_in_transport, nullptr, 0, true, false},
    {"call_tracer_send_initial_metadata_is_an_annotation",
     description_call_tracer_send_initial_metadata_is_an_annotation,
     additional_constraints_call_tracer_send_initial_metadata_is_an_annotation,
     nullptr, 0, true, true},
    {"call_tracer_send_trailing_metadata_is_an_annotation",
     description_call_tracer_send_trailing_metadata_is_an_annotation,
     additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation,
     nullptr, 0, false, true},
    {"chaotic_good_connect_deadline", description_chaotic_good_connect_deadline,
     additional_constraints_chaotic_good_connect_deadline, nullptr, 0, true,
     true},
    {"chaotic_good_framing_layer", description_chaotic_good_framing_layer,
     additional_constraints_chaotic_good_framing_layer, nullptr, 0, true,
     false},
    {"chaotic_good_send_supported_features",
     description_chaotic_good_send_supported_features,
     additional_constraints_chaotic_good_send_supported_features, nullptr, 0,
     false, true},
    {"error_flatten", description_error_flatten,
     additional_constraints_error_flatten, nullptr, 0, false, false},
    {"event_engine_client", description_event_engine_client,
     additional_constraints_event_engine_client, nullptr, 0, true, false},
    {"event_engine_dns", description_event_engine_dns,
     additional_constraints_event_engine_dns, nullptr, 0, true, false},
    {"event_engine_dns_non_client_channel",
     description_event_engine_dns_non_client_channel,
     additional_constraints_event_engine_dns_non_client_channel, nullptr, 0,
     true, false},
    {"event_engine_fork", description_event_engine_fork,
     additional_constraints_event_engine_fork, nullptr, 0, true, false},
    {"event_engine_listener", description_event_engine_listener,
     additional_constraints_event_engine_listener, nullptr, 0, true, false},
    {"event_engine_callback_cq", description_event_engine_callback_cq,
     additional_constraints_event_engine_callback_cq,
     required_experiments_event_engine_callback_cq, 2, true, true},
    {"event_engine_for_all_other_endpoints",
     description_event_engine_for_all_other_endpoints,
     additional_constraints_event_engine_for_all_other_endpoints,
     required_experiments_event_engine_for_all_other_endpoints, 4, true, false},
    {"event_engine_poller_for_python",
     description_event_engine_poller_for_python,
     additional_constraints_event_engine_poller_for_python, nullptr, 0, true,
     true},
    {"fail_recv_metadata_on_deadline_exceeded",
     description_fail_recv_metadata_on_deadline_exceeded,
     additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0,
     false, false},
    {"free_large_allocator", description_free_large_allocator,
     additional_constraints_free_large_allocator, nullptr, 0, false, true},
    {"fuse_filters", description_fuse_filters,
     additional_constraints_fuse_filters, nullptr, 0, false, false},
    {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch,
     additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false,
     true},
    {"local_connector_secure", description_local_connector_secure,
     additional_constraints_local_connector_secure, nullptr, 0, false, true},
    {"max_inflight_pings_strict_limit",
     description_max_inflight_pings_strict_limit,
     additional_constraints_max_inflight_pings_strict_limit, nullptr, 0, true,
     true},
    {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag,
     additional_constraints_metadata_publish_to_app_tag, nullptr, 0, true,
     true},
    {"monitoring_experiment", description_monitoring_experiment,
     additional_constraints_monitoring_experiment, nullptr, 0, true, true},
    {"multiping", description_multiping, additional_constraints_multiping,
     nullptr, 0, false, true},
    {"otel_export_telemetry_domains", description_otel_export_telemetry_domains,
     additional_constraints_otel_export_telemetry_domains, nullptr, 0, false,
     true},
    {"pick_first_ignore_empty_updates",
     description_pick_first_ignore_empty_updates,
     additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false,
     true},
    {"pick_first_ready_to_connecting",
     description_pick_first_ready_to_connecting,
     additional_constraints_pick_first_ready_to_connecting, nullptr, 0, true,
     true},
    {"pipelined_read_secure_endpoint",
     description_pipelined_read_secure_endpoint,
     additional_constraints_pipelined_read_secure_endpoint,
     required_experiments_pipelined_read_secure_endpoint, 2, false, false},
    {"pollset_alternative", description_pollset_alternative,
     additional_constraints_pollset_alternative,
     required_experiments_pollset_alternative, 2, false, false},
    {"prioritize_finished_requests", description_prioritize_finished_requests,
     additional_constraints_prioritize_finished_requests, nullptr, 0, false,
     true},
    {"promise_based_http2_client_transport",
     description_promise_based_http2_client_transport,
     additional_constraints_promise_based_http2_client_transport, nullptr, 0,
     false, true},
    {"promise_based_http2_server_transport",
     description_promise_based_http2_server_transport,
     additional_constraints_promise_based_http2_server_transport, nullptr, 0,
     false, true},
    {"promise_based_inproc_transport",
     description_promise_based_inproc_transport,
     additional_constraints_promise_based_inproc_transport, nullptr, 0, false,
     false},
    {"promise_filter_send_cancel_metadata",
     description_promise_filter_send_cancel_metadata,
     additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0,
     false, true},
    {"retry_in_callv3", description_retry_in_callv3,
     additional_constraints_retry_in_callv3, nullptr, 0, false, true},
    {"return_preexisting_errors", description_return_preexisting_errors,
     additional_constraints_return_preexisting_errors, nullptr, 0, false, true},
    {"rr_wrr_connect_from_random_index",
     description_rr_wrr_connect_from_random_index,
     additional_constraints_rr_wrr_connect_from_random_index, nullptr, 0, true,
     true},
    {"schedule_cancellation_over_write",
     description_schedule_cancellation_over_write,
     additional_constraints_schedule_cancellation_over_write, nullptr, 0, false,
     true},
    {"secure_endpoint_offload_large_reads",
     description_secure_endpoint_offload_large_reads,
     additional_constraints_secure_endpoint_offload_large_reads,
     required_experiments_secure_endpoint_offload_large_reads, 2, false, true},
    {"secure_endpoint_offload_large_writes",
     description_secure_endpoint_offload_large_writes,
     additional_constraints_secure_endpoint_offload_large_writes,
     required_experiments_secure_endpoint_offload_large_writes, 2, false, true},
    {"secure_endpoint_read_coalescing",
     description_secure_endpoint_read_coalescing,
     additional_constraints_secure_endpoint_read_coalescing,
     required_experiments_secure_endpoint_read_coalescing, 2, false, true},
    {"skip_clear_peer_on_cancellation",
     description_skip_clear_peer_on_cancellation,
     additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false,
     true},
    {"sleep_promise_exec_ctx_removal",
     description_sleep_promise_exec_ctx_removal,
     additional_constraints_sleep_promise_exec_ctx_removal, nullptr, 0, false,
     true},
    {"sleep_use_non_owning_waker", description_sleep_use_non_owning_waker,
     additional_constraints_sleep_use_non_owning_waker, nullptr, 0, true, true},
    {"subchannel_connection_scaling", description_subchannel_connection_scaling,
     additional_constraints_subchannel_connection_scaling, nullptr, 0, false,
     true},
    {"subchannel_wrapper_cleanup_on_orphan",
     description_subchannel_wrapper_cleanup_on_orphan,
     additional_constraints_subchannel_wrapper_cleanup_on_orphan, nullptr, 0,
     false, true},
    {"tcp_frame_size_tuning", description_tcp_frame_size_tuning,
     additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true},
    {"tcp_rcv_lowat", description_tcp_rcv_lowat,
     additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true},
    {"tsi_frame_protector_without_locks",
     description_tsi_frame_protector_without_locks,
     additional_constraints_tsi_frame_protector_without_locks, nullptr, 0,
     false, true},
    {"unconstrained_max_quota_buffer_size",
     description_unconstrained_max_quota_buffer_size,
     additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0,
     false, true},
    {"use_call_event_engine_in_completion_queue",
     description_use_call_event_engine_in_completion_queue,
     additional_constraints_use_call_event_engine_in_completion_queue, nullptr,
     0, false, true},
    {"wildcard_ip_expansion_restriction",
     description_wildcard_ip_expansion_restriction,
     additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0,
     false, true},
    {"xds_channel_filter_chain_per_route",
     description_xds_channel_filter_chain_per_route,
     additional_constraints_xds_channel_filter_chain_per_route, nullptr, 0,
     true, true},
};

}  // namespace grpc_core

#else
namespace {
const char* const description_buffer_list_deletion_prep =
    "Gate the removal of old TCP timestamp collection mechanism.";
const char* const additional_constraints_buffer_list_deletion_prep = "{}";
const char* const description_call_tracer_in_transport =
    "Transport directly passes byte counts to CallTracer.";
const char* const additional_constraints_call_tracer_in_transport = "{}";
const char* const
    description_call_tracer_send_initial_metadata_is_an_annotation =
        "Use the new annotation-based CallTracer API.";
const char* const
    additional_constraints_call_tracer_send_initial_metadata_is_an_annotation =
        "{}";
const char* const
    description_call_tracer_send_trailing_metadata_is_an_annotation =
        "Use the new annotation-based CallTracer API.";
const char* const
    additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation =
        "{}";
const char* const description_chaotic_good_connect_deadline =
    "Use the deadline from the connect args in chaotic good connector";
const char* const additional_constraints_chaotic_good_connect_deadline = "{}";
const char* const description_chaotic_good_framing_layer =
    "Enable the chaotic good framing layer.";
const char* const additional_constraints_chaotic_good_framing_layer = "{}";
const char* const description_chaotic_good_send_supported_features =
    "Send supported features in chaotic good settings frames.";
const char* const additional_constraints_chaotic_good_send_supported_features =
    "{}";
const char* const description_error_flatten =
    "Flatten errors to ordinary absl::Status form.";
const char* const additional_constraints_error_flatten = "{}";
const char* const description_event_engine_client =
    "Use EventEngine clients instead of iomgr's grpc_tcp_client";
const char* const additional_constraints_event_engine_client = "{}";
const char* const description_event_engine_dns =
    "If set, use EventEngine DNSResolver for client channel resolution";
const char* const additional_constraints_event_engine_dns = "{}";
const char* const description_event_engine_dns_non_client_channel =
    "If set, use EventEngine DNSResolver in other places besides client "
    "channel.";
const char* const additional_constraints_event_engine_dns_non_client_channel =
    "{}";
const char* const description_event_engine_fork =
    "Enables event engine fork handling, including onfork events and file "
    "descriptor generations";
const char* const additional_constraints_event_engine_fork = "{}";
const char* const description_event_engine_listener =
    "Use EventEngine listeners instead of iomgr's grpc_tcp_server";
const char* const additional_constraints_event_engine_listener = "{}";
const char* const description_event_engine_callback_cq =
    "Use EventEngine instead of the CallbackAlternativeCQ.";
const char* const additional_constraints_event_engine_callback_cq = "{}";
const uint8_t required_experiments_event_engine_callback_cq[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_event_engine_for_all_other_endpoints =
    "Use EventEngine endpoints for all call sites, including direct uses of "
    "grpc_tcp_create.";
const char* const additional_constraints_event_engine_for_all_other_endpoints =
    "{}";
const uint8_t required_experiments_event_engine_for_all_other_endpoints[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineDns),
    static_cast<uint8_t>(
        grpc_core::kExperimentIdEventEngineDnsNonClientChannel),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_event_engine_poller_for_python =
    "Enable event engine poller in gRPC Python";
const char* const additional_constraints_event_engine_poller_for_python = "{}";
const char* const description_fail_recv_metadata_on_deadline_exceeded =
    "Fail recv initial metadata when the deadline is exceeded.";
const char* const
    additional_constraints_fail_recv_metadata_on_deadline_exceeded = "{}";
const char* const description_free_large_allocator =
    "If set, return all free bytes from a \042big\042 allocator";
const char* const additional_constraints_free_large_allocator = "{}";
const char* const description_fuse_filters =
    "If set, individual filters are merged into fused filters";
const char* const additional_constraints_fuse_filters = "{}";
const char* const description_keep_alive_ping_timer_batch =
    "Avoid explicitly cancelling the keepalive timer. Instead adjust the "
    "callback to re-schedule itself to the next ping interval.";
const char* const additional_constraints_keep_alive_ping_timer_batch = "{}";
const char* const description_local_connector_secure =
    "Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP "
    "connections.";
const char* const additional_constraints_local_connector_secure = "{}";
const char* const description_max_inflight_pings_strict_limit =
    "If set, the max inflight pings limit is strictly enforced.";
const char* const additional_constraints_max_inflight_pings_strict_limit = "{}";
const char* const description_metadata_publish_to_app_tag =
    "Publish metadata to the app using the kPublishToApp metadata field.";
const char* const additional_constraints_metadata_publish_to_app_tag = "{}";
const char* const description_monitoring_experiment =
    "Placeholder experiment to prove/disprove our monitoring is working";
const char* const additional_constraints_monitoring_experiment = "{}";
const char* const description_multiping =
    "Allow more than one ping to be in flight at a time by default.";
const char* const additional_constraints_multiping = "{}";
const char* const description_otel_export_telemetry_domains =
    "Export telemetry domains in OpenTelemetry metrics.";
const char* const additional_constraints_otel_export_telemetry_domains = "{}";
const char* const description_pick_first_ignore_empty_updates =
    "Ignore empty resolutions in pick_first";
const char* const additional_constraints_pick_first_ignore_empty_updates = "{}";
const char* const description_pick_first_ready_to_connecting =
    "When the subchannel goes from READY to CONNECTING or TRANSIENT_FAILURE, "
    "pick_first goes to CONNECTING and starts a new Happy Eyeballs pass.";
const char* const additional_constraints_pick_first_ready_to_connecting = "{}";
const char* const description_pipelined_read_secure_endpoint =
    "Enable pipelined reads for EventEngine secure endpoints";
const char* const additional_constraints_pipelined_read_secure_endpoint = "{}";
const uint8_t required_experiments_pipelined_read_secure_endpoint[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_pollset_alternative =
    "Code outside iomgr that relies directly on pollsets will use non-pollset "
    "alternatives when enabled.";
const char* const additional_constraints_pollset_alternative = "{}";
const uint8_t required_experiments_pollset_alternative[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_prioritize_finished_requests =
    "Prioritize flushing out finished requests over other in-flight requests "
    "during transport writes.";
const char* const additional_constraints_prioritize_finished_requests = "{}";
const char* const description_promise_based_http2_client_transport =
    "Use promises for the http2 client transport. We have kept client and "
    "server transport experiments separate to help with smoother roll outs and "
    "also help with interop testing.";
const char* const additional_constraints_promise_based_http2_client_transport =
    "{}";
const char* const description_promise_based_http2_server_transport =
    "Use promises for the http2 server transport. We have kept client and "
    "server transport experiments separate to help with smoother roll outs and "
    "also help with interop testing.";
const char* const additional_constraints_promise_based_http2_server_transport =
    "{}";
const char* const description_promise_based_inproc_transport =
    "Use promises for the in-process transport.";
const char* const additional_constraints_promise_based_inproc_transport = "{}";
const char* const description_promise_filter_send_cancel_metadata =
    "Enables sending all trailing metadata fields from server side "
    "promise-based filters upon stream cancellation.";
const char* const additional_constraints_promise_filter_send_cancel_metadata =
    "{}";
const char* const description_retry_in_callv3 = "Support retries with call-v3";
const char* const additional_constraints_retry_in_callv3 = "{}";
const char* const description_return_preexisting_errors =
    "Return errors that exist before the start of the call in RunHandler.";
const char* const additional_constraints_return_preexisting_errors = "{}";
const char* const description_rr_wrr_connect_from_random_index =
    "RR and WRR LB policies start connecting from a random index in the "
    "address list.";
const char* const additional_constraints_rr_wrr_connect_from_random_index =
    "{}";
const char* const description_schedule_cancellation_over_write =
    "Allow cancellation op to be scheduled over a write";
const char* const additional_constraints_schedule_cancellation_over_write =
    "{}";
const char* const description_secure_endpoint_offload_large_reads =
    "If a large read needs to be decrypted, use a separate thread.";
const char* const additional_constraints_secure_endpoint_offload_large_reads =
    "{}";
const uint8_t required_experiments_secure_endpoint_offload_large_reads[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_secure_endpoint_offload_large_writes =
    "If a large read write to be encrypted, use a separate thread.";
const char* const additional_constraints_secure_endpoint_offload_large_writes =
    "{}";
const uint8_t required_experiments_secure_endpoint_offload_large_writes[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_secure_endpoint_read_coalescing =
    "Coalesce decrypted bytes in SecureEndpoint if a read_hint is provided.";
const char* const additional_constraints_secure_endpoint_read_coalescing = "{}";
const uint8_t required_experiments_secure_endpoint_read_coalescing[] = {
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineClient),
    static_cast<uint8_t>(grpc_core::kExperimentIdEventEngineListener)};
const char* const description_skip_clear_peer_on_cancellation =
    "If set, skips clearing of peer string on call cancellation.";
const char* const additional_constraints_skip_clear_peer_on_cancellation = "{}";
const char* const description_sleep_promise_exec_ctx_removal =
    "If set, polling the sleep promise does not rely on the ExecCtx.";
const char* const additional_constraints_sleep_promise_exec_ctx_removal = "{}";
const char* const description_sleep_use_non_owning_waker =
    "If set, the sleep promise uses a non-owning waker.";
const char* const additional_constraints_sleep_use_non_owning_waker = "{}";
const char* const description_subchannel_connection_scaling =
    "Subchannel connection scaling support.";
const char* const additional_constraints_subchannel_connection_scaling = "{}";
const char* const description_subchannel_wrapper_cleanup_on_orphan =
    "Fixes the subchannel wrapper to drop any non-cancelled watchers when it "
    "gets orphaned.";
const char* const additional_constraints_subchannel_wrapper_cleanup_on_orphan =
    "{}";
const char* const description_tcp_frame_size_tuning =
    "If set, enables TCP to use RPC size estimation made by higher layers. TCP "
    "would not indicate completion of a read operation until a specified "
    "number of bytes have been read over the socket. Buffers are also "
    "allocated according to estimated RPC sizes.";
const char* const additional_constraints_tcp_frame_size_tuning = "{}";
const char* const description_tcp_rcv_lowat =
    "Use SO_RCVLOWAT to avoid wakeups on the read path.";
const char* const additional_constraints_tcp_rcv_lowat = "{}";
const char* const description_tsi_frame_protector_without_locks =
    "Do not hold locks while using the tsi_frame_protector.";
const char* const additional_constraints_tsi_frame_protector_without_locks =
    "{}";
const char* const description_unconstrained_max_quota_buffer_size =
    "Discard the cap on the max free pool size for one memory allocator";
const char* const additional_constraints_unconstrained_max_quota_buffer_size =
    "{}";
const char* const description_use_call_event_engine_in_completion_queue =
    "Use the call event engine to run callbacks in completion queue.";
const char* const
    additional_constraints_use_call_event_engine_in_completion_queue = "{}";
const char* const description_wildcard_ip_expansion_restriction =
    "If set, adds optional restriction on when to expand wildcard IPs.";
const char* const additional_constraints_wildcard_ip_expansion_restriction =
    "{}";
const char* const description_xds_channel_filter_chain_per_route =
    "xDS channels use a separate filter chain for each route.";
const char* const additional_constraints_xds_channel_filter_chain_per_route =
    "{}";
}  // namespace

namespace grpc_core {

const ExperimentMetadata g_experiment_metadata[] = {
    {"buffer_list_deletion_prep", description_buffer_list_deletion_prep,
     additional_constraints_buffer_list_deletion_prep, nullptr, 0, false, true},
    {"call_tracer_in_transport", description_call_tracer_in_transport,
     additional_constraints_call_tracer_in_transport, nullptr, 0, true, false},
    {"call_tracer_send_initial_metadata_is_an_annotation",
     description_call_tracer_send_initial_metadata_is_an_annotation,
     additional_constraints_call_tracer_send_initial_metadata_is_an_annotation,
     nullptr, 0, true, true},
    {"call_tracer_send_trailing_metadata_is_an_annotation",
     description_call_tracer_send_trailing_metadata_is_an_annotation,
     additional_constraints_call_tracer_send_trailing_metadata_is_an_annotation,
     nullptr, 0, false, true},
    {"chaotic_good_connect_deadline", description_chaotic_good_connect_deadline,
     additional_constraints_chaotic_good_connect_deadline, nullptr, 0, true,
     true},
    {"chaotic_good_framing_layer", description_chaotic_good_framing_layer,
     additional_constraints_chaotic_good_framing_layer, nullptr, 0, true,
     false},
    {"chaotic_good_send_supported_features",
     description_chaotic_good_send_supported_features,
     additional_constraints_chaotic_good_send_supported_features, nullptr, 0,
     false, true},
    {"error_flatten", description_error_flatten,
     additional_constraints_error_flatten, nullptr, 0, false, false},
    {"event_engine_client", description_event_engine_client,
     additional_constraints_event_engine_client, nullptr, 0, true, false},
    {"event_engine_dns", description_event_engine_dns,
     additional_constraints_event_engine_dns, nullptr, 0, true, false},
    {"event_engine_dns_non_client_channel",
     description_event_engine_dns_non_client_channel,
     additional_constraints_event_engine_dns_non_client_channel, nullptr, 0,
     true, false},
    {"event_engine_fork", description_event_engine_fork,
     additional_constraints_event_engine_fork, nullptr, 0, true, false},
    {"event_engine_listener", description_event_engine_listener,
     additional_constraints_event_engine_listener, nullptr, 0, true, false},
    {"event_engine_callback_cq", description_event_engine_callback_cq,
     additional_constraints_event_engine_callback_cq,
     required_experiments_event_engine_callback_cq, 2, true, true},
    {"event_engine_for_all_other_endpoints",
     description_event_engine_for_all_other_endpoints,
     additional_constraints_event_engine_for_all_other_endpoints,
     required_experiments_event_engine_for_all_other_endpoints, 4, true, false},
    {"event_engine_poller_for_python",
     description_event_engine_poller_for_python,
     additional_constraints_event_engine_poller_for_python, nullptr, 0, true,
     true},
    {"fail_recv_metadata_on_deadline_exceeded",
     description_fail_recv_metadata_on_deadline_exceeded,
     additional_constraints_fail_recv_metadata_on_deadline_exceeded, nullptr, 0,
     false, false},
    {"free_large_allocator", description_free_large_allocator,
     additional_constraints_free_large_allocator, nullptr, 0, false, true},
    {"fuse_filters", description_fuse_filters,
     additional_constraints_fuse_filters, nullptr, 0, false, false},
    {"keep_alive_ping_timer_batch", description_keep_alive_ping_timer_batch,
     additional_constraints_keep_alive_ping_timer_batch, nullptr, 0, false,
     true},
    {"local_connector_secure", description_local_connector_secure,
     additional_constraints_local_connector_secure, nullptr, 0, false, true},
    {"max_inflight_pings_strict_limit",
     description_max_inflight_pings_strict_limit,
     additional_constraints_max_inflight_pings_strict_limit, nullptr, 0, true,
     true},
    {"metadata_publish_to_app_tag", description_metadata_publish_to_app_tag,
     additional_constraints_metadata_publish_to_app_tag, nullptr, 0, true,
     true},
    {"monitoring_experiment", description_monitoring_experiment,
     additional_constraints_monitoring_experiment, nullptr, 0, true, true},
    {"multiping", description_multiping, additional_constraints_multiping,
     nullptr, 0, false, true},
    {"otel_export_telemetry_domains", description_otel_export_telemetry_domains,
     additional_constraints_otel_export_telemetry_domains, nullptr, 0, false,
     true},
    {"pick_first_ignore_empty_updates",
     description_pick_first_ignore_empty_updates,
     additional_constraints_pick_first_ignore_empty_updates, nullptr, 0, false,
     true},
    {"pick_first_ready_to_connecting",
     description_pick_first_ready_to_connecting,
     additional_constraints_pick_first_ready_to_connecting, nullptr, 0, true,
     true},
    {"pipelined_read_secure_endpoint",
     description_pipelined_read_secure_endpoint,
     additional_constraints_pipelined_read_secure_endpoint,
     required_experiments_pipelined_read_secure_endpoint, 2, false, false},
    {"pollset_alternative", description_pollset_alternative,
     additional_constraints_pollset_alternative,
     required_experiments_pollset_alternative, 2, false, false},
    {"prioritize_finished_requests", description_prioritize_finished_requests,
     additional_constraints_prioritize_finished_requests, nullptr, 0, false,
     true},
    {"promise_based_http2_client_transport",
     description_promise_based_http2_client_transport,
     additional_constraints_promise_based_http2_client_transport, nullptr, 0,
     false, true},
    {"promise_based_http2_server_transport",
     description_promise_based_http2_server_transport,
     additional_constraints_promise_based_http2_server_transport, nullptr, 0,
     false, true},
    {"promise_based_inproc_transport",
     description_promise_based_inproc_transport,
     additional_constraints_promise_based_inproc_transport, nullptr, 0, false,
     false},
    {"promise_filter_send_cancel_metadata",
     description_promise_filter_send_cancel_metadata,
     additional_constraints_promise_filter_send_cancel_metadata, nullptr, 0,
     false, true},
    {"retry_in_callv3", description_retry_in_callv3,
     additional_constraints_retry_in_callv3, nullptr, 0, false, true},
    {"return_preexisting_errors", description_return_preexisting_errors,
     additional_constraints_return_preexisting_errors, nullptr, 0, false, true},
    {"rr_wrr_connect_from_random_index",
     description_rr_wrr_connect_from_random_index,
     additional_constraints_rr_wrr_connect_from_random_index, nullptr, 0, true,
     true},
    {"schedule_cancellation_over_write",
     description_schedule_cancellation_over_write,
     additional_constraints_schedule_cancellation_over_write, nullptr, 0, false,
     true},
    {"secure_endpoint_offload_large_reads",
     description_secure_endpoint_offload_large_reads,
     additional_constraints_secure_endpoint_offload_large_reads,
     required_experiments_secure_endpoint_offload_large_reads, 2, false, true},
    {"secure_endpoint_offload_large_writes",
     description_secure_endpoint_offload_large_writes,
     additional_constraints_secure_endpoint_offload_large_writes,
     required_experiments_secure_endpoint_offload_large_writes, 2, false, true},
    {"secure_endpoint_read_coalescing",
     description_secure_endpoint_read_coalescing,
     additional_constraints_secure_endpoint_read_coalescing,
     required_experiments_secure_endpoint_read_coalescing, 2, false, true},
    {"skip_clear_peer_on_cancellation",
     description_skip_clear_peer_on_cancellation,
     additional_constraints_skip_clear_peer_on_cancellation, nullptr, 0, false,
     true},
    {"sleep_promise_exec_ctx_removal",
     description_sleep_promise_exec_ctx_removal,
     additional_constraints_sleep_promise_exec_ctx_removal, nullptr, 0, false,
     true},
    {"sleep_use_non_owning_waker", description_sleep_use_non_owning_waker,
     additional_constraints_sleep_use_non_owning_waker, nullptr, 0, true, true},
    {"subchannel_connection_scaling", description_subchannel_connection_scaling,
     additional_constraints_subchannel_connection_scaling, nullptr, 0, false,
     true},
    {"subchannel_wrapper_cleanup_on_orphan",
     description_subchannel_wrapper_cleanup_on_orphan,
     additional_constraints_subchannel_wrapper_cleanup_on_orphan, nullptr, 0,
     false, true},
    {"tcp_frame_size_tuning", description_tcp_frame_size_tuning,
     additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true},
    {"tcp_rcv_lowat", description_tcp_rcv_lowat,
     additional_constraints_tcp_rcv_lowat, nullptr, 0, false, true},
    {"tsi_frame_protector_without_locks",
     description_tsi_frame_protector_without_locks,
     additional_constraints_tsi_frame_protector_without_locks, nullptr, 0,
     false, true},
    {"unconstrained_max_quota_buffer_size",
     description_unconstrained_max_quota_buffer_size,
     additional_constraints_unconstrained_max_quota_buffer_size, nullptr, 0,
     false, true},
    {"use_call_event_engine_in_completion_queue",
     description_use_call_event_engine_in_completion_queue,
     additional_constraints_use_call_event_engine_in_completion_queue, nullptr,
     0, false, true},
    {"wildcard_ip_expansion_restriction",
     description_wildcard_ip_expansion_restriction,
     additional_constraints_wildcard_ip_expansion_restriction, nullptr, 0,
     false, true},
    {"xds_channel_filter_chain_per_route",
     description_xds_channel_filter_chain_per_route,
     additional_constraints_xds_channel_filter_chain_per_route, nullptr, 0,
     true, true},
};

}  // namespace grpc_core
#endif
#endif
