junrao commented on code in PR #22620:
URL: https://github.com/apache/kafka/pull/22620#discussion_r3716031553


##########
raft/src/main/java/org/apache/kafka/raft/internals/UpdateVoterHandler.java:
##########
@@ -219,56 +424,116 @@ private Optional<VoterSet> updateVoters(
             voters.updateVoterIgnoringDirectoryId(updatedVoter);
     }
 
-    private CompletionStage<UpdateRaftVoterResponseData> storeUpdatedVoters(
+    private void storeUpdatedVoters(
         LeaderState<?> leaderState,
-        ReplicaKey voterKey,
+        UpdateVoterHandlerState current,
         Optional<KRaftVersionUpgrade.Voters> inMemoryVoters,
         VoterSet newVoters,
-        ListenerName requestListenerName,
         long currentTimeMs
     ) {
+        var changeVoterState = leaderState.changeVoterState();
+
         if (inMemoryVoters.isEmpty()) {
-            // Since the partition support reconfig then just write the update 
voter set directly to the log
-            leaderState.appendVotersRecord(newVoters, currentTimeMs);
+            /* Since the partition supports reconfig, write the updated voter 
set directly to the log.
+             *
+             * Complete the RPC but don't reset the handler state. This allows 
the follower to send a FETCH
+             * request and help to commit the voter set change.
+             */
+            current.setLastOffset(leaderState.appendVotersRecord(newVoters, 
currentTimeMs));
+            current.completeFuture(
+                RaftUtil.updateVoterResponse(
+                    Errors.NONE,
+                    current.requestListenerName(),
+                    leaderState.leaderAndEpoch(),
+                    leaderState.leaderEndpoints()
+                )
+            );
         } else {
             // Store the new voters set in the leader state since it cannot be 
written to the log
             var successful = leaderState.compareAndSetVolatileVoters(
                 inMemoryVoters.get(),
                 new KRaftVersionUpgrade.Voters(newVoters)
             );
             if (successful) {
-                log.info(
+                logger.info(
                     "Updated in-memory voters from {} to {}",
                     inMemoryVoters.get().voters(),
                     newVoters
                 );
+
+                // Reset the check quorum state since the leader received a 
successful request
+                
leaderState.updateCheckQuorumForFollowingVoter(current.voterKey(), 
currentTimeMs);

Review Comment:
   This used to happen when inMemoryVoters.isEmpty() is true too. Is it 
intentional to omit it now?



##########
raft/src/main/java/org/apache/kafka/raft/internals/UpdateVoterHandler.java:
##########
@@ -155,50 +192,218 @@ public CompletionStage<UpdateRaftVoterResponseData> 
handleUpdateVoterRequest(
             );
         }
 
-        // Check that endpoints includes the default listener
-        if (voterEndpoints.address(defaultListenerName).isEmpty()) {
+        // Send API_VERSIONS request to new voter to test new default endpoint

Review Comment:
   Claude found the following. Is that a real issue?
   
   Routine UpdateVoter traffic can block admin voter changes
   UpdateVoter is periodic at fetchTimeoutMs (default 2000 ms, 
FollowerState.java:157-161), has no backoff on failure (the timer resets when 
the request is sent, KafkaRaftClient.java:3352; only NONE/UNSUPPORTED_VERSION 
set hasUpdatedLeader, :2596-2602), and now holds the exclusive slot for an 
API_VERSIONS round trip bounded by the request timeout (also 2000 ms). 
isOperationPending (ChangeVoterHandlerState.java:318) now includes the update 
state, so AddVoter/RemoveVoter get REQUEST_TIMED_OUT.
   
   A voter advertising an endpoint the leader can't reach retries every 2 s 
forever with a near-100% duty cycle on the slot — and the operator's remedy 
(remove-controller) is exactly what's blocked. Both timers are fixed with no 
jitter, so they can beat against each other.



##########
raft/src/main/java/org/apache/kafka/raft/internals/UpdateVoterHandler.java:
##########
@@ -155,50 +140,193 @@ public CompletionStage<UpdateRaftVoterResponseData> 
handleUpdateVoterRequest(
             );
         }
 
-        // Check that endpoints includes the default listener
-        if (voterEndpoints.address(defaultListenerName).isEmpty()) {
+        // Send API_VERSIONS request to new voter to test new default endpoint
+        var timeout = requestSender.send(
+            voterEndpoints
+                .address(requestSender.listenerName())
+                .map(address -> new Node(voterKey.id(), address.getHostName(), 
address.getPort()))
+                .orElseThrow(
+                    () -> new IllegalStateException(
+                        String.format(
+                            "Provided listeners %s do not contain a listener 
for %s",
+                            voterEndpoints,
+                            requestSender.listenerName()
+                        )
+                    )
+                ),
+            this::buildApiVersionsRequest,
+            currentTimeMs
+        );
+        if (timeout.isEmpty()) {
             return CompletableFuture.completedFuture(
                 RaftUtil.updateVoterResponse(
-                    Errors.INVALID_REQUEST,
+                    Errors.REQUEST_TIMED_OUT,
                     requestListenerName,
                     leaderState.leaderAndEpoch(),
                     leaderState.leaderEndpoints()
                 )
             );
         }
 
+        var state = new UpdateVoterHandlerState(
+            voterKey,
+            voterEndpoints,
+            requestListenerName,
+            new SupportedVersionRange(
+                supportedKraftVersions.minSupportedVersion(),
+                supportedKraftVersions.maxSupportedVersion()
+            ),
+            time.timer(timeout.getAsLong())
+        );
+        changeVoterState.resetUpdateVoterHandlerState(
+            Errors.UNKNOWN_SERVER_ERROR,
+            leaderState.leaderAndEpoch(),
+            leaderState.leaderEndpoints(),
+            Optional.of(state)
+        );
+
+        return state.future();
+    }
+
+    /**
+     * Handle the API_VERSIONS response for an update voter operation.
+     *
+     * @param leaderState the leader state
+     * @param source the node that sent the response
+     * @param error the error from the response
+     * @param supportedKraftVersions the supported kraft version range from 
the response
+     * @param currentTimeMs the current time in milliseconds
+     * @return true if the update voter operation should continue, false if it 
was aborted
+     */
+    public boolean handleApiVersionsResponse(
+        LeaderState<?> leaderState,
+        Node source,
+        Errors error,
+        Optional<ApiVersionsResponseData.SupportedFeatureKey> 
supportedKraftVersions,
+        long currentTimeMs
+    ) {
+        var changeVoterState = leaderState.changeVoterState();
+        var handlerState = changeVoterState.updateVoterHandlerState();
+        if (handlerState.isEmpty()) {
+            // There are no pending add operation just ignore the api response
+            return true;
+        }
+
+        // Check that the API_VERSIONS response matches the id of the voter 
getting added
+        var current = handlerState.get();
+        if (!current.expectingApiResponse(source.id())) {
+            logger.info(
+                "API_VERSIONS response is not expected from {}: voterKey is 
{}, lastOffset is {}",
+                source,
+                current.voterKey(),
+                current.lastOffset()
+            );
+
+            return true;
+        } else if (error != Errors.NONE) {
+            // Abort operation if the API_VERSIONS returned an error
+            logger.info(
+                "Aborting update voter operation for {} at {} since 
API_VERSIONS returned an error {}",
+                current.voterKey(),
+                current.voterEndpoints(),
+                error
+            );
+
+            changeVoterState.resetUpdateVoterHandlerState(
+                Errors.REQUEST_TIMED_OUT,
+                leaderState.leaderAndEpoch(),
+                leaderState.leaderEndpoints(),
+                Optional.empty()
+            );
+
+            return false;
+        } else if (
+            !Optional.of(current.supportedKraftVersions())
+                
.equals(supportedKraftVersions.map(this::convertToVersionRange))

Review Comment:
   Claude reported a potential issue on this in the future. 
   
   <h2 class="mt-6 mb-2 font-semibold text-2xl" data-streamdown="heading-2" 
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; 
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; 
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: 
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; 
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; 
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; 
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; 
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); 
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; 
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; 
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; 
--tw-backdrop-brightness: ; --tw-backdrop
 -contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; 
--tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; 
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; 
--tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box; 
border-width: 0px; border-style: solid; border-color: rgb(229, 231, 235); 
font-size: 1.5em; font-weight: 600; margin: 0px; padding: 0.8em 0px 0.4em; 
line-height: 1.6; --tw-space-y-reverse: 0; color: rgb(255, 255, 255); 
font-family: -apple-system, &quot;system-ui&quot;, &quot;Segoe UI&quot;, 
Roboto, sans-serif; font-style: normal; font-variant-ligatures: normal; 
font-variant-caps: normal; letter-spacing: normal; orphans: 2; text-align: 
start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; 
-webkit-text-stroke-width: 0px; white-space: normal; background-color: rgb(26, 
26, 26); text-decoration-thickness: initial; text-decoration-style: initial; 
text-decoration-color: initial;">1. Latent fata
 l crash: the version-range equality check will kill every voter when 
kraft.version 2 lands</h2><p style="--tw-border-spacing-x: 0; 
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; 
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: 
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; 
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; 
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; 
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brig
 htness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; 
--tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; 
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; 
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing: 
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231, 
235); margin: 0px; line-height: 1.6; --tw-space-y-reverse: 0; color: rgb(255, 
255, 255); font-family: -apple-system, &quot;system-ui&quot;, &quot;Segoe 
UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; 
font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; 
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; 
text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 
0px; white-space: normal; background-color: rgb(26, 26, 26); 
text-decoration-thickness: initial; text-decoration-style: initial; 
text-decoration-color: initial;"><code class="round
 ed bg-muted px-1.5 py-0.5 font-mono text-sm" data-streamdown="inline-code" 
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; 
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; 
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: 
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; 
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; 
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; 
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; 
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); 
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; 
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; 
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; 
--tw-backdrop-brightness: ; --tw-backdrop
 -contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; 
--tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; 
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; 
--tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box; 
border-width: 0px; border-style: solid; border-color: rgb(229, 231, 235); 
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 
&quot;Liberation Mono&quot;, &quot;Courier New&quot;, monospace; 
font-feature-settings: normal; font-variation-settings: normal; font-size: 
0.875rem; font-weight: 500; border-radius: 0.25rem; padding: 0.125rem 0.375rem; 
line-height: 1.25rem; background: none 0% 0% / auto repeat scroll padding-box 
border-box rgba(127, 251, 255, 0.17) !important; color: rgba(127, 251, 255, 
0.8) !important; direction: ltr; text-align: left; unicode-bidi: 
isolate;">UpdateVoterHandler.java:304-323</code><span> </span>aborts with<span> 
</span><code class="rounded bg-muted px-1.5 py-0.5 font-
 mono text-sm" data-streamdown="inline-code" style="--tw-border-spacing-x: 0; 
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; 
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: 
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; 
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; 
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; 
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; 
--tw-backdrop-contrast: ; --tw-backdrop-gray
 scale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; 
--tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; 
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; 
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style: 
solid; border-color: rgb(229, 231, 235); font-family: ui-monospace, 
SFMono-Regular, Menlo, Monaco, Consolas, &quot;Liberation Mono&quot;, 
&quot;Courier New&quot;, monospace; font-feature-settings: normal; 
font-variation-settings: normal; font-size: 0.875rem; font-weight: 500; 
border-radius: 0.25rem; padding: 0.125rem 0.375rem; line-height: 1.25rem; 
background: none 0% 0% / auto repeat scroll padding-box border-box rgba(127, 
251, 255, 0.17) !important; color: rgba(127, 251, 255, 0.8) !important; 
direction: ltr; text-align: left; unicode-bidi: 
isolate;">INVALID_REQUEST</code><span> </span>when the API_VERSIONS range 
isn't<span> </span><code class="rounded bg-muted px-1.5 py-0.5 font-mono 
text-sm" data-stream
 down="inline-code" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; 
--tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; 
--tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; 
--tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; 
--tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; 
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; 
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; 
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; 
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hu
 e-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; 
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; 
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing: 
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231, 
235); font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 
&quot;Liberation Mono&quot;, &quot;Courier New&quot;, monospace; 
font-feature-settings: normal; font-variation-settings: normal; font-size: 
0.875rem; font-weight: 500; border-radius: 0.25rem; padding: 0.125rem 0.375rem; 
line-height: 1.25rem; background: none 0% 0% / auto repeat scroll padding-box 
border-box rgba(127, 251, 255, 0.17) !important; color: rgba(127, 251, 255, 
0.8) !important; direction: ltr; text-align: left; unicode-bidi: 
isolate;">equals()</code><span> </span>to the range from the UpdateVoter 
request. Those two values come from<span> </span><span class="font-semibold" 
data-streamdown="strong" style="--tw-borde
 r-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; 
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; 
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: 
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; 
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; 
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; 
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; 
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); 
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; 
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; 
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; 
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: 
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; 
 --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; 
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; 
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style: 
solid; border-color: rgb(229, 231, 235); font-weight: 600;">different sources 
on the same node</span>:</p><div class="my-4 flex flex-col space-y-2" 
data-streamdown="table-wrapper" style="--tw-border-spacing-x: 0; 
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; 
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: 
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-of
 fset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; 
--tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: 
; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; 
--tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; 
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: 
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; 
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; 
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing: 
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231, 
235); padding: 0.5em 0px; overflow-x: auto; margin-top: 0px; margin-bottom: 
0px; display: flex; flex-direction: column; --tw-space-y-reverse: 0; color: 
rgb(255, 255, 255); font-family: -apple-system, &quot;system-ui&quot;, 
&quot;Segoe UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; 
font-variant-ligatures: n
 ormal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; 
orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 
2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; 
background-color: rgb(26, 26, 26); text-decoration-thickness: initial; 
text-decoration-style: initial; text-decoration-color: initial;"><div 
class="flex items-center justify-end gap-1" style="--tw-border-spacing-x: 0; 
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; 
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: 
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .
 5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; 
--tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; 
--tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; 
--tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; 
--tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; 
--tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; 
--tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; 
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; 
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style: 
solid; border-color: rgb(229, 231, 235); display: flex; align-items: center; 
justify-content: flex-end; gap: 0.25rem;"><div class="relative" 
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; 
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; 
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan
 -y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; 
--tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; 
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; 
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; 
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; 
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: 
; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; 
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; 
--tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box; bo
 rder-width: 0px; border-style: solid; border-color: rgb(229, 231, 235); 
position: relative;"><button class="cursor-pointer p-1 text-muted-foreground 
transition-all hover:text-foreground disabled:cursor-not-allowed 
disabled:opacity-50" title="Copy table" type="button" 
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; 
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; 
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: 
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; 
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; 
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; 
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; 
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); 
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brig
 htness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; 
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; 
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: 
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; 
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; 
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing: 
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231, 
235); font-family: inherit; font-feature-settings: inherit; 
font-variation-settings: inherit; font-size: 13px; font-weight: inherit; 
line-height: inherit; letter-spacing: inherit; color: inherit; margin: 0px; 
padding: 0.25rem; text-transform: none; appearance: button; background-color: 
transparent; background-image: none; cursor: pointer; transition-property: all; 
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 
0.15s;"><svg
  color="currentColor" height="16" stroke-linejoin="round" viewBox="0 0 16 16" 
width="16" size="14"><path clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 
1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 
2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 
2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 
4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 
14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 
6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 
13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" 
fill="currentColor" fill-rule="evenodd"></path></svg></button></div><div 
class="relative" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; 
--tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; 
--tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; 
--tw-pi
 nch-zoom: ; --tw-scroll-snap-strictness: proximity; 
--tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; 
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; 
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; 
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; 
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: 
; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; 
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; 
--tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box; 
border-width: 0
 px; border-style: solid; border-color: rgb(229, 231, 235); position: 
relative;"><button class="cursor-pointer p-1 text-muted-foreground 
transition-all hover:text-foreground disabled:cursor-not-allowed 
disabled:opacity-50" title="Download table" type="button" 
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; 
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; 
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: 
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; 
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; 
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; 
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; 
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); 
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ;
  --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; 
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; 
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: 
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; 
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; 
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing: 
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231, 
235); font-family: inherit; font-feature-settings: inherit; 
font-variation-settings: inherit; font-size: 13px; font-weight: inherit; 
line-height: inherit; letter-spacing: inherit; color: inherit; margin: 0px; 
padding: 0.25rem; text-transform: none; appearance: button; background-color: 
transparent; background-image: none; cursor: pointer; transition-property: all; 
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 
0.15s;"><svg color="c
 urrentColor" height="16" stroke-linejoin="round" viewBox="0 0 16 16" 
width="16" size="14"><path clip-rule="evenodd" d="M8.75 1V1.75V8.68934L10.7197 
6.71967L11.25 6.18934L12.3107 7.25L11.7803 7.78033L8.70711 10.8536C8.31658 
11.2441 7.68342 11.2441 7.29289 10.8536L4.21967 7.78033L3.68934 7.25L4.75 
6.18934L5.28033 6.71967L7.25 8.68934V1.75V1H8.75ZM13.5 
9.25V13.5H2.5V9.25V8.5H1V9.25V14C1 14.5523 1.44771 15 2 15H14C14.5523 15 15 
14.5523 15 14V9.25V8.5H13.5V9.25Z" fill="currentColor" 
fill-rule="evenodd"></path></svg></button></div></div><div 
class="overflow-x-auto" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 
0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; 
--tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; 
--tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; 
--tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeri
 c-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; 
--tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: 
rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 
#0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; 
--tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; 
--tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; 
--tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; 
--tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; 
--tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; 
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; 
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style: 
solid; border-color: rgb(229, 231, 235); overflow-x: auto; 
--tw-space-y-reverse: 0; margin-top: 6.5px; margin-bottom: 0px;">
     | Source | Value
   -- | -- | --
   UpdateVoter request | Feature.KRAFT_VERSION.supportedVersionRange() 
(KafkaRaftManager.scala:180) | (minimumProduction, latestTesting) — 
Feature.java:130-135
   API_VERSIONS response | 
BrokerFeatures.defaultSupportedFeatures(enableUnstable) | caps at 
latestProduction unless unstable is enabled
   
   </div></div><p style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; 
--tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; 
--tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; 
--tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; 
--tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; 
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; 
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; 
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; 
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-
 rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; 
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; 
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing: 
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231, 
235); margin: 0px; line-height: 1.6; --tw-space-y-reverse: 0; color: rgb(255, 
255, 255); font-family: -apple-system, &quot;system-ui&quot;, &quot;Segoe 
UI&quot;, Roboto, sans-serif; font-size: 13px; font-style: normal; 
font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; 
letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; 
text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 
0px; white-space: normal; background-color: rgb(26, 26, 26); 
text-decoration-thickness: initial; text-decoration-style: initial; 
text-decoration-color: initial;">Today they coincide —<span> </span><code 
class="rounded bg-muted px-1.5 py-0.5 font-mono text-sm
 " data-streamdown="inline-code" style="--tw-border-spacing-x: 0; 
--tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; 
--tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 
1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: 
proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; 
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; 
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; 
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; 
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --t
 w-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; 
--tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; 
--tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing: 
border-box; border-width: 0px; border-style: solid; border-color: rgb(229, 231, 
235); font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 
&quot;Liberation Mono&quot;, &quot;Courier New&quot;, monospace; 
font-feature-settings: normal; font-variation-settings: normal; font-size: 
0.875rem; font-weight: 500; border-radius: 0.25rem; padding: 0.125rem 0.375rem; 
line-height: 1.25rem; background: none 0% 0% / auto repeat scroll padding-box 
border-box rgba(127, 251, 255, 0.17) !important; color: rgba(127, 251, 255, 
0.8) !important; direction: ltr; text-align: left; unicode-bidi: 
isolate;">KRaftVersion.values()</code><span> </span>is<span> </span><code 
class="rounded bg-muted px-1.5 py-0.5 font-mono text-sm" 
data-streamdown="inline-code" style="--tw-border
 -spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; 
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; 
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: 
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; 
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; 
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; 
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; 
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); 
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; 
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; 
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; 
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: 
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; -
 -tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; 
--tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; 
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style: 
solid; border-color: rgb(229, 231, 235); font-family: ui-monospace, 
SFMono-Regular, Menlo, Monaco, Consolas, &quot;Liberation Mono&quot;, 
&quot;Courier New&quot;, monospace; font-feature-settings: normal; 
font-variation-settings: normal; font-size: 0.875rem; font-weight: 500; 
border-radius: 0.25rem; padding: 0.125rem 0.375rem; line-height: 1.25rem; 
background: none 0% 0% / auto repeat scroll padding-box border-box rgba(127, 
251, 255, 0.17) !important; color: rgba(127, 251, 255, 0.8) !important; 
direction: ltr; text-align: left; unicode-bidi: isolate;">{0, 1}</code><span> 
</span>and<span> </span><code class="rounded bg-muted px-1.5 py-0.5 font-mono 
text-sm" data-streamdown="inline-code" style="--tw-border-spacing-x: 0; 
--tw-border-spacing-y: 0; --tw-translate-x: 0; --
 tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; 
--tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: 
; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; 
--tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; 
--tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; 
--tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; 
--tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / .5); 
--tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 
0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; 
--tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; 
--tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; 
--tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: 
; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; 
--tw-backdrop-saturate: ; --tw-backdrop-
 sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; 
--tw-contain-style: ; box-sizing: border-box; border-width: 0px; border-style: 
solid; border-color: rgb(229, 231, 235); font-family: ui-monospace, 
SFMono-Regular, Menlo, Monaco, Consolas, &quot;Liberation Mono&quot;, 
&quot;Courier New&quot;, monospace; font-feature-settings: normal; 
font-variation-settings: normal; font-size: 0.875rem; font-weight: 500; 
border-radius: 0.25rem; padding: 0.125rem 0.375rem; line-height: 1.25rem; 
background: none 0% 0% / auto repeat scroll padding-box border-box rgba(127, 
251, 255, 0.17) !important; color: rgba(127, 251, 255, 0.8) !important; 
direction: ltr; text-align: left; unicode-bidi: isolate;">LATEST_PRODUCTION = 
KRAFT_VERSION_1</code>, so<span> </span><code class="rounded bg-muted px-1.5 
py-0.5 font-mono text-sm" data-streamdown="inline-code" 
style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; 
--tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0
 ; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: 
; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; 
--tw-gradient-from-position: ; --tw-gradient-via-position: ; 
--tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; 
--tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; 
--tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; 
--tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-shadow: 0 0 #0000; 
--tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 
#0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; 
--tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; 
--tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; 
--tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: 
; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; 
--tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout
 : ; --tw-contain-paint: ; --tw-contain-style: ; box-sizing: border-box; 
border-width: 0px; border-style: solid; border-color: rgb(229, 231, 235); 
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 
&quot;Liberation Mono&quot;, &quot;Courier New&quot;, monospace; 
font-feature-settings: normal; font-variation-settings: normal; font-size: 
0.875rem; font-weight: 500; border-radius: 0.25rem; padding: 0.125rem 0.375rem; 
line-height: 1.25rem; background: none 0% 0% / auto repeat scroll padding-box 
border-box rgba(127, 251, 255, 0.17) !important; color: rgba(127, 251, 255, 
0.8) !important; direction: ltr; text-align: left; unicode-bidi: 
isolate;">latestTesting() == latestProduction() == 1</code>.</p>



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to